JVM 内存模型和垃圾回收网络摘要总结

2020-07-09  本文已影响0人  神易风

有些知识平常基本不会用到的,当每次去找工作的时候,都会被面试被问到,我想大家都猜到了就是中高级Java程序员一定会问的JVM内存模型和gc算法。想下我每次回答都是模模糊糊,知识点片片段段的,做技术最怕就是这样的,你说我不会吧,我的心又不甘,我确实懂,懂一点点点点🤦‍。看了很多别人写的JVM博客,想写一篇自己学习笔记心得,当我能写出来了,这些知识不单止刻在我的脑子了,还会留在我的心里。本文参考多篇博客内容编写的,如有雷同肯定是抄袭了。

JVM 运行时内存

根据OracleJVM运行的结构的说明,Java虚拟机在定义了在程序执行期间使用的各种运行时数据区域。

Run-Time Data Area.png

以上区域虽然都是单独划分,但是方法区运行时常量池都是在Heap内存中,当存储不足的时候,则Java虚拟机机器抛出一个OutOfMemoryError。可以通过Java启动参数修改默认Heap内存 -xms -xmx 设置最大最小内存。本地方法区属于Java虚拟机堆栈,如果线程中的计算所需的Java虚拟机堆栈超出允许的范围,则Java虚拟机将抛出StackOverflowError。可以通过Java启动参数-xss调整堆栈内存大小。

JVM内存模型

Ukod54.png

回收算法

下面图片转载一文看懂 JVM 内存布局及 GC 原理

mark-sweep 标记清除法
标记算法.png

将需要回收对象全部标记出来直接清空,优点回收速度快,但是会产生很多内存碎片。

mark-copy 标记复制法
标记复制法.png
将内存分成大小相等的区域,将存活对象复制到新的区域,再将原来整个区域删除,这种算法回收速度快,不会产生内存碎片,内存利用率只能用50%。这种回收算法用于Survivor Space,一个S0区域保存对象,另一个S1保持空闲,当执行标记复制时,幸存对象移动到空闲的S1,S0清除对象变成空闲区域。
mark-compact 标记 - 整理(也称标记 - 压缩)法
UALE6J.png

避免了上述两种算法的缺点,将垃圾对象清理掉后,同时将剩下的存活对象进行整理挪动(类似于 windows 的磁盘碎片整理),保证它们占用的空间连续,这样就避免了内存碎片问题,但是整理过程也会降低 GC 的效率。这种算法主要用于老年代对象回收。

对象回收判断

主要通过两个方法去判断对象满足垃圾回收:对象引用计数,对象可达性分析。

垃圾回收过程

总结那些情况会触发Major gc:

  1. 开发者调用System.gc()或者Runtime.getRunTime().gc()JVM启动GC。
  2. 年老代空间不足
  3. 在Minor gc期间,如果JVM无法从伊甸园或幸存者空间中回收足够的内存,则可能会触发Major GC。
  4. 如果我们为JVM设置了“ MaxMetaspaceSize”选项,但没有足够的空间来加载新类,则JVM会触发一个Major GC。

参考资料
https://www.infoq.cn/article/3WyReTKqrHIvtw4frmr3
https://dzone.com/articles/understanding-the-java-memory-model-and-the-garbag
https://plumbr.io/blog/garbage-collection/minor-gc-vs-major-gc-vs-full-gc

上一篇下一篇

猜你喜欢

热点阅读