jvm里的内存区域

运行时数据区域

 JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区(包含运行时常量池)。
 

程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。为了线程切换后能恢复到正确的执行位置,每天线程都需要有一个独立的程序计数器,所以我们称这类内存区域为“线程私有”的内存。

java虚拟机栈

这类内存区域也是线程私有的,它的生命周期与线程相同。相当于汇编里的堆栈,当线程执行到对应的方法,栈就会不断地将方法参数、局部变量(基本数据类型、对象引用、returnAddress类型)、操作数栈等信息进栈出栈,来达到函数调用。

本地方法栈

与虚拟机栈所发挥的作用是非常相似的,区别为本地方法栈为虚拟机使用到的Native方法服务。

Java堆

java堆是所有线程共享的一块内存区域,唯一目的就是存放对象实例。实例化对象时,只是存储对象里面的非常量属性,对象里的方法并不用copy到堆中(相当于C语言的struct),方法是在执行时,在栈中分配参数变量、局部变量等内存。

分配内存,有两种方法:“指针碰撞”,java堆中的内存是绝对规整的,所有用过的内存放一边,空闲的内存放另一边,中间放着一个指针作为分界点的指示器,分配内存时只不过是移动指针,垃圾收集器带有压缩整理功能,使内存每时每刻都是规整的。“空闲列表”,java堆不是规整的,虚拟机维护一个列表,记录哪些内存块是可用的。

对象访问的方式有两种:
使用句柄:
 
 
直接指针:
 

方法区:

方法区也是各个线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫Non-Heap(非堆),目的应该是与java堆区分开来。

运行时常量池:

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

运行时常量池,相对于Class文件常量池的另外一个重要特征是具备动态性,运行期间也可以将新的常量放入运行时常量池,如:String类的intern()方法。

本文引用:周志明的《深入理解java虚拟机》

转载请标明出处:http://blog.csdn.net/u012367513/article/details/38656909



猜你喜欢

转载自blog.csdn.net/u012367513/article/details/38656909