Java虚拟机-运行时数据区域

1、Java虚拟机运行时内存划分

运行时数据区域,不同的版本有所差异。以HotSpot为例说明JDK1.6、JDK1.7、JDK1.8的演进过程。

  • JDK1.6
    方法区、堆、Java虚拟机栈、本地方法栈、程序计数器
  • JDK1.7
    方法区、堆、Java虚拟机、本地方法栈、程序计数器
  • JDK1.8
    堆、Java虚拟机栈、本地方法栈、程序计数器、元数据

概览图如下
Java虚拟机-运行时数据区域_第1张图片

2、区域用途

1)堆

  • 主要存储对象实例,还有从方法区迁移过来的字符串常量池,静态变量等。
  • 内存不足时会有OutOfMemoryError异常

2)Java虚拟机栈&本地方法栈

  • 线程私有,方法执行时的局部变量表、操作数栈、动态链接、方法出口等。
  • 栈深度溢出会抛出StackOverflowError异常,栈扩展失败时有OutOfMemoryError异常,HotSpot下栈不允许动态扩展,所以几乎不会出OutOfMemoryError异常

3)元空间

  • JKD1.8之后用于替代方法区,主要存储类型信息和运行时常量池。
  • 内存不足时,报OutOfMemoryError异常
    4)程序计数器
  • 线程私有,当前线程运行位置
    5)直接内存
  • 不属于JVM运行时,但NIO时,内存不足会出现OutOfMemoryError异常
  • 唯一一个需要“减内存”解决的区域(减小堆-Xmx -Xms的大小,给直接内存更多空间)
    Java虚拟机-运行时数据区域_第2张图片

你可能感兴趣的:(Java虚拟机,JVM,内存分布)