【发布时间】:2017-04-28 10:57:46
【问题描述】:
我想知道在下面的程序中内存是如何分配的:
public class MemoryClass {
public static void main(final String[] args) {
int i = 0;
MemoryClass memoryClass = new MemoryClass();
memoryClass.myMethod(memoryClass);
}
private void myMethod(final Object obj) {
int i = 1;
String s = "HelloWorld!";
}
}
上图中,栈内存中的memory、obj和s其实是对它们“actual”的引用对象”放置在堆内存中。
以下是我想到的一组问题:
- s的方法存放在哪里?
- 如果我在
myMethod中创建了另一个MemoryClass对象,JVM 是否会在堆栈内存中再次为相同的方法分配内存? - JVM 是否会在执行完成后立即释放分配给
myMethod的内存,如果是,它将如何管理问题 2 中提到的情况(仅适用于 JVM 多次为同一方法分配内存的情况)。 - 会是什么情况,如果我只声明s而不初始化它,JVM还会为
java.lang.String类的所有方法分配内存,如果是,为什么?
【问题讨论】:
-
Java 的优点在于它隐藏所有内存管理,让垃圾收集器控制。为什么你需要去调查它?
-
只是出于好奇
-
@byxor 据我所知,有两个直接原因: 1. 当出现 SOF 或 OOM 时,您必须了解它们才能修复错误; 2. 在性能调优中试图更好地管理内存时,你必须了解它们。
标签: java memory memory-management heap-memory stack-memory