JVM 的 GC 简单知识

喜欢而已 提交于 2020-10-24 08:37:22

JVM 内容

在 jvm 中内存大概可以这样划分。(1.6 和1.8 有些区别)

我们经常看到的 “PermGen space” 其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是JVM的规范,而后者则是JVM规范的一种实现,并且只有HotSpot才有“PermGen space”,而对于其他类型的虚拟机,如JRockit(Oracle)、J9(IBM)并没有“PermGen space”。

PS:以上图片取自 https://www.pianshen.com/article/9674355417/ (侵删)

在java 1.8之后,方法区就被移除了,替换的是metaspace,这个在 Metaspace 有介绍。

Heap

heap的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。

进一步看 heap的划分。

大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden区->Survivor 区后对象的初始年龄变为1),当它的年龄增加到一定程度(默认为15岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

GC

本文简单讲述一下gc的类型及触发条件,未涉及到gc具体实现算法及原理

一般来说gc分为 young gc (minor gc) 和 full gc(major gc)

minor gc

当 eden 区满的时候就会触发 minor gc 用于清理新生代内容

major gc

  1. 调用System.gc时(但是不必然执行)
  2. 老年代空间不足
  3. metaspace 空间不足
  4. 通过Minor GC后进入老年代的对象大小大于老年代的可用内存
  5. 由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

参考

https://www.pianshen.com/article/9674355417/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!