1.为什么要区分年轻代与老年代?
跟垃圾回收有关,对于年轻代里的对象,他们的特点是创建之后很快就会被回收,所有需要一种垃圾回收算法。
对于老年代里的对象,他们的特点是需要长期存在,所以需要另外一种垃圾回收算法,所以需要分成两个区域来放不同的对象。
2.什么是永久代?
JVM里的永久代其实就是我们之前说的方法区上面那个图里的方法区,其实就是所谓的永久代,你可以认为永久代就是放一些类信息的。
3.方法区内什么时候回被回收?
首先该类的所有实例对象都已经从Java堆内存里被回
收其次加载这个类的ClassLoader已经被回收
最后,对该类的Class对象没有任何引用
4.对象内存分配
先理解对象优先分配在新生代
新生代如果对象满了,会触发Minor GC回收掉没有人引用的垃圾对象
如果有对象躲过了16次垃圾回收,就会放入老年代里
如果老年代也满了,那么也会触发垃圾回收,把老年代里没人引用的垃圾对象清理掉
5.说每个线程执行方法的时候,那些方法对应的栈帧出栈了,那么那里的局部变量需要垃圾回收吗?
其实这是一个偏题,JVM里垃圾回收针对的是新生代,老年代,还有方法区(永久代),不会针对方法的栈帧。方法一旦执行完毕,栈帧出栈,里面的局部变量直接就从内存里清理掉了。
6.跟JVM内存相关的几个核心参数图解本文就不涉及到任何原理性的东西了,直接开始逐步给大家讲解JVM的参数如何设置。
-Xms:Java堆内存的大小
-Xmx:Java堆内存的最大大小
-Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了
-XX:PermSize:永久代大小
-XX:MaxPermSize:永久代最大大小
-Xss:每个线程的栈内存大小
**7.-Xss,**这个参数限定了每个线程的栈内存大小大家都很清楚,每个线程都有一个自己的虚拟机栈,然后每次执行一个方法,就会将方法的栈帧压入线程的栈里,方法执行完毕,那么栈帧就会从线程的栈里出栈,如下图:
8. parNew垃圾回收器是作用于新生代,是多线程机制,serial 垃圾回收器是单线程。两者只有单线程与多线程的区别,回收算法是一样的。
parNew 垃圾回收器的线程个数是根据服务器核shuo