gpt4 book ai didi

java - 在Java中,全局变量总是放在堆上吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:56 25 4
gpt4 key购买 nike

此外,静态变量对事物有何影响? (如果有的话)例如:

class MyClass{

static int[][] data;

static {
data = new int[some number][some number]; /*read data into array*/
}

static void run() {
/*now use data here*/
}
}

这是放在堆上吗?将该示例与

 class MyClass{

static void run() {
int[][] data = new int[some number][some number];
/*now use data here*/
}
}

这两个代码示例之间有多少区别?请发表任何见解。

最佳答案

Java 有一个 PermGen 空间的概念——这是用来存储所有类定义、静态变量、interned 字符串等的空间。 here is link

This Java heap memory is structured again into regions, called generations. The longer an object lives, the higher the chance it will be promoted to an older generation. Young generations(such as Eden on Sun JVM) are more garbage collected than older generations(survivor and tenured on Sun JVM). However, there is also some separate heap space called permanent generation. Since it is a separate region, it is not considered part of the Java Heap space. Objects in this space are relatively permanent. Class definitions are stored here, as are static instances.

PermGen 空间的完整描述也可以在这里找到,但请注意,这在 Java 8 中有所改变:here is link

静态变量存储在那里,动态分配的东西存储在常规堆中。

(请注意,即使对于静态数组,放置在数组中的内容也是动态生成的)。

你的第二个例子更适合这种情况,除非你真的需要在调用之间记住该数组的内容。您一直在用尽内存来存储仅在方法内部时才需要的数组。此外,通过拥有这样的静态数据,您的方法不可重入。这意味着如果两个线程同时调用该方法,那么它们将相互干扰并产生不良结果。

关于java - 在Java中,全局变量总是放在堆上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21775237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com