Glassfish V2.1.1服务器批处理作业后堆大小永远不会减少

时间:2011-10-07 05:53:49

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

我已经建立了一个带有1个DAS和2个节点代理的glassfish集群。

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

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

可以告诉我堆大小是最大的,因为批处理作业很大。但是,我唯一的问题是为什么在工作完成后它不会减少???

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

谢谢你的建议!!! ^^

2 个答案:

答案 0 :(得分:0)

据推测,你有一些引用记忆的东西。我建议获取MAT的副本并进行堆转储。从那里你可以看到已分配的内容以及引用它的内容。

答案 1 :(得分:0)

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

来自文章:

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

我抓住这些陈述来回答我的问题!

1:

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

2:这就是触发批处理作业的节点始终消耗内存的原因。

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

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

“一些垃圾收集器通过在堆的使用区域缩小时对堆的一部分进行解除(释放后备存储)来最小化物理内存的使用。”