Java内存区域划分

Java内存区域划分:
1、程序计数器:每个线程私有,记录当前线程执行的字节码的行号信息。
工作时通过改变其值来选取下一条字节码指令(单线程执行、或多线程CPU时间片切换时)。

2、虚拟机栈:每个线程私有,生命周期与线程相同,又叫方法栈或线程栈,栈内存放的元素称为栈帧。
每一次方法调用就会往栈中放入一个栈帧,栈帧记录了方法相关的基本数据类型与对象引用等,方法调用完成后该栈帧就出栈。
可通过-Xss参数来指定栈的大小,该大小会影响JVM的最大创建线程数与方法调用深度。当无法再创建线程时抛出OutOfMemoryError异常,当方法调用深度达到上限时抛出StackOverflowError异常。

3、本地方法栈:每个线程私有,与虚拟机栈类似,只是它的方法是native方法。
Hotspot虚拟机将虚拟机栈和本地方法栈作了合并。

4、堆内存:JVM所有创建的对象都在堆里分配,该区为各线程共享,可通过-Xms、-Xmx参数来设置堆的大小。
内存不足也会抛出OutOfMemoryError。
堆内存还可以细分为新生代和老年代,新生代分为Eden区、FromSurvivor区和ToSurvivor区。

5、方法区内存:又称永久代,存放虚拟机加载的类信息、常量、静态变量、即时编译器产生的代码、运行时常量池等,该区为各线程共享,可通过-XX:PermSize和-XX:MaxPermSize参数来设置其大小。
内存不足也会抛出OutOfMemoryError。
注意该区域是Sun Hotspot虚拟机独有,JRocket和IBM J9没有该区域。

运行时常量池:包括编译时产生的字面量和符号引用,还包括运行期加入的的常量信息(如使用String.intern()方法产生的串也会放入该区域)

6、直接内存:直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。nio中的DirectBuffer就是使用了直接内存。
可通过-XX:MaxDirectMemorySize(默认值为-1自动)来设置,注意它没有-XX:DirectMemorySize参数。
内存不足也会抛出OutOfMemoryError。

由上可见若抛出OutOfMemoryError,由可能是上述除程序计数器以外的内存区域可用内存不足,对于堆内存可以添加参数-XX:+HeapDumpOnOutOfMemoryError查看产生的hprof文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值