jvm学习

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

 

java 虚拟机对Class文件中的每一部分的格式都有严格的规定,每一个字节用于存储哪种数据必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。但对于运行时的常量池,java虚拟机规范没有做任何细节的要求,不同的提供商实现的虚拟机可以按照自己的需要来实现这个内存区域。除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中。

  运行时常量池相对于Class文件常量池的另一个重要特征是具备动态性,java语言并不要求常量一定只能在编译期产生,也就是并非植入Class文件中常量池的内容才能进入方法去运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用的比较多的是String的intern()方法。

  指向对象的引用,不同虚拟机实现的对象访问方式:使用句柄和直接指针。 

  句柄访问:java 堆中划出一块内存用来做句柄池,reference中处处的就是对象的句柄地址,句柄中包含了对象的示例数据和类型数据各自的具体的地址信息。

  直接指针访问方式:java堆对象的布局中就必须考虑如何防止访问类型数据的相关信息。reference中直接存储的就是对象地址。

  句柄访问的好处:reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象时非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。

  使用直接指针访问方式的最大好处是速度更快,节省可一次指针定位的时间开销,由于对象的访问在java中非常频繁,因此此类开销积少成多后是一项非常可观的执行成本。

  OutOfMemoryError 异常

1.java堆溢出

  java堆用于存储对象实例,我们只要不断的创建对象,保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量到达最大堆的容量限制后产生内存溢出异常。

 

posted @ 2017-08-28 10:47  11cnblogs  阅读(115)  评论(0编辑  收藏  举报