Java对象与JVM(三)
Java对象在Java虚拟机中的引用访问方式
在前面两篇文章中了解到Java对象实例是如何在HotSpot虚拟机的Java堆中创建的,以及创建后的内存布局是怎样的。
下面我们详细了解在Java堆中的Java对象是如何访问定位的:先来了解reference类型数据是什么,再来了解两种访问方式:使用句柄或者使用直接指针(HotSpot虚拟机使用了直接指针的方式访问对象)。
1、reference类型
java程序通过reference类型数据操作堆上的具体对象;
(A)、JVM层面的引用
reference类型是引用类型(Reference Types)的一种;
JVM规范规定reference类型来表示对某个对象的引用,可以想象成类似于一个指向对象的指针;
对象的操作、传递和检查都通过引用它的reference类型的数据进行操作;
(B)、Java语言层面的引用
(i)、JDK1.2前的引用定义
如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用;
这种定义太过狭隘,无法描述更多信息;
(ii)、JDK1.2后,对引用概念进行了扩充,将引用分为:
(1)、强引用(Strong Reference)
程序代码普遍存在的,类似"Object obj=new Object()";
只要强引用还存在,GC永远不会回收被引用的对象;
(2)、软引用(Soft Reference)
用来描述还有用但并非必需的对象;
直到内存空间不够时(抛出OutOfMemoryError之前),才会被垃圾回收;
最常用于实现对内存敏感的缓存;
SoftReference类实现;
(3)、弱引用(Weak Reference)
用来描述非必需对象;
只能生存到下一次垃圾回收之前,无论内存是否足够;
WeakReference类实现;
(4)、虚引用(Phantom Reference)
也称为幽灵引用或幻影引用;
完全不会对其生存时间构成影响;
唯一目的就是能在这个对象被回收时收到一个系统通知;
PhantomRenference类实现;
更多请参考JDK相关API说明;
对于软引用,可以使用命令行选项"-XX:SoftRefLRUPolicyMSPerMB = <N>"来控制清除速率;
更多请参考:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html#sthref65
2、对象访问方式
虽然定义的reference类型数据来作为对象内存数据的引用,但JVM规范没有定义这个引用应该通过何种方式定位、访问堆上的对象,也没有不强制规定对象的内部结构应当如何表示;
这些都取决于JVM的实现,目前主流的对象访问方式有两种:
(A)、使用句柄
Java堆划分一块内存作为句柄池,reference中存储就是对象的句柄地址;
对象句柄包含两个地址:
(1)、在堆中分配的对象实例数据的地址;
(2)、这个对象类型数据地址;
如图所示:
优点:对象移动时(垃圾回收时常见的动作),reference不需要修改,只改变句柄中实例数据指针;
(B)、使用直接指针
reference中存储就是在堆中分配的对象实例数据的地址;
而对象实例数据中需要有这个对象类型数据的相关信息(前面文章讨论了HotSpot使用对象头来存储对象类型数据地址);
如图所示:
优点:对象访问时节省了一次指针定位的时间开销,速度更快;
由于对象访问非常频繁进行,所以能较好提升性能;
HotSpot虚拟机使用了直接指针的方式访问对象;
到这里,我们大体了解Java对象在HotSpot虚拟机中的访问定位方式, 判断对象是否存在引用是垃圾收集的首要问题,只有没有引用的对象才能被回收;后面我们将分别去了解:方法的调用与执行、JIT编译、以及JVM垃圾收集相关内容……
【参考资料】
1、《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版 第2章
2、《The Java Virtual Machine Specification》Java SE 8 Edition:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
3、《Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide》:http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html
4、《Memory Management in the Java HotSpot™ Virtual Machine》:http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf
5、HotSpot虚拟机参数官方说明:http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html