相关疑难解决方法(0)

System.gc()什么时候做什么

我知道垃圾收集在Java中是自动化的.但我明白,如果你System.gc()在代码中编写,Java VM可能会或可能不会在运行时决定在那时进行垃圾收集.这是如何工作的?基于什么基础/参数,VM在看到GC时决定做(或不做)GC System.gc()?是否有可能的例子在这种情况下将它放在代码中个好主意?

java garbage-collection

113
推荐指数
8
解决办法
14万
查看次数

线程占用的内存

我需要监视由我的应用程序生成的线程消耗的内存量.如果贪婪的线程消耗太多内存,那么我们的想法是采取纠正措施.我已经提到我的java线程需要多少内存?.关于该链接的建议之一是getThreadAllocatedBytesThreadMXBean.我尝试使用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)

java memory multithreading memory-management

12
推荐指数
1
解决办法
2万
查看次数