jvm分代模型:年轻代,老年代,永久代
- jvm分代模型,年轻代和老年代。年轻代就是创建和使用完之后立马就要回收的对象。老年代就是创建之后需要一直存在对象中。
-
对象在jvm内存中如何分配
大部分正常对象,都是优先在新生代分配内存。
- 新生代内存不够的话会触发一次新生代的垃圾回收,称为”Minor GC”,也叫”Young GC”,尝试把新生代无人引用的垃圾对象回收掉。
对象在新生代中躲过10次垃圾回收,成为一个老年人,就会被转移到堆内存的老年代里去,老年代存放年纪很大的对象。
Jvm核心参数
-Xms:堆内存大小
- -Xmx:堆内存最大大小
- -Xmn:堆内存的新生代大小,扣除新生代就是老年代大小
- -XX:permSize/-XX:MetaspaceSize:永久代大小
- -XX:MaxPermSize/-XX:MaxMetaspaceSize:永久代最大大小
- -Xss: 每个线程的栈内存大小
一般设置-Xms和-Xmx为一样的大小,-XX:permSize和-XX:MaxPermSize一样的大小
什么情况下,JVM内存中的对象会被回收
通过可达性分析算法。通过这个算法,判断每个对象是否有一个GC roots。在jvm规范中,静态变量和局部变量都可以作为一种GC roots,如果有GC roots就不会被回收
- java中对象不同的引用类型。分为强引用,软引用,弱引用,虚引用。强引用是绝对不能回收的对象,软引用是可有可无,如果内存实在不够用,可以回收。弱引用是主要的回收对象。
- 没有被GC root引用的对象,也不一定会被立马回收。加入这个对象重写了Object类中的finial方法,要看这个方法中是否有被变量引用,被引用就不会被垃圾回收了。