JVM学习笔记

第二部分:自动内存管理机制–hotspot
2.2:运行时数据区域
2.2.1:程序计数器
线程私有
2.2.2:java虚拟机栈:
线程私有,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧(stack frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用至完成的过程,就对应一个栈帧在虚拟机栈中的入栈和出栈过程。
2.2.3:本地方法栈:
本地方法栈和虚拟机栈发挥的作用是非常相似的,他们的区别是虚拟机栈为虚拟机执行java方法(java字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务。
2.2.4:java堆
被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都是在这里分配内存。
java堆是垃圾回收管理的主要区域。
2.2.5:方法区
方法区和java堆一样,是由各个线程共享的内存区域,它用于储存已被虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据。
2.2.6:运行时常量池:
这个是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载进入方法区的运行时常量池中存放。

2.4.1堆溢出:
JVM参数
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
-XX这个参数可以让虚拟机在出现内存溢出异常时Dump出当前内存堆转存快照以便事后进行分析
2.4.2虚拟机栈和本地方法栈溢出:
由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说,虽然-Xoss参数(设置本地方法栈大小)存在,但是实际上是无效的。栈容量只由-Xss参数设定。
2.4.3方法区和运行时常量池溢出:
运行时常量池是方法区的一部分,所以一起说。方法区存放Class的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等。
2.4.4本机直接内存溢出:
DirectMemory容量可以通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值(-Xmx)一样。
由DirectMemory导致的内存溢出,一个明显的特征是在HeapDump文件中不会看到明显的异常,如果读者发现OOM之后Dump文件很小,而程序中又直接或间接使用了NIO,那就可以考虑检查一下是不是这方面的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值