jvm的运行内存和对应的内存溢出分类

运行内存分区:

1)程序计数器,用于指示当前线程执行的字节码的行号指示器,不会生成任何内存相关的异常,是线程私有的,记录每个线程对应的指令执行条数;

2)java虚拟机栈,线程私有,是java方法执行的内存模型的体现,也可以理解为方法栈,主要用于存储执行方法过程中涉及到的局部变量表,操作数栈,动态链接,方法出口等信息;

3)本地方法栈,与虚拟机栈类似,只不过本地方法栈是为虚拟机用的本地方法服务,而虚拟机栈为虚拟机用到的java方法服务

4)java堆,线程共享,是垃圾收集机制主要管理的区域,主要用于存放java实例对象,几乎所有的实例对象都放这一区域,由于垃圾收集采用分代回收,则java堆更详细的划分为:eden区+from survivor区+to survivor区

5)方法区,线程共享,用于存储已经被虚拟机加载的类相关信息,常量,静态变量,即使编译器编译后的代码等数据;虚拟机规范中把这一区域划分为堆的逻辑区域;不少人喜欢把这一区域称为:永久代(permanent Generation),这一区域的回收主要是针对常量池的回收和对类对象的回收,要求比较严格,如果常量池被单独管理,不再属于方法区,则方法区的管理,只有类对象回收;

6)运行时常量池,是方法区的一部分,用于存放编译器生成的各种字面量和符号引用

7)直接内存,并不归虚拟机管理,虚拟机只是通过DirectByteBuffer对象作为这一区域的引用来操作该内存区域,避免在java堆和native堆中互相复制对象。

运行区内存溢出类型和原因总结:

1)java虚拟机栈内存异常,如果方法栈的深度过大,则抛出栈调用异常,如果方法栈数量过多,内存不足,则抛出内存溢出,多线程编程环境需要注意栈内存溢出。

2)本地方法栈内存异常和虚拟机栈异常类似

3)java堆异常,只要不停的创建新对象并保证对象可达,则会导致内存不够用,而引发异常

4)方法区和运行时常量池异常,过多的class对象要加载并存储,如动态代理,jar包等导致需要加载过多类对象,引发内存异常。

5)本机直接内存异常,如果java虚拟机通过DirectByteBuffer对象分配到的内存区域不足以供虚拟机使用,则抛出直接内存异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值