存储在JVM中的Java对象可以被划分为两类:
-
一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速
-
生命周期短的,及时回收即可
-
-
另外一类对象的生命周期却非常长,在某些极端的情况下还能够与JVM的生命周期保持一致
Java堆区进一步细分的话,可以划分为年轻代(YoungGen)和老年代(oldGen)
其中年轻代又可以划分为Eden空间、Survivor0空间和Survivor1空间(有时也叫做from区、to区)
下面这参数开发中一般不会调:
-
Eden:From:to -> 8:1:1,但是存在自适应的内存分配策略,实际情况下并不是8:1:1,可以通过 -UseAdaptiveSizePolicy来关闭自适应(+号就是使用,-号就是不用),但虽然官方这么说,实际上即使关闭了,也没有用。只能通过选项“-xx:SurvivorRatio”调整这个空间比例。比如-xx:SurvivorRatio=8,这样可以调成8:1:1。
-
新生代:老年代 - > 1 : 2
配置新生代与老年代在堆结构的占比。
-
默认-XX:NewRatio=2,表示新生代占1,老年代占2,新生代占整个堆的1/3
-
可以修改-XX:NewRatio=4,表示新生代占1,老年代占4,新生代占整个堆的1/5
当发现在整个项目中,生命周期长的对象偏多,那么就可以通过调整 老年代的大小,来进行调优
几乎(有些大的对象在Eden区无法存储时候,将直接进入老年代)所有的Java对象都是在Eden区被new出来的。绝大部分的Java对象的销毁都在新生代进行了。
IBM公司的专门研究表明,新生代中80%的对象都是“朝生夕死”的。
可以使用选项"-Xmn"设置新生代最大内存大小
这个参数一般使用默认值就可以了。