三、堆内存模型

三、堆内存模型
JVM的垃圾收集指的是堆内存空间,那么在每次GC的时候需要区分出那些堆内存空间需要被回收,那些不应该被回收。所以,为了回收整体处理方便,JVM将堆内存分为如下的几个组成部分。这几个组成部分还需要考虑JDK的版本,JDK1.8以前和JDK1.8以后的问题。
三、堆内存模型

  • 新生代:那些刚刚创建的对象有可能会存在许多垃圾对象,那么这些对象应该是被优先回收

  • 老年代:老不死的那类对象,就是经过很多次的清理之后,发现该对象依然有用

    举个例子,今天打扫卫生会看桌子上的哪本书有用那本书没有用吗?不会的。当你将桌子上的笔削和纸呀扫一扫就叫新生代回收。当你收拾很多次后,依然保留的东西就叫老年代。当你要搬家了,发现这些老年代还是没有用的时候,再次做清理,就叫老年代的清理。
    从这个例子也可以看出来,年轻代、新生代和老年代的清理,对象回收是不同的。

  • 永久代:intern()方法进行入池的对象,实际上就在永久代中,永久代不会被回收,除非JVM死机。可以发现永久代是个bug性的存在,所以在JDK1.8之后将其更换为元空间(电脑的直接内存,举例说一台电脑有100G内存,80G给堆内存,剩下的20G都是元空间的了)
    三、堆内存模型
    在整个内存的组成过程中,每一代的内存空间都会有个伸缩区,那么该区域就可以由JVM根据使用情况动态扩充。

    举个例子,现在桌子上摆满了书,我没有地方摆了,我发现对面还有桌子,我要把一些我没有用的东西放到对面桌子上,这样才能倒腾出一个新的地方放新的书,那么在倒腾过程中,是不是需要判断有地儿吗?有,挪;有地儿吗?有,挪,有地儿吗?有,再挪。
    再比如,如果现在告诉我,不用再挪了,给我开的空间足够大,大到伸缩区都可以开到内存里去,那性能会提高很多。

当我们合理设置了伸缩区的大小之后,那么就可以得到良好的性能提升,也就是说最容易的性能提升就是改变伸缩区的内存大小设置。

其实,学习JVM的垃圾回收,目的就是为了让JVM在电脑上发挥它的性能优势。