一,JVM内存模型概括
还有一个寄存器,线程运行于其上面
1.程序计数器
记录线程的执行位置,线程私有内存,唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
2.线程栈(VM stack)
栈的默认大小是1M
-Xss2m 这样设置成2M
异常 :Fatal: Stack size too small
异常的引起一般是线程数目太多
3.本地方法栈(native stack)
即为一些Native方法分配的stack
异常:java.lang.OutOfMemoryError: unable to create new native thread
一般也是由线程太多引起,增加栈空间,同上方法
4.堆(heap),程序可用堆
截图自JConsole
每个线程的栈都是该线程私有的,堆则是所有线程共享的
这里说的堆,主要指程序能控制的,包括
The New Generational Heap,默认4M,此区域一般为JVM内存的1/15大小
此代分为Eden space区,Survivo space区可以看成emptySurvivo区,Survivor区,
当new 一个对象时,首先是在Eden space区,当Eden space区满时,Survivor space区进行垃圾回收(此处复制算法),当对象在Survivo space区经过几次回收Tenured Generation
复制算法,每次算法开始都得停止当前所有的线程,然后把Survivor区的所有活跃的对象复制到emptySurvivo区,然后对Survivor区空间进行清除变成emptySurvivo,以前的emptySurvivo成为了Survivor区。(互换)
Tenured Generat