【问题标题】:long running windows service consuming memory长时间运行的Windows服务消耗内存
【发布时间】:2014-07-15 11:20:05
【问题描述】:

我有一个 Java 进程在 Windows 7 [8 GB RAM] 上作为服务运行 4-5 天,但在 JVM 上没有太多活动。我注意到内存(私人工作集)[任务管理器]每天都在增加。一开始是45000K,现在已经达到了115000K。

如果我捕获 Java 进程的堆转储,堆转储大小仅为 950KB。是什么导致更多的内存消耗?或者我应该如何着手寻找根本原因?

【问题讨论】:

    标签: java windows memory heap-memory


    【解决方案1】:

    8 GB (8,000,000K) 机器的默认最大堆大小为 2 GB。如果 Java 进程认为这会将吞吐量提高到此限制,它将使用更多内存。

    注意:进程的大小包括约 150 MB 的共享库,因此如果您将其包括在内,使用 115 MB 也就不足为奇了。

    真正的问题是;你真的知道这是个问题吗,听起来好像内存不大。

    【讨论】:

    • 我在没有使用任何功能的情况下运行了 1 个月的进程,并且私有工作集已增长到 300 MB。我有一些用 C/C++ 语言编写的遗留本机代码,其中包含 Java 应用程序。一旦内存达到 300MB,我再次捕获 Java 堆转储,发现总堆大小只有 15MB。我怀疑本机代码中存在泄漏。
    • @Vishik 您需要查看活动对象(在完整 GC 之后),但正如您所说,它似乎不在堆上。这可能是 Java 和 C 之间的交互问题。C/C++ 可能希望您在未执行的资源上调用 close/clear/free。也就是说,严格来说,这不是 C/C++ 中的错误,而是消耗的本机资源。
    • 是的,这就是问题所在。我们在本机代码中有一些对象(BSTR 指针)没有从内存中释放。使用 SysFreeString 释放内存。
    【解决方案2】:

    这是内存泄漏的可能性很大。 基本上一些应该被 GC 删除的对象仍然有链接。

    您应该使用 visualvm java 工具对此进行调查。 http://rejeev.blogspot.com/2009/04/analyzing-memory-leak-in-java.html

    【讨论】:

    • 是的,这是一个泄漏,但是泄漏出现在 CPP 代码中,而不是 Java 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多