java 没有状态字段的对象如何存储在 JVM 中?
How does java object with no of state fields get stored in JVM?
示例类
************ Example.java ************
public class Example {
public static void main(String[] args) {
Test test = new Test();
test.hello();
}
}
************** Test.java ************
public class Tets {
public void hello() {
System.out.println("Hi");
}
}
我的理解: 在 Example.Main
方法中,测试引用将存储在 Java 堆栈内存中并且由于 new Test()
对象没有状态所以不会有任何堆内存分配。
疑问: 通常我们说Objects是存储在Heap内存中的,但是这里我们没有任何Test Object的状态字段,那么Heap中会不会有内存分配内存?
有会在堆中创建一个实例,即使没有字段;此外,将为该实例创建 2 headers:mark
和 class
。毕竟,您正在 实例 上调用 hello
,并且 java 语言规范明确指出 Object 实例是在堆中创建的。
当代码运行足够多的时候,JIT 将启动 - 在某些时候,它可能证明可能不需要某个实例并且 可能 删除该分配。或者,如果实例是纯本地的并且没有逃脱称为 标量替换 的优化,则实例可能会分解到字段中,而不是在堆中分配。
示例类
************ Example.java ************
public class Example {
public static void main(String[] args) {
Test test = new Test();
test.hello();
}
}
************** Test.java ************
public class Tets {
public void hello() {
System.out.println("Hi");
}
}
我的理解: 在 Example.Main
方法中,测试引用将存储在 Java 堆栈内存中并且由于 new Test()
对象没有状态所以不会有任何堆内存分配。
疑问: 通常我们说Objects是存储在Heap内存中的,但是这里我们没有任何Test Object的状态字段,那么Heap中会不会有内存分配内存?
有会在堆中创建一个实例,即使没有字段;此外,将为该实例创建 2 headers:mark
和 class
。毕竟,您正在 实例 上调用 hello
,并且 java 语言规范明确指出 Object 实例是在堆中创建的。
当代码运行足够多的时候,JIT 将启动 - 在某些时候,它可能证明可能不需要某个实例并且 可能 删除该分配。或者,如果实例是纯本地的并且没有逃脱称为 标量替换 的优化,则实例可能会分解到字段中,而不是在堆中分配。