Java虚拟机-内存区域

jvm内存区域

方法区(Method Area)常量池(Run-Time Constant Pool)堆(Heap
程序计数器(Program Counter)虚拟机栈(Java Virtual Machine Statcks)本地方法栈(Native Method Stacks)

方法区(Method Area)

存储class类型、常量、静态变量、即时编译后的代码等数据。各个线程共享区域。

常量池(Run-Time Constant Pool):常量池属于方法区,存储常量和在编译期生成的各种字面量和符号引用。

可能抛异常:

OutOfMemeoryError

原因

如果需要在方法区(PermGen)申请分配内存请求时,此时方法区(PermGen)内存不够,则抛出OutOfMemoryError。

通常是:

  • jsp页面或通过CGLib、OSGI动态生成大量的类,有可能导致PermGen space内存不足。
  • 是由于使用String.intern()方法添加了过多内容。
解决方法:
  • 检查是否使用String.intern()添加了过多内空,
  • 增大 -X:MaxPermSize 参数值。class也可以回收的,参数:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled 。但不建议这样种。

堆(Heap)

存储所有对象和数组实例。

可能抛异常

OutOfMemeoryError

原因

当jvm评估需要申请的内存超过jvm堆最大内存时,抛OutOfMemoryError。

解决方法
  • 检查程序是否有死循环
  • 检查程序是否存在资源未释放
  • 检查程序是否瞬间申请大量内存
  • 增大堆大小。参数: -Xmx

程序计数器(Program Counter)

记录正在执行的虚拟机字节码指令的地址。每个线程都有自已独立的区域。

虚拟机栈(Java Virtual Machine Statcks)

存储局部变量表(基本数据类型)、操作栈、动态链接、方法出口等信息。

可能抛异常

StockOverflowError、OutOfMemeoryError

原因
  • StockOverflowError: 可能是线程请求的栈深度超出虚拟机允许的最大深度。
  • OutOfMemeoryError: 可能是多线程环境在创建新线程时申请栈空间时内存不足。
解决方法

对于StockOverflowError异常,需检查程序是否有递归调用次数过多。
对于OutOfMemeoryError 异常,则需要根据系统情况调整参数-Xss参数。

总结公式:

-Xss = (操作系统剩余内存 - (-Xmx) - (-X:MaxPermSize) - 本地方法栈 ) / 预计的线程数

本地方法栈(Native Method Stacks)

C Statck,存储native方法本地变量、操作栈等信息。

可能抛异常

StockOverflowError、OutOfMemeoryError。

原因
  • StackOverflowError:
    如果一个线程申请一个很大的本地方法栈时,超过了最大限制则抛StackOverflowError。

  • OutOfMemoryError:
    如果本地方法栈可以动态扩展,并且本地方法栈申请扩展更多内存,但此时系统内存不足;或者是当在创建一个新的线程时,无法申请到初始化本地方法栈的内存时抛OutOfMemoryError。

解决方法
  • StackOverflowError :控制局部变量数量和大小。

  • OutOfMemoryError : 增加内存。

参考

  1. https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/memleaks.html
  2. https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值