`

JVM学习笔记一 - JVM内存区域

    博客分类:
  • JVM
阅读更多

1.JVM的内存管理。

 JVM的结构图如下:

从上图可以看到,JVM管理的内存区域主要分为以下几部分:

1、程序计数器(Program Counter Register):占用较小的内存空间,是当前线程执行的字节码的行号指示器。每个线程都会有独立的程序计数器。存放的是字节码指令的地址。
2、Java虚拟机栈(JVM Stacks):线程私有、生命周期与线程相同。主要作用是描述JAVA方法执行的过程:方法被执行时会创建一个栈帧(stack frame),用于存放方法执行时的局部变量、操作栈、动态链接、方法出口等信息。方法从调用到执行完成的过程,就是一个栈帧在虚拟机栈的入栈、出栈过程。
3、本地方法栈(Native Method Stack):作用与虚拟机栈类似,区别在于用于执行本地方法。
4、Java 堆(Heap):虚拟机管理内存最大的一块,被所有线程共享,存放对象实例。垃圾收集器主要管理JAVA 堆。
5、方法区域(Method Area):所有线程共享;用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译的代码等。这个区域的数据是比较固定的,可认为是"永久代"(Permanent Generation)。
6、运行时常量池(Runtime Constant Pool):方法区的一部分。用于存放编译期生成的各种字面量和符号引用。

 

2.对象访问

看一下简单的对象创建语句:

Object obj = new Object();

“Object obj”语句将会反映到JAVA栈的本地变量表中,作为一个reference的类型出现,存放地址。

“new Object()”语句将会反映到JAVA堆中,形成一块存储了Object类型的所有数据值的结构化内存。另外,这条语句还必须包含能找到此对象类型数据(如对象类型、父类、接口、方法等)的地址信息;这些地址信息的真正存储区域是方法区。

reference类型存放的方式,主要分为两种:

1、句柄访问方式:JAVA堆中划分出一块内存用来存放句柄池,reference中存储的是句柄的地址,而句柄中存储了对象实例数据和类型数据各自的地址。如下图所示:



 

2、直接指针访问方式:采用这种方式,在JAVA堆布局中就必须放置访问类型数据的相关信息,reference中直接存储的就是对象地址。如下图:



 

 

 

  • 大小: 31.2 KB
  • 大小: 34.6 KB
  • 大小: 32.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics