【问题标题】:Glassfish V2.1.1 Heap size never decrease after server batch jobGlassfish V2.1.1 堆大小在服务器批处理作业后永远不会减少
【发布时间】:2011-12-02 18:25:45
【问题描述】:

我已经建立了一个 glassfish 集群,其中包含 1 个 DAS 和 2 个节点代理。

系统具有每天批处理一次的 TimedObjects。作为 glassfish 架构,TimerService 创建的每个 Timer 只允许 1 个集群实例触发超时事件。

我的问题是关于触发批处理作业的集群实例的堆大小。 VisualVM 显示一个实例始终具有可扩展的堆大小(在服务器加载时增加并在之后减小),但另一个实例始终具有最大堆大小并且永远不会减小。

告诉我堆大小已达到最大值是可以接受的,因为批处理作业很大。但是,我唯一的问题是为什么工作完成后它没有减少???

VisualVM 显示触发超时事件的实例的“已用堆内存”在批处理作业后减少。但是,为什么它的“堆大小”没有相应地缩小?

谢谢你的建议!!! ^^

【问题讨论】:

标签: java jakarta-ee glassfish heap-memory cluster-computing


【解决方案1】:

这是最终答案(感谢 Preston ^^)

来自文章:

http://www.ibm.com/developerworks/java/library/j-nativememory-linux/index.html

我捕捉到这些陈述来回答我的问题!

1:

“运行时环境 (JVM) 提供由某些未知用户代码驱动的功能;这使得无法预测运行时环境在每种情况下需要哪些资源”

2 : 这就是为什么触发批处理作业的节点总是消耗内存的原因。

“保留本机内存与分配它是不一样的。当本机内存被保留时,它没有物理内存或其他存储支持。虽然保留地址空间的块不会耗尽物理资源,但它确实阻止了内存不得用于其他目的”

3 : 这就是为什么不触发批处理作业的节点具有可扩展的堆大小行为。

“一些垃圾收集器通过在堆的已用区域缩小时取消提交(释放其后备存储)部分堆来最大限度地减少物理内存的使用。”

【讨论】:

    【解决方案2】:

    大概你有一些引用内存的东西。我建议获取MAT 的副本并进行堆转储。从那里您可以看到分配的内容以及引用它的内容。

    【讨论】:

    • 您能否为我推荐其他 MAT 工具?因为堆转储相当大(大约 4GB)。它位于物理上无法访问的云服务器上。因此,不可能下载堆转储文件以在本地机器上运行。我尝试过 jhat 在远程服务器上运行 Web 服务器,但之后它就再也没有启动和停止过。有人报告说 jhat 不支持大转储文件。 (我的云服务器是CentOS,没有安装GUI,所以不能安装GUI应用。)
    • 您能否运行较小版本的工作负载,以便创建较小的堆转储?您的云不允许您进行 shell in 或 ftp?
    • 是的,它允许 ftp。但是,我认为如果我能看到服务器上运行的真实数据会更好。我曾经尝试在本地机器上运行应用程序并查看它的堆转储,但我无法从中获得任何有用的信息。因此,最后的机会可能是从远程服务器下载堆转储文件(这可能需要一整天!!)。我认为应该有另一个 MAT 工具,就像 jhat 在远程机器上运行 web 服务器。非常感谢您的提前!我会弄清楚并在这里为其他人发布结果。
    • 是的,在云端进行堆转储,然后将文件 ftp 到本地机器进行分析。
    • 我已经下载了堆文件并且已经看到了。我在批处理未运行时转储堆。因此,它只有大约 200MB 大小。我认为我的应用程序没有泄漏。但在 VisualVM 中,它仍然显示我的应用程序的“堆大小”为 3.8GB,但“使用的堆”为 200MB(
    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2017-08-21
    • 2016-04-25
    相关资源
    最近更新 更多