• jvm学习


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

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

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

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

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

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

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

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

      OutOfMemoryError 异常

    1.java堆溢出

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

  • 相关阅读:
    python基础十一之装饰器进阶
    python基础十之装饰器
    python基础九之函数
    python基础八之文件操作
    python基础七之copy
    python基础七之集合
    python基础数据类型汇总
    python基础六之编码
    synchronized关键字的内存语义
    对于this和当前线程的一些理解
  • 原文地址:https://www.cnblogs.com/xxwtfw/p/7428882.html
Copyright © 2020-2023  润新知