JVM会为以下变量分配多少内存: 1)静态字符串 2)静态整数
我在探究这个问题,因为我的应用程序出现了堆内存溢出异常。我有8个常量文件,每个文件都有近300个静态常量。
将所有常量声明为静态的好处是什么?还有其他可行的做法吗?
JVM会为以下变量分配多少内存: 1)静态字符串 2)静态整数
我在探究这个问题,因为我的应用程序出现了堆内存溢出异常。我有8个常量文件,每个文件都有近300个静态常量。
将所有常量声明为静态的好处是什么?还有其他可行的做法吗?
2400个字符串常量不会耗尽你的内存。如果每个字符串常量占用10K,那只需要24MB。如果按照更常见的100字节每个计算,那只需要240K。
我会在其他地方寻找内存占用较大的程序。
字符串对象占用的空间取决于字符串的长度。
除了字符串本身的字符外,一个字符串还包含一些控制字段,但我将它们计为28个字节加上另一个嵌入对象(ObjectStreamField),我不确定它有多大,但无论如何可能是几十个字节。每个字符占用2个字节。我认为你需要8个字节的句柄。如果你的字符串每个有20个字符左右?也许每个字符串需要100个字节左右。所以像Thilo所说,2400个字符串听起来很多,但需要数百KB的空间。除非你谈论的是嵌入在手表或其他高度受限环境中的Java,否则很难想象这会成为吹大内存的重要因素。
我假设这两个都是静态的且final,因为你将它们称为常量。
如果一个原始类型或字符串被定义为常量,并且在编译时已知其值,编译器会将代码中的常量名称替换为其值。这被称为编译时常量。对于原始类型,不需要使用堆内存。字符串被放入池中,只需在堆中存储一份副本。
不管怎样,我不相信8 x 300个字符串会引起内存溢出的问题。你的问题肯定出在其他地方。
你的常量字符串有多大?
字符串所使用的内存大约为8 * 300 * 2 * 平均长度 = ~5k * 平均长度。这似乎不足以使用完所有的内存。
将常量声明为静态和最终是���个很好的做法。例如:
public static final String A_STRING = "this String is constant";
final
,所以会发生字符串的interning。 - undefined