我知道垃圾收集在Java中是自动化的.但我明白,如果你System.gc()在代码中编写,Java VM可能会或可能不会在运行时决定在那时进行垃圾收集.这是如何工作的?基于什么基础/参数,VM在看到GC时决定做(或不做)GC System.gc()?是否有可能的例子在这种情况下将它放在代码中是个好主意?
我需要监视由我的应用程序生成的线程消耗的内存量.如果贪婪的线程消耗太多内存,那么我们的想法是采取纠正措施.我已经提到我的java线程需要多少内存?.关于该链接的建议之一是getThreadAllocatedBytes在ThreadMXBean.我尝试使用getThreadAllocatedBytes以下工作时使用.
List<Long> primes = new ArrayList<Long>();
long i = 0;
while (true) {
primes.add(++i);
if ((i % 10) == 0) {
primes.clear();
System.runFinalization();
System.gc();
}
}
Run Code Online (Sandbox Code Playgroud)
我花了很长时间在四个线程上运行这个工作.虽然作业不会持续累积内存,但返回的值getThreadAllocatedBytes会不断增加,甚至不会下降一次.这意味着getThreadAllocatedBytes不会返回线程使用的堆上的实际内存量.它返回自启动以来线程在堆上分配的内存总量.我的平台详细信息如下:
Linux的PG85213.egi.ericsson.com 3.5.0-030500泛型#201207211835 SMP周六7月21日22时35分55秒UTC 2012 x86_64的x86_64的x86_64的GNU/Linux的Java版本"1.7.0_45"
的Java(TM)SE运行时环境(建1.7.0_45-b18)Java HotSpot(TM)64位服务器VM(内置24.45-b08,混合模式)
上述行为是否符合预期的行为getThreadAllocatedBytes?如果是这样,是否无法在线程使用的堆上找到有效内存.
我列出了完整的程序供参考:
package workbench;
import java.lang.management.ManagementFactory;
import com.sun.management.ThreadMXBean;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
public class AnotherWorkBench {
private static final CountDownLatch latch = …Run Code Online (Sandbox Code Playgroud)