本地方法栈不是重点,了解一下就行了.更多的重点放在Java栈\堆\方法区\程序计数器.
新生代多次垃圾回收回收不掉的内容,或者说虚拟机判断需要存下来的内容,要放到老年代.
hotspot用的指针.
最好上面这两个设置大小一样大.
所有新new的对象都在新生代.建议不要自己设置Xmn的大小.
新生代: par new generation
老年代: concurrent mark-sweep generation
一般Xmn设置不要超过Xmx的一半
最大堆大小total = eden区 + from区
我们新建的对象过大的话,会直接进入老年代的.
请说明一下eden区和survial区的含义以及工作原理?
目前主流的虚拟机实现都采用了分代收集的思想,把整个堆区划分为新生代和老年代;新生代又被划分成Eden 空间、 From Survivor 和 To Survivor 三块区域。 我们把Eden : From Survivor : To Survivor 空间大小设成 8 : 1 : 1 ,对象总是在 Eden 区出生, From Survivor 保存当前的幸存对象, To Survivor 为空。一次 gc 发生后: 1)Eden 区活着的对象 + From Survivor 存储的对象被复制到 To Survivor ; 2) 清空 Eden 和 From Survivor ; 3) 颠倒 From Survivor 和 To Survivor 的逻辑关系: From 变 To , To 变 From 。可以看出,只有在 Eden 空间快满的时候才会触发 Minor GC 。而 Eden 空间占新生代的绝大部分,所以 Minor GC 的频率得以降低。当然,使用两个 Survivor 这种方式我们也付出了一定的代价,如 10% 的空间浪费、复制对象的开销等。
java.lang.StackOverflowError: 一般是递归的错误