JVM调优简要思想及简单案例-JVM分代模型

109 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

前言

JVM将Java堆内存划分为了两个区域,一个是年轻代,一个是老年代。 年轻代里的对象,他们的特点是创建之后很快就会被回收。 老年代里的对象,他们的特点是需要长期存在。

image.png

JVM分代模型

大部分的正常对象,都是优先在新生代分配内存的。但是新生代也肯定是会有容量限制的,比如说有 1g、1.5g 或者2g,如果新生代本来预先分配的内存空间,几乎被对象给占满了,此时假设我们代码继续运行,还需要在新生代里去分配一个对象,但发现新生代里内存空间都不够了,这个时候,就会触发一次新生代内存空间的垃圾回收。它会把新生代的这些垃圾对象然后进行一次垃圾回收,新生代随着系统的运行,进行这个垃圾回收之后新生代还会产生垃圾,然后再次回收掉一些不用的对象,然后保留的一些有用的对象,新生代的它那个空间就会变小下来,那可又又可以继续用了。

新生代可能随着系统的运行,不停的创建对象,然后让新生代变满,接着垃圾回收一次,大量对象被回收掉,但是某些对象,例如静态变量,是不会被回收掉的,会存活在新生代里的,不会被回收。 这种情况JVM有一条规定:如果一个实例对象在新生代中,成功的在15次新生代垃圾回收之后,还是没被回收掉,就说明他已经15岁了,就会被转移到Java堆内存的老年代中去。

上面的情况不断发生,越来越多的对象进入老年代,一旦老年代也满了,也需要对老年代进行垃圾回收。对老年代的垃圾回收,我们称之为老年代GC