JVM内存区域与内存溢出异常

Posted tripl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM内存区域与内存溢出异常相关的知识,希望对你有一定的参考价值。

1、运行时数据区域

 

技术图片

 

1.1、程序计数器

  • 一块较小的内存,它可以看作是当前线程所执行的字节码的行号指示器。
  • 线程独有
  • 唯一一个没有规定OutOfMemoryError情况的区域

1.2、Java虚拟机栈

  • 线程私有,生命周期与线程相同
  • 每个方法被执行的时候都会创建一个栈帧,方法的开始到结束对应了栈帧的入栈到出栈 
  • 这个内存区域定义了两个异常:
    • 如果线程请求的栈深度大于虚拟机允许的栈深度,就会报StackOverFlowError
    • 如果栈扩展时无法申请到足够的内存,就会报OutOfMemoryError

 1.3、本地方法栈

  本地方法栈与虚拟机栈的区别是,虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是为本地Native方法服务。

  该区域和虚拟机栈一样也会报两种异常,同上。

1.4、Java堆

  • 内存中最大一块区域
  • 线程共享,在虚拟机启动时创建,用来存放对象实例
  • 如果堆中没有内存完成实例分配,并且堆无法扩展时,也会抛出OutOfMemoryError (可以通过通过参数-Xmx和-Xms设定)

1.5、方法区

  • 线程共享
  • 存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
  • 运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息,还有一项信息是常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将存放在运行时常量池中。
  • 如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。

以上是关于JVM内存区域与内存溢出异常的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存区域与内存溢出异常

JVM高级特性与实践:Java内存区域 与 内存溢出异常

jvm--内存区域与内存溢出异常

JVM学习与问题总结——java内存区域与内存溢出异常

JVM:Java内存区域与内存溢出异常

深入理解JVM——Java内存区域与内存溢出异常