Java虚拟机内存结构_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java虚拟机内存结构

Java虚拟机内存结构

 2018/7/26 12:28:58  fly_ever  程序员俱乐部  我要评论(0)
  • 摘要:Java虚拟机的内存结构在程序运行时,JVM包含了两种运行时数据区,一种是与JVM同步存在的,在JVM启动时一直存在,直到JVM退出时才销毁,由所有的线程共享;另一种是与每个线程同步存在,线程退出则销毁。运行时数据区包含如下几部分:1,程序计数器每一个Java线程都有一个PC寄存器,用以记录在线程切换回来后恢复到正确的执行位置。如该线程正在执行一个Java方法,则计数器记录的是正在执行的虚拟机字节码地址,如执行native方法,则计数器值为undefined。因为只是记录线程执行时的返回地址
  • 标签:Java 虚拟机 内存

Java虚拟机的内存结构

?

? ? ? 在程序运行时,JVM包含了两种运行时数据区,一种是与JVM同步存在的,在JVM启动时一直存在,直到JVM退出时才销毁,由所有的线程共享;另一种是与每个线程同步存在,线程退出则销毁。


?

运行时数据区包含如下几部分:

1, 程序计数器
? ? ? ?
每一个Java线程都有一个PC寄存器,用以记录在线程切换回来后恢复到正确的执行位置

? ? ? ?如该线程正在执行一个Java方法,则计数器记录的是正在执行的虚拟机字节码地址,如执行native方法,则计数器值为undefined

? ? ? 因为只是记录线程执行时的返回地址,因此内存是足够使用的,该区域也是唯一一个在JVM中没有规定任何OutOfMemoryError情况的区域。

2,JVM栈

? ? ? 每个线程保持一个JVM私有栈,与线程一起创建,保存栈帧,栈帧用来存储局部变量,中间结果,以及方法返回值等。

? ? ? 该区域会抛出如下异常

  • If the computation in a thread requires a larger Java virtual machine stack than is permitted, the Java virtual machine throws a?StackOverflowError.
  • If Java virtual machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java virtual machine stack for a new thread, the Java virtual machine throws an?OutOfMemoryError.

3,堆

? ? ? ?堆空间是JVM中所有的线程共享的区域,在虚拟机启动时创建,堆空间不需要是连续的。用于存储所有的对象实例和数组。是垃圾收集管理的主要区域。

? ? ? ?该区域会抛出如下异常:

? ? ?The following exceptional condition is associated with the heap:

  • If a computation requires more heap than can be made available by the automatic storage management system, the Java virtual machine throws an?OutOfMemoryError.

4,方法区:

? ? ? ?方法区是JVM中所有线程共享的区域,在虚拟机启动时创建,堆空间不需要是连续的。用于存储已加载的每个class的信息,比如运行时的常量池,字段和方法数据,方法的代码等。

? ? ? ?方法区是堆的逻辑组成部分,但可以选择不对这个区域进行垃圾收集。方法区并不等同于永久代,但在虚拟机HotSpot实现时,方法区是在永久代中(JDK1.6及以下版本)。

? ? ? ?该区域会抛出如下异常:

The following exceptional condition is associated with the method area:?

  • If memory in the method area cannot be made available to satisfy an allocation request, the Java virtual machine throws an?OutOfMemoryError.

5,运行时常量池:

? ? ? ?运行时常量池是从方法区中分配出来的,在每一个类或者接口创建时,由JVM创建一个对应的常量池,用于存放各种常量数据,从编译时生成的各种字符数字到运行时需要用到的各种字段和方法引用运行时常量池可以理解为是类或接口的常量池的运行时表现形式。

? ? ? ?该区域会抛出如下异常:

The following exceptional condition is associated with the construction of the runtime constant pool for a class or interface:?

  • When creating a class or interface, if the construction of the runtime constant pool requires more memory than can be made available in the method area of the Java virtual machine, the Java virtual machine throws an?OutOfMemoryError.

6,本地方法栈

? ? ? ? Native Method Stacks 用来支持Native 方法,即不是使用Java语言写的方法。每个线程创建时,分配一个本地方法栈,

? ? ? ?该区域会抛出如下异常:

?The following exceptional conditions are associated with native method stacks:

?

  • If the computation in a thread requires a larger native method stack than is permitted, the Java virtual machine throws a?StackOverflowError.?
  • If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java virtual machine throws an?OutOfMemoryError.

JVM实现(HotSpot)的版本区别:

?

? ? ? JDK1.7中,方法区已经转移到了堆中,运行时常量池也从堆空间中分配。

? ? ? 从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。

  • 大小: 40 KB
  • 查看图片附件
上一篇: Eclipse中输入系统变量和运行参数 下一篇: 没有下一篇了!
发表评论
用户名: 匿名