为什么要jvm gc可能是java程序猿或非java程序猿讨论最多的话题,到底怎么回事?
本文内容:内存管理发展史,JVM内存管理分析和实践 ;7600字,需要1分钟阅读。
第一部分,内存管理发展史
1.1硬件内存管理
1.2OS内存管理
有关于硬件和OS内存管理,有很多资料,比如 OS 内存管理 - 知乎,不再这里详细说明,这里主要讲jvm
第二部分:JVM内存管理分析
2.1 jvm oracle发展版本
jvm新版本性能指标
基准方法
硬件:一个稳定的机器不运行任何其他的计算要求苛刻的流程,配置:Intel® Xeon® Silver 4116 @ 2.1 GHz (12 cores total / 24 threads)和128 GiBRAM内存,运行RHEL 8 x86_64
运行次数:每个JDK 和每个垃圾收集器组合按顺序运行 3 次。下面的结果是这 3 次运行的平均值。
测试结果
备注:
查看 3 次单独运行的原始数据(此处未显示),机器重新分配数(B1 和 B10)在同一 JDK 和 GC 上的运行之间波动很大,通常超过10%,其他数字不会受到这种不可靠性的影响。
可以以说忽略 Machine Reassignment numbers 更好。但是为了避免挑选数据的问题,这些结果和平均值确实把它们包括进来了。
6个重要的JVM性能参数 - 知乎
基准测试总结
-
平均而言,以 OptaPlanner 为例的基准测试结果表明:
-
对于 G1GC(默认),Java 17 比 Java 11 快 8.66%,比 Java 16 快 2.41%。
-
对于 ParallelGC,Java 17 比 Java 11 快 6.54%,比 Java 16 快 0.37%。
-
Parallel GC 比 G1 GC 快 16.39%。
2.2 jvm内存模型设计
程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有。
Native方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有。
Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享。
方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享
为快速理解和实践,以考促学
综上所述,我们大概了解了JVM及GC设计和作用,回到主题,为什么要gc呢,在所有的程序设计中,都要进行内存管理,为什么不直接用OS内存管理呢?java设计者考虑到跨OS,肯定要独立于OS内存管理。