Java虚拟机JVM底层原理分析

jdk体系结构

jvm虚拟机


紫色区域是线程独享
橘色区域是所有线程共享

栈帧

虚拟机栈(线程栈):存放局部变量。
例如:下图中a、b、c、math、

每个线程在运行前,java虚拟机都会为其分配一块自己独立的栈内存空间。存放局部变量。

栈帧是栈中更细致的内部结构,线程中每个方法分配一个栈帧(专属独立)。如下图

局部变量表、操作数栈

当方法执行完毕后释放栈帧内存区域。
先进后出,先执行main()方法在,再执行compute()方法。然后销毁compute(),再进入main()

方法出口

程序计数器


每个线程分配一个程序计数器 ,记录当先线程执行代码的行号。字节码执行引擎动态修改它

方法区

jdk1.8 以后叫做 元空间
实际上是直接放内存里的。
严格意义不算jvm中的

方法区里面存放
常量
静态变量
类信息(字节相关的类信息)


本地方法栈(现在基本不用)

private native void start0()
java与c交互,就是使用本地方法
执行到这行代码 时,会由底层的执行引擎去分析这个本地方法,去调用c语言的库函数(Windows 中的.dll文件)。
这里面的实现使用c语言实现的。


new出来的对象最先放在eden区的。
eden区的大小是固定的。 当eden区放满时,jvm会进行==minor gc(young gc)==执行引擎会开启一个垃圾收集线程,来收集eden区的垃圾对象。
那什么叫垃圾对象的,可用如下算法

可达性分析算法(如图)

所有在gc route链条上的对象都是非垃圾对象。把非垃圾对象直接复制(复制算法)到survivor区的一块空的区去。eden区剩余对象即垃圾对象(没有gc router指向的对象)直接清理掉。
没有被处理的对象的分代年龄会加一

一个对象包含对象头,里面有一个分代年龄(gc的次数)
等待eden区再次满了,再次触发minor gc,会回收 eden区和survivor区中from区的对象,gc router链条上的对象会直接复制到survivor区的to区中,eden区和survivor区中from区的垃圾对象直接销毁。

等待eden区再次满了,再次触发minor gc,会回收 eden区和survivor区中to区的对象,gc router链条上的对象会直接复制到survivor区的from区中,eden区和survivor区中to区的垃圾对象直接销毁。

以此类推…

当分代年龄达到15(gc15次还被引用),这种对象会被放到老年代。

当老年代放满了会触发full gc
full gc会回收整个堆
如果没办法回收 就会发生OOM(内存溢出)

web应用中可能会被移动到老年代的对象
线程池、静态变量引用的对象、spring容器中的been、service、controller、代码初始化的缓存对象

STW(stop the world)
执行引擎开启 gc 线程时候STW(停掉用户线程),专心收集垃圾。

jvm调优的目的:减少STW的时间(减少full gc 次数,和一次full gc的时间)

jvm调优实战





面试题:能否对jvm调优,让其几乎不发生full gc

解答

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 JVMJava 程序的运行环境,学习 JVM,方能了解 Java 程序是如何被执行的,为进一步深入底层原理乃至程序性能调优打好基础。通过学习这门课程,你将掌握:1. JVM 内存结构的组成、各部分功能作用,学会利用内存诊断工具排查内存相关问题;2. JVM 的招牌功能-垃圾回收机制是如何工作的,如何进行垃圾回收调优;3. Java 程序从编译为字节码到加载到运行的全流程,各个阶段的优化处理;4. 了解 Java 内存模型相关知识,见识多线程并发读写共享数据时的问题和 Java 的解决方案。 适应人群 有一定的Java基础,希望提升 Java 内功的人群。 课程亮点 * 系统地学习 JVM 内存结构,垃圾回收、字节码与类加载技术。 * 在内存结构章节,能够学习掌握 JVM内存溢出现象,堆栈内存结构,利用内存诊断工具排查问题。彻底分析 StringTable的相关知识与性能优化,掌握直接内存分配原理和释放手段。 * 在垃圾回收章节,不仅会介绍垃圾回收算法、分代垃圾回收机制,还会重点介绍 G1 垃圾回收器,辨析 Full GC 发生条件,jdk8以来对垃圾回收的优化,以及垃圾回收的调优法则。 * 在字节码与类加载技术章节,会从一个 class 文件开始分析其每一字节的含义。学习字节码指令的的运行流程,字节码指令与常量池、方法区的关系。掌握条件分支、循环控制、异常处理、构造方法在字节码级别的实现原理,利用HSDB工具理解多态原理。还会涉及从编译期的语法糖处理,到类加载的各个阶段,直至运行期的各项优化的详细讲解。最后不要错过方法反射优化的底层分析。 * 最后的加餐环节是带着你理解 Java 内存模型:见识多线程读写共享数据的原子性、可见性、有序性,以及很多人解释不清楚的 happens-before 规则。当然还不能少了 CAS 和 synchronized 优化。 主讲内容 第一章:引言 1. 什么是 JVM ? 2. 学习 JVM 有什么用 ? 3. 常见的 JVM 4. 学习路线 第二章:内存结构 1. 程序计数器 2. 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 6. 直接内存 第三章:垃圾回收 1. 如何判断对象可以回收 2. 垃圾回收算法 3. 分代垃圾回收 4. 垃圾回收器 5. 垃圾回收调优 第四章:类加载与字节码技术 1. 类文件结构 2. 字节码指令 3. 编译期处理 4. 类加载阶段 5. 类加载器 6. 运行期优化 第五章:内存模型 1. Java 内存模型 2. 可见性 3. 有序性 4. CAS 与原子类 5. synchronized 优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值