【问题标题】:Memory allocation for classes in javajava中类的内存分配
【发布时间】:2019-03-08 00:11:26
【问题描述】:

这是一个用于实现 trie 数据结构的有效 java 代码。

class TrieNode {
TrieNode[] arr;
boolean isEnd;
// Initialize your data structure here.
public TrieNode() {
    this.arr = new TrieNode[26];
}

我不明白内存分配是如何工作的

TrieNode[] arr;

代码。如果是这样的话

class TrieNode {
    int[] arr;
    boolean isEnd;
    // Initialize your data structure here.
    public TrieNode() {
        this.arr = new int[26];
    }

我知道这会为 26 个整数分配内存。 如果你能解释第一个代码的内存分配是如何工作的,那就更好了。 (在编译器的角度)

编辑:对不起,如果我的问题不清楚。我要问的是我们在

中创建包含 26 个元素的数组
new TrieNode[26];

分配了多少内存?

【问题讨论】:

  • 在 java 中,所有的引用和实际对象都驻留在内存中。引用是指堆中的对象。现在,当您拥有new TrieNode[26] 时,您有 26 个 TrieNode 类型的引用(在连续内存中),但实际对象将驻留在不需要连续的堆中。

标签: java class memory-management trie


【解决方案1】:

使用您的第一个代码,当您创建类似 TriNode 的对象时

TriNode t = new TriNode();

JVM 将分配内存来存储 26 个对 arr 元素的引用和 1 个对 isEnd 字段的引用。为了存储引用,JVM 对 32 位 JVM 使用 32 位,对 64 位 JVM 使用 64 位。 创建数组时

new TrieNode[26];

它将分配 26*(64bit/32bit)+1 布尔值,因为它不创建 TrieNode 对象,而是创建引用数组来存储尚未创建的 TriNode 对象。所以当你初始化像

这样的数组元素时
arr[0] = new TrieNode();

然后它将为 TrieNode() 对象分配内存,并且 arr[0] 将指向该对象。

所以结论是 JVM 不会为 26 个 Trinode 对象分配内存 相反,它会为它们的引用分配内存。

【讨论】:

    【解决方案2】:

    直到你没有调用 new 之前没有完成内存分配。

    所以TrieNode[] arr; 作为未来参考。 只有当你调用构造函数时,Java才会分配内存并在arr内部设置引用。

    链接:

    【讨论】:

    • 为 TrieNode[] arr 分配了多少内存; ?因为我们没有指定它。抱歉,我是编程新手。
    • 我不知道细节,但这取决于你的 JVM。如果您运行 32 位 JVM,则每次引用将获得 32 位;如果您有 64 位 JVM,则最多可以获得 64 位引用。 stackoverflow.com/questions/1721568/…
    • 不,这不是我要问的:(我已经编辑了问题
    猜你喜欢
    • 2011-12-02
    • 2012-03-01
    • 1970-01-01
    • 2014-06-27
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多