您的位置:首页 > 其它

JVM学习笔记(一)

2016-04-19 16:05 190 查看
(一)Java内存区域
1.程序计数器:
程序计数器是线程私有的;
程序计数器是较小的一块内存区域,可以看作是当前线程所执行的字节码的行号指示器;
2.Java虚拟机栈:
Java虚拟机栈中的局部变量表即为常说的栈内存;
Java虚拟机栈也是线程私有的;
Java虚拟机栈描述的Java方法执行的内存模型;
局部变量表存放了编译时期可知的各种基本数据类型、对象引用;
局部变量表在方法运行期间大小不会改变;
3.Java堆:
Java堆即为常说的堆内存;
Java堆是线程共享的;
Java堆是虚拟机能管理的内存中最大的一块;
几乎所有的对象实例都存放在Java堆中;
Java堆是垃圾回收器的主要管理区域;
一般的GC都是基于分代回收的,Java堆也对应的分为新生代和老年代;
4.方法区:
方法区也是线程共享的;
方法区用于存放已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码;
5.运行时常量池:
运行时常量池是方法区的一部分;
运行时常量池用于存放编译时期生成的各种字面量和符号引用;
(二)对象的创建
虚拟机遇到一条new指令时首先检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号应用代表的类是否被加载、解析、初始化过,如果没有那么必须先执行相应的类加载过程。类加载通过后虚拟机将为这个对象分配内存。对象内存的大小在类加载结束之后便可以定下来。分配内存主要有俩种算法:指针碰撞和空闲列表。之后虚拟界将分配的内存都初始化为零。接下来虚拟机会对对象进行必要的设置,例如这个对象是哪个类的实例,如何找到类的元数据信息、对象的哈希码、对象的分代年龄等等。这些信息存放在对象头中。最后执行用户定义的构造器。
(三)对象的内存布局
1.对象内存可分为三部分:对象头、实例数据、对齐填充;
2.对象头分为俩部分:一部分用来存储对象自身的运行时数据,如哈希码、GC分代年龄等等。另一部分为类型指针:对象指向它类元数据类型的指针;
3.对其填充仅起占位符的作用,因为JVM要求对象的起始地址必须是8字节的整数倍;
(四)对象的访问定位
1.Java程序需要通过栈上的reference数据来操作具体的对象;
2.目前访问对象有俩种主流的方式:句柄和直接指针;
3.如果使用句柄的话Java堆会划分出一块内存来作为句柄池,reference中存储的就是对象句柄的地址,而句柄中包含了对象的实例数据和类数据各自的具体地址;
4.如果使用直接指针的话reference直接存储对象实例数据的地址而在实例数据中包含了类数据的地址;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: