Java Glassfish V2.1.1堆大小在服务器批处理作业之后不会减小

Java Glassfish V2.1.1堆大小在服务器批处理作业之后不会减小,java,jakarta-ee,glassfish,heap,cluster-computing,Java,Jakarta Ee,Glassfish,Heap,Cluster Computing,我已经建立了一个包含1个DAS和2个节点代理的glassfish集群 系统有TimedObjects,每天分批处理一次。作为glassfish体系结构,只有1个集群实例可以触发TimerService创建的每个计时器的超时事件 我的问题是关于触发批处理作业的集群实例的堆大小。VisualVM显示,一个实例始终具有可伸缩的堆大小(在服务器加载时增加,然后减小),但另一个实例的堆大小始终处于最大值,并且从不减小 告诉我堆大小最大是可以接受的,因为批处理作业很大。但是,我唯一的问题是,为什么工作完成后

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

系统有TimedObjects,每天分批处理一次。作为glassfish体系结构,只有1个集群实例可以触发TimerService创建的每个计时器的超时事件

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

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

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


谢谢你的建议^^

你大概有什么东西引用了内存。我建议获取的副本并进行堆转储。从那里你可以看到分配了什么以及引用了什么。

这是最后的答案(谢谢普雷斯顿^)

从文章中:

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

1:

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

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

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

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


“随着堆的使用面积缩小,一些垃圾收集器通过解除堆的部分使用(释放备份存储)来最大限度地减少物理内存的使用。”

可能会被证明是有用的。您能为我推荐其他MAT工具吗?因为堆转储相当大(大约4GB)。而且它位于云服务器上,物理上无法访问。所以,不可能下载堆转储文件以在本地计算机上运行。我曾尝试在远程服务器上运行web服务器,但此后它从未启动和停止。一些人报告说jhat不支持大转储文件。(我的云服务器是CentOS,没有安装GUI。因此我无法在其上安装GUI应用程序。)能否运行较小版本的工作负载,以便创建较小的堆转储?您的云不允许您使用shell或ftp?是的,它允许ftp。但是,我认为如果我能看到服务器上运行的真实数据就更好了。我曾经尝试在本地机器上运行应用程序并查看它的堆转储,但我无法从中获得任何有用的信息。所以,最后一次机会可能是从远程服务器下载堆转储文件(这可能需要一整天!!)。我认为应该有另一个MAT工具,它类似于jhat,在远程机器上运行web服务器。非常感谢你的进步!我会找到答案,并将结果发布到这里供其他人使用。是的,在云上进行堆转储,然后将文件ftp到本地框中进行分析。我已经下载了堆文件,并且已经看到了它。我在批处理未运行时转储堆。因此,它的大小只有大约200MB。我认为我的申请没有漏洞。但在VisualVM中,它仍然显示我的应用程序的“堆大小”为3.8GB,但“使用的堆”为200MB(