我对Java没什么了解。
我正在浏览一些链接并发现博客上写着“存储在堆栈上的Java Primitives”,我认为这取决于实例变量或局部变量。
经过几个链接,我的结论是,
类变量 - 基元 - 作为它包含的Object的一部分存储在堆上。
类变量 - 对象(用户定义) - 作为其包含的Object的一部分存储在堆上。对于参考对象和实际对象都是如此。
方法变量 - 基元 - 作为该堆栈帧的一部分存储在堆栈中。
方法变量 - 对象(用户定义) - 存储在堆上,但对堆上该区域的引用作为该堆栈帧的一部分存储在堆栈中。 如果Object中包含另一个对象,引用也可以存储在堆上。
静态方法(实际上是所有方法)以及静态变量都存储在堆中。
如果我的理解错误,请纠正我。感谢。
答案 0 :(得分:13)
JVM中有一些甚至可能使用Stack for Objects的优化,这减少了垃圾收集工作。
类存储在堆的特殊部分,但这取决于您使用的JVM。 (Permgen f.e. in Hotspot< = 24)。
一般而言,您不必考虑数据的存储位置,而是更多地考虑可见性和存在时间等语义。到目前为止,你在问题中的解释看起来不错。
答案 1 :(得分:3)
“方法变量 - 对象(用户定义) - 存储在堆上但是......”
错误。 首先,方法变量称为局部变量。
让我们考虑一下
public static void main(String[] args) {
List<Integer> model = new ArrayList<Integer>();
变量model
放在堆栈框架中,而不是放在堆上。使用new ArrayList<Integer>()
生成的引用对象放在堆中,但它不是局部变量。
三件事:
model
完全不同,不要搞砸他们。
答案 2 :(得分:1)
对象存储在堆中。
存储在堆栈中的对象引用。
存储在方法区域中的静态变量。
实施例 abc obj = new abc();
abc对象保存在堆中,对象引用存储在堆栈中。
static int i = 10;
i变量存储在方法区域中。