JVM学习笔记(持续更新)

JDK、JRE、JVM区别?

在这里插入图片描述

类加载过程

装载 验证 准备 解析 初始化
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

类加载器分类

在这里插入图片描述

双亲委派模型

在这里插入图片描述
如何打破双亲委派模型?
自定义类加载器,集成ClassLoader类重写loadClass,如Tomcat

JVM内存模型

JVM 需要使用计算机的内存,Java 程序运行中所处理的对象或者算法都会使用 JVM 的内
存空间,JVM 将内存区划分为 5 块,这样的结构称之为 JVM 内存模型。

JVM为什么进行内存区域的划分?

随着对象数量的增加,JVM 内存使用率也在增加,如果 JVM 内存使用率达到 100%,
则无法继续运行程序。为了让 JVM 内存可以被重复使用,我们需要进行垃圾回收。为了提高垃圾回收的效率JVM 将内存区域进行了划分

JVM内存划分

JVM 按照线程是否共享将内存首先分成两大类
线程独享区
当有当前线程能访问数据的区域,线程之间不能共享,随着线程的创建而创建,随着线程的销毁而被回收。线程存在的时间较短,一般不涉及垃圾回收
线程共享区
所有的线程都可以访问的区域,当线程被销毁的时候,共享区的数据不会被立即回收,需要等待达到垃圾回收的阈值才会进行回收。垃圾回收的优化,主要是优化的线程共享区。
在这里插入图片描述

程序计数器

程序计数器会记录当前线程执行指令的内存地址,只占用一小部分区域,只记录一个地址,故我们认为程序计数器不会出现内存溢出的问题。

本地方法栈

Java中有些代码的实现是依赖于其他非Java语言的(C++),本地方法栈存储的是非Java语句执行中产生的数据。一般我们认为本地方法栈不会出现内存溢出的问题。

虚拟机栈

存放当前线程中所声明的变量,包括基本数据类型的数据和引用数据类型的引用。
基本数据类型和引用数据类型划分的标准:

  • 基本数据类型:

  • 四类八种(byte【1字节】、short 【2】、int【4】、 long【8】 、 char【2~3根据编码】、 boolean【1】 、float【4】 、double【8】)
    变量在声明的时候就能确认占用内存的大小。
    引用数据类型将值的引用存放在虚拟机栈中,对象存放在堆内存中,引用数据类型占4个字节

  • 引用数据类型:
    (对象、数组、接口)
    变量在声明的时候,不能取人占用内存的大小。

栈帧

每个线程都会对应一个虚拟机栈,线程的每个方法都会创建一个栈帧,存放本次方法执行过程中所需要的数据。
如果一个线程中有多个方法嵌套调用,虚拟机栈会对栈帧进行压栈和出栈操作,正在执行的方法一定在栈顶,我们只能获取栈顶的栈帧,栈帧在虚拟机栈中先进后出。

栈帧的数据结构

在这里插入图片描述

  • 1、局部变量
    存放当前方法的局部变量,基本数据类型存值,引用数据类型存内存地址。
  • 2、操作数栈
    对方法中的变量提供计算的区域
  • 3、常量数据的引用
    常量数据会存放到方法区的常量池中,不管是基本数据类型还是引用数据类型。
  • 4、方法返回值的地址
    方法返回数据会存到计算机内存的寄存器中。
虚拟机栈溢出异常

在这里插入图片描述

修改虚拟机栈的内存大小设置栈帧的最大深度:-Xss 虚拟机栈内存大小。
一般栈帧深度达到3000~5000即可。
太小虚拟机栈容易溢出,太大导致每个线程内存占用过大,影响线程数量。

方法区

在 java8 之后,我们把方法区称之为元空间(MetaSpace),方法区在逻辑上属于堆的一部分,但一些具体机制和堆有所区别,如:一些 JVM 的方法区是可以不进行垃圾回收的,关闭 JVM 时才会释放方法区内存。所以方法区还有一个别名叫非堆,目的是和堆分开。
方法区会存储类信息、静态变量、常量(JDK8 之后不存放字符串常量)、本地机器指令
如果加载大量 class 文件,也会造成方法区内存溢出,如一个 tomcat 运行 20~30 个项目。

堆内存模型

JAVA 对象内存布局

在这里插入图片描述

对象头

MarkWord:一系列标记位(哈希码、分代年龄、锁状态标记等),在 64 位系统中占8 字节;
ClassPoint:对象对应的类信息的内存地址,在 64 位系统中占 8 字节。
Length:数组对象特有,表示数组长度,占 4 字节。

实例数据:

包含了对象的所有成员变量,大小由变量类型决定。
byte、boolean:1 字节
short:2 字节
char:2~3 字节
int、float:4 字节
long、double、引用数据类型:8 字节

对其填充

将对象大小填充为 8 字节的整数倍

JVM 内存溢出和垃圾回收机制

为什么要进行堆内存分区:
1、提高垃圾搜索效率;
2、垃圾回收后可以更好的利用内存空间,存放大对象;
3、尽可能减少GC次数

JVM 堆内存的划分

在这里插入图片描述
老年代:
对象会优先分配到新生代内存中,每次 GC 后没有回收的对象年龄加 1,年龄到15 还没有被回收,对象会存放到老年代内存中;如果对象较大,超过新生代内存的一半,对象也会存放到老年代区域。
新生代:
为了减少young区垃圾回收后的空间碎片,新生代又分为Eden区和两个Survivor区,且始终有一个 Suvivor 区保持闲置。对象会先存放到 Eden 区当中,Eden 区空间满了之后会进行 young 区的垃圾回收,之后将 young 区所有存活的对象复制到闲置的 Suvivor 区中,并清空 Eden 区和正在使用的 Survivor 区。

YoungGC 和 OldGC

YoungGC

新生代区域的垃圾回收称之为 YoungGC,也叫 MinorGC,Eden 区满后会触发YoungGC

OldGC

老年代区域的垃圾回收称之为 OldGC,也叫 MajorGC,OldGC 非常浪费性能,
所以我们的 JVM 调优要尽可能减少 OldGC 的次数, OldGC 往往伴随着 YoungGC。YoungGC+OldGC = FullGC

问题:

Survivor 区空间并不大,如果满了怎么办?

1、一般情况下 GC 会回收 95%的对象,且超过 15 次 GC 的对象会存放到 old区,所以 Survivor 区不容易满。
2、如果 Survivor 区满了,会触发担保机制,提前将对象存入 Old 区。

为什么需要 Survivor 区?

为了减少垃圾回收带来的空间碎片,空间碎片过多会频繁触发YoungGC。

为什么需要两块 Survivor 区?

为了减少 Survivor 区的空间碎片。

垃圾回收机制

如何判断一个对象是垃圾

在这里插入图片描述

引用计数法:

如果要操作对象,必须通过引用来进行。如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到。那么这个对象就成为可被回收的对象了。这种方式实现简单,效率较高,但是它无法解决循环引用的问题,因此在 Java 中并没有采用这种方式(Python 采用的是引用计数法)。

达性分析:

以一个GC Root对象作为起点进行搜索,如果在GC Roots和对象之间没有可达路径,以一个GC根对象作为起点进行搜索,如果在GC根和对象之间没有可达路径则称该对象是不可达的。

GC ROOT对象∶

  • 栈帧中的本地变量表中引用的对象。
    我们正在执行的方法是在顶部栈帧中,正在执行的方法所引用的对象必定是很重要的对象
  • 方法区中静态属性引用的对象。
    类中的变量,整个程序都要用的东西,很重要
  • 方法区中常量引用的对象。
    也是要一直使用的对象
  • 本地方法栈中引用的对象.
    存放的是一些非Java语言的对象

常见面试题补充

内存泄漏和内存溢出是一样的概念吗?

不一样,内存泄漏指不再使用的对象无法得到及时的回收,持续占用内存空间,造成内存空间的浪费。内存溢出指程序运行要用到的内存大于能提供的最大内存。内存无法内存泄漏很容易导致内存溢出,内存溢出不一定是内存泄漏导致的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671602.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件批量改后缀名,轻松实现TXT到DOCX格式转换,高效管理您的文件库!

文件处理与管理已成为我们日常生活和工作中不可或缺的一环。然而,面对海量的文件,如何高效地进行格式转换和管理,却成为了一道难题。今天,我们将为您揭晓一个神奇的解决方案——文件批量改后缀名功能,让您轻松实现TXT到…

2024/6/2 英语每日一段

However, they denied Hirst had been deliberately misleading, arguing that it was his “usual practice” to date physical works in a conceptual art project with the date of the project’s conception, which in the case of The Currency was 2016. Hirst and Sci…

AI大模型探索之路-实战篇13: 从对话到报告:打造能记录和分析的Agent智能数据分析平台

系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

外卖点餐系统 springboot+vue+element-ui

免费获取方式↓↓↓ 项目介绍038: http://localhost:8080/ 账号:weiguanke 123 系统登陆后展示 用户可视界面 – 登录页面 – 首页: – 店铺查找页面: 店铺查找 – 店铺页面 店铺管理者可视页面 – 店铺页面 店铺管理员…

十大排序 —— 归并排序

十大排序 —— 归并排序 归并排序分治(排序)合归并排序的性能一些小总结 我们今天继续来学习排序算法 —— 归并排序: 归并排序 归并排序(Merge Sort)是一种高效的、稳定的排序算法,它采用分治法(Divide and Conquer&#xff09…

Spring原理-IOC和AOP

概述 在此记录spring的学习内容。spring官网:https://spring.io/ 概念故事 从前,在Java的大森林中,有一片神奇的土地,名叫"Spring"。这片土地上生长着各种美丽而强大的植物,它们分别象征着Spring框架中的…

LabVIEW调用第三方硬件DLL常见问题及开发流程

在LabVIEW中调用第三方硬件DLL时,除了技术问题,还涉及开发流程、资料获取及与厂家的沟通协调。常见问题包括函数接口不兼容、数据类型转换错误、内存管理问题、线程安全性等。解决这些问题需确保函数声明准确、数据类型匹配、正确的内存管理及线程保护。…

金钱世界:资本主义的未来

概述 《金钱世界:资本主义的未来》是一部探讨资本主义未来、全球经济停滞、大型全球企业与国家关系以及贫富差距问题的纪录片。纪录片分集内容:该纪录片共分为3集,每集都聚焦于不同的主题: 第一集《世界会继续发展吗&#xff1f…

QT实现动态翻译切换

1、实现QT动态中英文切换效果 效果如下: 2、原理 因为软件本身就是中文版,所以只需准备一个英文版的翻译即可,,那就是将所有需要翻译的地方用tr包裹,然后首先执行lupdate更新一下,接着用qt的翻译软件 Qt Linguist打开ts文件进行翻译,然后保存,最后使用 lrelease发布一…

小白跟做江科大32单片机之旋转编码器计次

原理部分按照下面这个链接理解即可y小白跟做江科大32单片机之对射式红外传感器计次-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139350487https://blog.csdn.net/weixin_58051657/article/details/139350487 实验过程 1.按照江科大老师给的电路图进行连接…

音视频开发—V4L2介绍,FFmpeg 打开摄像头输出yuv文件

实验平台:Ubuntu20.04 摄像头:1080P 监控摄像头,采用V4L2驱动框架 文章目录 1.V4L2相关介绍1.1. 基本概念1.2. 主要功能1.3. V4L2驱动框架1.4. 主要组件1.5. 使用V4L2的应用1.6. 常用V4L2工具 2.ffmpeg命令实现打开摄像头输出yuv文件3.使用C…

文献阅读:GCNG:用于从空间转录组数据推断基因相互作用的图卷积网络

文献介绍 「文献题目」 GCNG: graph convolutional networks for inferring gene interaction from spatial transcriptomics data 「研究团队」 Ziv Bar-Joseph(美国卡内基梅隆大学) 「发表时间」 2020-12-10 「发表期刊」 Genome Biology 「影响因子…

一文搞懂分布式事务Seta-AT模式实现原理

分布式事务概念 分布式事务(Distributed Transaction) 是指在分布式系统中,涉及多个数据库、服务、消息队列等资源,并且需要保证这些资源上的操作要么全部成功提交,要么全部失败回滚的一种机制。在分布式系统中&#…

极简网络用户手册(1)

极简网络系统处理流程 模块位置:参数平台--专题分析--极简网络分析 步骤: 步骤一:创建精细化场景策略 步骤二:创建任务,主要选择策略(包括√配置和距离配置)和需要处理的小区清单(源…

vulhub中Nexus Repository Manager 3 未授权目录穿越漏洞(CVE-2024-4956)

Nexus Repository Manager 3 是一款软件仓库,可以用来存储和分发Maven、NuGET等软件源仓库。 其3.68.0及之前版本中,存在一处目录穿越漏洞。攻击者可以利用该漏洞读取服务器上任意文件。 环境启动后,访问http://your-ip:8081即可看到Nexus的…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第四周) - 语言建模

语言建模 1. 统计语言模型2. N-gram语言建模 2.1. N-gram语言模型中的平滑处理 3. 语言模型评估4. 神经语言模型5. 循环神经网络 5.1. Vanilla RNN5.2. LSTM 1. 统计语言模型 统计语言模型旨在量化自然语言文本中序列的概率分布,即计算一个词序列(如一…

【记忆化搜索】2318. 不同骰子序列的数目

本文涉及知识点 记忆化搜索 LeetCode 2318. 不同骰子序列的数目 给你一个整数 n 。你需要掷一个 6 面的骰子 n 次。请你在满足以下要求的前提下,求出 不同 骰子序列的数目: 序列中任意 相邻 数字的 最大公约数 为 1 。 序列中 相等 的值之间&#xff…

重庆耶非凡科技有限公司的选品师项目加盟靠谱吗?

在当今电子商务的浪潮中,选品师的角色愈发重要。而重庆耶非凡科技有限公司以其独特的选品师项目,在行业内引起了广泛关注。对于想要加盟该项目的人来说,项目的靠谱性无疑是首要考虑的问题。 首先,我们来看看耶非凡科技有限公司的背…

图解 IPv6 多播范围

1、 IPv6 多播范围 2、从单播地址生成请求节点多播地址 3、已分配的多播地址

Day04 左侧菜单导航实现

一.点击左侧菜单导航到对应的View页面 1.首先在MyToDo项目中,创建出左侧菜单所有的View(视图)及对应的ViewModel(视图逻辑处理类) ViewViewModel首页IndexViewIndexViewModel待办事项ToDoViewToDoViewModel忘备录MemoViewMemoViewModel设置SettingsViewSettingsViewModel