相关疑难解决方法(0)

是否收集了Java Thread Garbage

这个问题发布在某个网站上.我没有在那里找到正确的答案,所以我再次在这里发布.

public class TestThread {
    public static void main(String[] s) {
        // anonymous class extends Thread
        Thread t = new Thread() {
            public void run() {
                // infinite loop
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                    // as long as this line printed out, you know it is alive.
                    System.out.println("thread is running...");
                }
            }
        };
        t.start(); // Line A
        t = null; // Line B
        // no more references for Thread t
        // another infinite …
Run Code Online (Sandbox Code Playgroud)

java multithreading garbage-collection

84
推荐指数
4
解决办法
3万
查看次数

为什么java等待这么长时间来运行垃圾收集器?

我正在使用Play构建一个Java Web应用程序!框架.我在playapps.net上托管它.在提供的内存消耗图表上,我一直困惑不已.这是一个示例:

堆内存

该图表来自一致但名义上的活动期.我没有做任何事情来触发内存的衰减,所以我认为这是因为垃圾收集器运行,因为它几乎达到了允许的内存消耗.

我的问题:

  • 它是公平的,我认为我的应用程序并不会有内存泄漏,因为它似乎是所有内存都被正确地被垃圾回收器回收它在运行时?
  • (从标题)为什么java等到最后一秒可能运行垃圾收集器?随着内存消耗增长到图表的前四分之一,我看到显着的性能下降.
  • 如果我的断言是正确的,那么我该如何解决这个问题?我在SO上读过的其他帖子似乎反对调用System.gc(),范围从中性("它只是运行GC的请求,所以JVM可能只是忽略你")完全反对("依赖的代码System.gc()从根本上被打破") .或者我不在这里,我应该在我自己的代码中寻找导致此行为和间歇性性能损失的缺陷?

更新
我已经在PlayApps.net上开启了一个关于这个问题的讨论,并在这里提到了一些观点; 特别是@Affe关于完整GC设置非常保守的评论,以及@ G_H关于初始和最大堆大小设置的评论.

这是讨论链接,但遗憾的是您需要一个playapps帐户才能查看.

当我得到它时,我会在这里报告反馈; 非常感谢大家的回答,我已经从中学到了很多东西!

解决方案
Playapps支持,这仍然很好,对我没有很多建议,他们唯一的想法是,如果我广泛使用缓存,这可能会使对象保持活动的时间超过需要,但事实并非如此.我还是学到了很多东西(呜呜!),我给了@Ryan Amos绿色支票,因为我提出了他System.gc()每半天打电话的建议,现在工作正常.

java memory memory-management playframework

49
推荐指数
3
解决办法
7284
查看次数