🚗🚗🚗今天给大家分享的关于JVM的一些基本认识。
清风的CSDN博客
🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!
✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛
目录
一、JVM简介
1.1 JVM 发展简史
1.1.1 Sun Classic VM
1.1.2 Exact VM
1.1.3 HotSpot VM
1.1.4 JRockit
1.1.5 J9 JVM
1.1.6 Taobao JVM(国产研发)
二、JVM 运行流程
2.1 JVM执行流程
三、JVM 运行时数据区
3.1 堆(线程共享)
3.2 Java虚拟机栈(线程私有)
3.3 本地方法栈(线程私有)
3.4 程序计数器(线程私有)
3.5 方法区(线程共享)
3.6 运行时常量池
一、JVM简介
JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统,常见的虚拟机:JVM、VMwave、Virtual Box。
- VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器。
- JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪。
JVM 是一台被定制过的现实当中不存在的计算机。
1.1 JVM 发展简史
1.1.1 Sun Classic VM
1.1.2 Exact VM
- 热点探测(将热点代码编译为字节码加速程序执行)。
- 编译器与解析器混合工作模式。
1.1.3 HotSpot VM
目前 HotSpot 占用绝对的市场地位,称霸武林。 不管是现在仍在广泛使用JDK6 ,还是使用比较多的 JDK8 中,默认的虚拟机都是 HotSpot、 Sun/Oracle JDK和 OpenJDK 的默认虚拟机。从服务器、桌面到移动端、嵌入式都有应用。 名称中的HotSpot 指的就是它的热点代码探测技术。它能通过计数器找到最具编译价值的代码,触发即时编译(JIT) 或栈上替换,通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。
1.1.4 JRockit
JRockit 面向延迟敏感型应用的解决方案 JRockit Real Time 提供以毫秒或微秒级的 JVM 响应时间,适合财务、军事指挥、电信网络的需要。MissionControl 服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。2008, BEA 被 Oracle 收购。 Oracle表达了整合两大优秀虚拟机的工作,大致在 JDK8 中完成。整合的方式是在 HotSpot 的基础上,移植JRockit 的优秀特性。
1.1.5 J9 JVM
1.1.6 Taobao JVM(国产研发)
- 创新的GCIH(GC invisible heap)技术实现了off-heap,即将生命周期较长的Java对象从heap中移到heap之外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收评率和提升GC的回收效率的目的。
- GCIH中的对象还能够在多个Java虚拟机进程中实现共享。
- 使用crc32指令实现JVM intrinsic降低JNI的调用开销;
- PMU hardware的Java profiling tool和诊断协助功能;
- 针对大数据场景的ZenGC。
二、JVM 运行流程
2.1 JVM执行流程
- 类加载器
- 运行时数据区
- 执行引擎
- 本地库接口
三、JVM 运行时数据区
3.1 堆(线程共享)
堆里面分为两个区域:新生代和老生代,新生代放新建的对象,当经过一定 GC 次数之后还存活的对象会放入老生代。新生代还有 3 个区域:一个 Endn + 两个 Survivor ( S0/S1 )。
3.2 Java虚拟机栈(线程私有)
- 局部变量表: 存放了编译器可知的各种基本数据类型(8大基本数据类型)、对象引用。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在执行期间不会改变局部变量表大小。简单来说就是存放方法参数和局部变量。
- 操作栈:每个方法会生成一个先进后出的操作栈。
- 动态链接:指向运行时常量池的方法引用。
- 方法返回地址:PC 寄存器的地址。
3.3 本地方法栈(线程私有)
本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用的。
3.4 程序计数器(线程私有)
程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。 如果当前线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是一个 Native 方法,这个计数器值为空。 程序计数器内存区域是唯一一个在JVM 规范中没有规定任何 OOM 情况的区域!
3.5 方法区(线程共享)
3.6 运行时常量池
- 字面量 : 字符串(JDK 8 移动到堆中) 、final常量、基本数据类型的值。
- 符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符。
小结
🚗🚗🚗好啦,今天的分享就到这里,别说还挺晕的,哈哈哈。多看几遍就行啦!也有可能是我没有给大家表述清楚,有什么问题欢迎大家指出。
🎉🎉🎉创作不易,还希望各位大佬支持一下!
✈️✈️✈️点赞,你的认可是我创作的动力!
⭐⭐⭐收藏,你的青睐是我努力的方向!
✏️✏️✏️评论:你的意见是我进步的财富!