我正在运行一个java应用程序,它应该通过某个决策模块来处理一批文件。我需要处理这个批次大约50小时。我面临的问题是,进程正常运行了大约一个小时,然后开始空闲。所以,我这样做了-我运行了一个小时的JVM,然后关闭它,30分钟后重新启动JVM,但由于某种原因,第二次运行仍然需要大约4-5个小时。在1小时内完成第一次运行所做的事情。任何帮助或见解都将不胜感激。
我使用的是64位windows r2服务器,2个英特尔四核处理器(2.53 GHz),24 GB内存。Java版本是1.6.0_22(64位),分配给应用程序的内存是- heap(16 GB)和PermGen(2 GB)。
外部模块也在jvm上运行,我也将其关闭,但我有一种感觉,即使在关闭之后,它也会保留内存。在我开始之前,jvm使用率是1 GB,结束之后,它往往保持在3 GB左右。有没有办法让JAVA强制释放内存?
发布于 2011-01-02 15:12:31
您确定要关闭的JVM确实已关闭吗?
一旦进程结束,它分配的所有RAM都不再被分配。一旦一个进程关闭,它就无法继续运行,这也意味着你没有办法告诉它这样做。这是由操作系统完成的。
坦率地说,这听起来像是JVM仍在运行,或者其他东西正在吞噬RAM。而且,这听起来像是你在尝试解决一个恶性的bug,而不是追捕并杀死它?
发布于 2011-01-02 18:38:57
我怀疑JVM根本没有退出。我经常在使用OutOfMemoryExceptions时停止运行的JBoss实例中看到这种症状。当我杀死JVM (通过SIGTERM/SIGQUIT)时,JVM不会及时退出,因为它正在消耗抛出/处理OOM异常的所有资源。
仔细检查日志和进程表,确保JVM正常退出。此时,操作系统将清除与该进程相关的所有资源(包括消耗的内存)
发布于 2011-01-03 06:54:08
在这个过程中,我注意到了一些事情。
在我关闭JVM之后,如果我删除了我写入文件系统的所有文件,那么RAM使用率就会恢复到原来的1 GB。
这会导致什么吗?我能做些什么吗?
https://stackoverflow.com/questions/4577403
复制相似问题