jvm内存分布
jvm 1.7 版本:
jvm 的内存分为堆和非堆两大部分。
堆:
堆分为 新生代和老年代。一般对象都会在新生代的内存中创建,新生代中的对象经过几次的GC 回收后依然存活(这个次数可以设置)则移动到老年代。新生代和老年代的内存不足时都会触发GC。新生代的GC 的方法一般为复制清理,而老年代则多为标记清理。方法不一样时根据这两个分代区域内存的特点来采用的。
-Xms512m 堆初始化的内存大小,-Xmx1024m 堆最大的内存为1024m -Xmn512m 新生代的空间大小。
非堆:
程序计数器:用来记录线程执行到了哪一步(记录指令)。所以每个线程都会有独立的计数器
虚拟机栈:记录方法运行时的信息,也是线程独立的。 -Xss128k 设置线程栈的深度(也就是线程可以使用的内存大小),超出时抛出StackOverFlowError。
本地方法栈:和虚拟机栈一样,不过用于native 方法。
方法区:也就是所说的永久代,用来存放类的信息,常量,静态变量,jit 即时编译代码 等。可以不实现GC,但一般也会。例如类卸载之类也会回收
-XX:MaxPermSize=256m 设置永久代最大可用空间。
字符串常量池:jvm 1.7 之前是放在方法区内,1.7 时移出方法区,因此不再受 MaxPermSize 参数的限制。
本地内存:其余的本机内存,这部分内存不是jvm 规范规定的内存,但是java 运行时还是会用到这些内存,如多线程,字符串常量等都会增加消耗,如果不足也会OutOfMemoryError