zoukankan      html  css  js  c++  java
  • 【Java】运行时Java对象在内存中是如何存储的?

    翻译自这一篇文章

    我们知道函数在内存中实现为一个活动记录的栈。我们也知道Java方法在JVM栈区中实现为一个帧栈而Java对象是在堆区进行分配的。

    Java对象在堆内存中是怎样的呢?一旦对象保存在内存中,就只是字节序列。

    那么我们如何知道去哪里查找某个字段?在编译器内部保留一个内部表,来记录每个字段的偏移量。

    下面的例子,是关于类“Base”(B)的对象布局。这个类中没有任何方法,类方法在内存中的存储方法会在下一节说到。

    base

    如果我们有一个类“Derived”(D)继承了这个“Base”类。那么内存分布就如下

    derived

    子对象有着与父对象相同的内存分布,只不过它还需要多一些的空间来存放新增的成员。这种布局方式的好处在于,一个B类型的指针指向D对象时,仍然可以在内存区域的开始部分找到B对象。因此,通过B引用来对D对象进行操作都保证是安全的,从而也就不必动态地检查B指向的是什么。

    按照同样的逻辑,方法可以被放在对象的开头处。

    methods

    不过,这个方法效率不高。如果一个类中有很多方法(比如说,M个),那么每个对象都必须有O(M)的指针集。此外,每一个对象都需要有可容纳O(M)指针的空间。这些要求使得创建对象更慢而对象占用更大。

    最佳是方法就是去创建一个虚函数表,这是一个指针数组,其中的指针指向某个类的具体成员函数实现。为每一个类创建一个虚函数表的实例,并在每个对象中保存一个指向虚函数表的指针。

    optimization

    这个就是最优化的方法。

  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/GuoYaxiang/p/6400570.html
Copyright © 2011-2022 走看看