0
点赞
收藏
分享

微信扫一扫

为什么要jvm gc-性能设计沉思录(1)

孟祥忠诗歌 2022-04-08 阅读 36
jvmjvm gcgc

为什么要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内存管理。

举报

相关推荐

0 条评论