Java变量放在堆栈或堆上

Jay*_*esh 25 java

我对Java没什么了解.

我经历了几个链接,发现博客上写着"Java Primitives存储在堆栈上",我觉得它依赖于实例变量或局部变量.

经过几个链接我的结论是,


类变量 - 基元 - 作为它包含的Object的一部分存储在堆上.

类变量 - 对象(用户定义) - 作为其包含的Object的一部分存储在堆上.对于参考对象和实际对象都是如此.

方法变量 - 基元 - 作为堆栈帧的一部分存储在堆栈中.

方法变量 - 对象(用户定义) - 存储在堆上,但堆上对该区域的引用作为该堆栈帧的一部分存储在堆栈中.如果Object包含其中的另一个对象,也可以将引用存储在堆上.

静态方法(实际上是所有方法)以及静态变量都存储在堆中.

如果我的理解是错误的,请纠正我.谢谢.

Tho*_*mas 13

在JVM中有一些甚至可以使用Stack for Objects的优化,这减少了垃圾收集工作.

类存储在堆的特殊部分,但这取决于您使用的JVM.(Hotspot中的Permgen fe <= 24).

通常,您不必考虑数据的存储位置,而是更多关于可见性和生存时间等语义.到目前为止,您在问题中的解释看起来不错.

  • 我想在线程安全方面,存储位置也很重要 (2认同)

Ale*_*dov 5

“方法变量——对象(用户定义)——存储在堆上,但......”

错误的。首先,方法变量被称为局部变量。

让我们考虑一下

public static void main(String[] args) {
    List<Integer> model = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

变量model放置在堆栈帧中,而不是堆中。生成的引用对象new ArrayList<Integer>()放在堆中,但它不是局部变量

3件事:

  • 多变的 model
  • 生成对象
  • 对该对象的引用,存储在变量中

是完全不同的,不要把它们搞砸。