JVM内存结构

在Java虚拟机规范中将Java运行时数据划分为6种,分别为:


1.堆(Heap)

  线程共享区(访问需要注意同步问题,方法和对应的属性都需要保证一致性)

 堆是存储Java对象的地方,它是JVM管理Java对象的核心存储区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都是在这里分配内存的。

 Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像磁盘空间一样。

 Java堆是垃圾收集器管理的主要区域。因此也叫“GC堆”。由于现在收集器基本都采用分代收集算法,所以Java堆中还可以细分为:新生代(Eden空间、From Survivor和To Survivor空间)和老年代

2.java虚拟机栈(VM Stack)

  线程私有内存区各条线程之间互不影响,独立存储,随着线程产生和消亡,因此不必过多考虑内存回收的问题) 

栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),对象都存放在堆区中。

在这个Java栈中又会含有多个栈帧,这些栈帧是与每个方法关联起来的,每运行一个方法就创建一个栈帧,每个栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。

3.方法区/静态区(Method Area)

  线程共享区

 它用于存储已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。

4.运行时常量池(Runtime Constant Pool)

   运行时常量池是方法区的一部分。

5.本地方法栈(Native Method Stack)

  线程私有内存区各条线程之间互不影响,独立存储,随着线程产生和消亡,因此不必过多考虑内存回收的问题) 

6.程序计数器/PC寄存器(Program Counter Register)

  线程私有内存区各条线程之间互不影响,独立存储,随着线程产生和消亡,因此不必过多考虑内存回收的问题)   

 每个线程启动的时候,都会创建一个PC寄存器PC寄存器里保存有当前正在执行的JVM指令的地址

  如果线程正在执行的是一个Java方法,这个计数器记录的时正在执行的虚拟机字节码指令的地址;如果正在执行的时Native方法,这个计数器值则为空。

 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。


7.直接内存


阅读更多
上一篇oracle和sql server中的除数为0
下一篇在项目中内嵌sqlite数据库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭