【发布时间】:2016-12-08 11:45:44
【问题描述】:
我正在尝试编写对资源影响最小的代码,但我遇到了我不理解的 GC 行为。
-
显然字符串不会立即从内存中清除,即使它们不再使用。
for(int i = 0; i < 999999999; i++) System.out.println("Test");
根据图表,我假设在每次循环运行时都会创建一个新的 String 对象,但在下一次循环运行时它不会自动清除 - 如果是这种情况,我想知道它为什么会发生如果我误读了情况,我想知道“幕后”到底发生了什么。
-
当我将睡眠添加到我在图表上方显示的代码中时,它变得稳定了,这是什么原因?
for(int i = 0; i < 999999999; i++){ System.out.println("Test"); try{ Thread.sleep(1); } catch(Exception e){} }
我对给定案例还有几个问题:
可以强制 GC 更具攻击性吗?我的意思是缩短对象的生命周期,而不是减少 JVM 分配的内存?
如果我在变量中插入一个空值,它会影响到被 GC 清除之前的时间吗?
当我需要对字符串运行大量正则表达式匹配时,使用字符串的正确方法是什么?
声明 String 对象“过时”以便 GC 将其清除的最佳方法是什么?
出现上述情况是否是因为Java对Strings进行了自动实习,如果是,有没有办法取消它?
非常感谢!
【问题讨论】:
-
你完全错了。无论您循环多少次,您的示例中都只创建了一个字符串。
-
"Test" 将是 interned,只有一个实例
-
@Kayaman 你能说得更具体点吗?,高内存使用的原因是什么...
-
我认为当您使用 System.out.println("Test") 循环 999999999 次时出现问题。您正在将它写在屏幕上(它使用了内存)。最终使用的内存是 999999999 * 4 位。这等效于使用大字符串数组。如果你更换。 System.out.println("Test") with example String test = "test".
-
@Kayaman,我在我的项目中得到了相同的结果,所以我创建了最简单的代码来显示问题......有人能告诉我为什么内存使用率如此之高吗? 50MB RAM 用于只有 print&for 循环的代码,这是没有意义的。非常感谢!
标签: java string memory garbage-collection jvm