我做了这个例子,通过 -Xmx64m我知道这个程序不会泄漏内存(或不泄漏?)。但是我不知道垃圾收集器是怎么做的,因为每次我创建一个新的双数组时。该程序是否可能存在内存泄漏?因为每次我都会创建一个新的双打数组?Garbege 收集器在哪里收集新的替身?public class TestLeakMemory {private static float total;public static void main(String[] args) throws InterruptedException { long currtime = System.currentTimeMillis(); long timeElapsed = 0; long lastTime = 0; long count = 0; while (timeElapsed < 6000000) { //Thread.sleep(100); count++; double arr1[] = new double[200000]; double arr2[] = new double[200000]; double arr3[] = new double[200000]; float doSomething = doSomething(arr1, arr2, arr3); total += doSomething; timeElapsed = System.currentTimeMillis() - currtime; if (System.currentTimeMillis() - lastTime > 3000) { System.out.println("totalMemory: " + Runtime.getRuntime().totalMemory() + ", freeMemory: " + Runtime.getRuntime().freeMemory() + ", count: " + count); lastTime = System.currentTimeMillis(); } } System.out.println(total);}private static float doSomething(double[] arr1, double[] arr2, double[] arr3) { float total = 0; for (double d : arr1) { total += d; } for (double d : arr2) { total += d; } for (double d : arr3) { total += d; } return total;}}
1 回答
狐的传说
TA贡献1804条经验 获得超3个赞
这里没有内存泄漏。
只是创建一个对象或数组,然后将其引用“放在地板上”不会造成内存泄漏。垃圾收集器会发现对象/数组不再可达并删除它。这不会立即发生,但会在您的应用程序内存不足之前发生。
在 Java 中,当对象仍然可以访问而不应该访问时,就会发生内存泄漏。GC 不知道这些对象不会被再次使用,只会保留它们。
例如,如果您在变量ArrayList
引用的 a 中保留所有这些数组的列表static
。收集器无法知道您的程序是否(真的)需要这些对象。因此,由于它们是可访问的,因此它保留了它们。如果你继续这样做,你就会耗尽内存。
如果您使用该程序获得 OOME,则不是由于内存泄漏。这将是由于堆太小。但我认为这不太可能:200,000 x 3 x 8 字节小于 5 兆字节,而您已将堆限制为 64 兆字节。
您可以重用这些数组来减少对象创建/删除的流失,但尚不清楚这是否值得。您的示例代码并不代表真正的应用程序。
添加回答
举报
0/150
提交
取消