标签:
简要介绍Java的内存区域:
Program Counter Register,代表当前线程所执行的字节码的行号指示器,操作系统中的PC,这两个是一个概念。执行时就是通过改变这个计数器来选取下一条需要执行的字节码指令。Java支持多线程,所以每个线程有自己独享的PC,类似于操作系统线程表中的一个属性。
和PC一样,是线程私有的,和线程的生命周期一样。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的时候都会创建一个栈桢(Stack frame),用与存储局部变量,操作数、动态链接、方法出口等信息。局部变量放在栈中的局部变量表中,该表中存放了编译器可知的基本数据类型(int。float,string。。)和对象的引用(reference)。
Native Method Stack与Java虚拟机栈的作用非常相似,不过用于为虚拟机调用到的Native方法服务。
Java堆被所有线程所共享,是Java程序的内存,在虚拟机启动时创建,该内存区域的目的就是存放对象实例。Java堆是垃圾回收器(GC)管理的主要区域。
Method Area各个线程共享的区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,
方法区内有一块特殊的区域叫运行时常量池(Runtime Constant Pool),用于存放编译时生成的各种字面量和符号引用(字符串)
直接内存不是虚拟机运行时的一部分,但是会影响到Java堆的大小
Java是一门面向对象语言,对象的创建是通过new关键字来完成的。主要步骤:
对象在内存中主要分三块:
建立对象是为了使用对象,java程序需要通过存储在栈上的reference数据来操作对上的具体对象,reference类型是一个指向对象的引用,并没有定义这个歌引用该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机的实现方式而定,目前主流有两种:
1. 使用句柄访问对象
使用句柄的好处是句柄稳定,当对象被移动(GC后)时只改变句柄中的实例数据指针,而Reference本事不需要修改。
2. 使用指针访问对象
使用直接指针的最大好处就是速度更快,节省了一次指针定位的时间开销。
标签:
原文地址:http://www.cnblogs.com/Brake/p/jvm_memory_area.html