首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 6内存的过度使用

Java 6内存的过度使用
EN

Stack Overflow用户
提问于 2008-12-14 15:34:26
回答 6查看 7.2K关注 0票数 22

对于大型应用程序来说,Java 6占用的内存是否比预期的要多呢?

我有一个多年来一直在开发的应用程序,到目前为止,它在我的特定测试配置中占用了大约30-40 MB;现在,使用Java 6u10和11,它需要几百次活动。它在五千万到两百米之间的地方有很大的回弹,当它空转的时候,它会产生GC,然后把内存掉下来。此外,它还会产生数百万页错误。所有这些都是通过Windows任务管理器观察到的。

因此,我在我的分析器(jProfiler)下运行了它,并使用了jVisualVM,这两种方法都表明,即使在完全活跃地执行负载测试周期的情况下,堆和烫发的使用率通常也在30米左右。

所以我很困惑!它不仅要求从Windows虚拟内存池中获得更多内存--它还显示为200M的"Mem使用量“。

澄清:我想对此非常清楚--用Java VisualVM在18小时内观察到,类堆和perm堆是完全稳定的。分配的易失性堆(伊甸园和长年期)保持在16 8MB不变(在前几分钟到达),并且这个内存的使用以一种完美的模式波动,从8MB增加到16 8MB,此时GC会将其降回8MB。在这18个小时的时间里,由于我正在进行压力测试,系统承受了恒定的最大负荷。这种行为是完美和一贯的可重复,看到了无数次运行。唯一的反常现象是,在从Windows获取的内存(通过任务管理器观察到)上,从64 to到900+MB,所有内存都会发生波动。

更新2008-12-18:我已经使用-Xms16M -Xmx16M运行了这个程序,没有任何明显的不利影响--性能很好,运行时间大致相同。但在短期内,内存使用量仍在1.8亿左右达到峰值。

更新2009-01-21:似乎答案可能是线程的数量-见下面的答案。

编辑:我指的是数以百万计的页面错误--在30M+区域。

编辑:我有一台4G机器,所以200米在这方面并不重要。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-22 00:46:47

在过去的几周里,我有理由调查和纠正线程池对象(一个预Java 6多线程执行池)的问题,在那里启动的线程远远超过了需求。在所讨论的作业中,可能有多达200个不必要的线程。这些线不断地死去,而新的则取代了它们。

纠正了这个问题后,我想再次运行一个测试,现在看来内存消耗是稳定的(虽然比旧JVM高20 MB左右)。

因此,我的结论是,内存中的尖峰与运行的线程数(几百个)有关。不幸的是我没有时间去做实验。

如果有人想用他们的结论来试验和回答这个问题,我会接受这个答案;否则我会接受这个答案(在等待两天之后)。

此外,页面错误率也大大降低(降低了10倍)。

此外,对线程池的修复纠正了一些争用问题。

票数 3
EN

Stack Overflow用户

发布于 2008-12-15 10:12:51

作为对Ran答案的注释中的讨论的回应,这里有一个测试用例,它证明JVM将在某些情况下将内存释放回OS:

代码语言:javascript
复制
public class FreeTest
{
    public static void main(String[] args) throws Exception
    {
        byte[][] blob = new byte[60][1024*1024];
        for(int i=0; i<blob.length; i++)
        {
            Thread.sleep(500);
            System.out.println("freeing block "+i);
            blob[i] = null;
            System.gc();
        }
    }
}

在Java 1.4和Java 6 JVM (来自Sun)上,当计数达到40左右时,JVM进程的大小会减少。

您甚至可以通过-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio选项来调整行为--页面上的一些选项也可能有助于回答最初的问题。

票数 13
EN

Stack Overflow用户

发布于 2009-01-22 01:11:07

过多的线程创建完美地解释了您的问题:

  • 每个线程都有自己的堆栈,它与堆内存是分开的,因此没有由分析器注册。
  • 默认的线程堆栈大小是相当大的,IIRC 256 at(至少是用于Java 1.3的)
  • 胎面堆栈内存可能不会被重用,所以如果创建和销毁大量线程,您将得到大量的页面错误

如果确实需要数百个线程,则可以通过-Xss命令行参数配置线程堆栈大小。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/366658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档