【发布时间】:2018-10-22 05:41:00
【问题描述】:
我有一个 java 程序,它在无限 for 循环中创建 20 个不同的字符串对象
for(int i = 0 ; i >=0 ; i++){
String s = new String("Test");
String s1 = new String("Test");
/*creating more string objects here */
System.out.println(s);
}
并使用 java -Xms1m -Xmx1m HelloWorld 运行此程序并打开 VisualVM 以监控堆大小。我不确定为什么它在顶部显示大小和最大值均为 2,097,152 B。 不应该是 1,000,000 吗? 而且我也想知道为什么 use 不会增长到 700,000 B 以上。 总是在 300000 到 700000 之间
请看附件,不知道为什么CPU下会出现“此JVM不支持”的消息?
【问题讨论】:
-
看起来 gc 足够聪明,可以检测到您为循环内的每次迭代创建新实例,因此它们在下一次迭代中符合 gc 条件。如果您更改代码以在循环前创建一个列表,将新字符串添加到循环内的列表中,然后遍历该列表以打印
for循环之外的值,您将看到所有可用内存都将被使用 -
不支持小至 1MiB 的堆大小; 2MiB 是最小值。除此之外,正如@Ivan 提到的,您的
String实例是临时的,将被垃圾收集。当“伊甸园”空间已满时,这将在次要集合中发生,这是您堆的一小部分。只有仍被引用的对象(称为“幸存者”)可以转移到其他内存区域。
标签: java memory-management memory-leaks garbage-collection