我正在运行一个java应用程序,它应该通过一些决策模块处理一批文件。我需要处理批次约50小时。我面临的问题是,这个过程可以运行大约一个小时,然后开始闲置。所以,我这样做了 - 我运行JVM一小时然后将其关闭,30分钟后重新启动JVM,但仍然出于某种原因第二次运行需要将近4-5小时。做第一次运行在1小时内做的事情。任何帮助或见解将不胜感激。
我在64位Windows r2服务器,2个intel四核处理器(2.53 GHz),24 GB RAM上运行。 Java版本是1.6.0_22(64位),分配给应用程序的内存是 - 堆(16 GB)和PermGen(2GB)。
外部模块也在jvm上运行,我也关闭了它,但我感觉即使在关机后它仍然保留在内存中。在我启动jvm之前,RAM的使用量是1 GB,在我结束之后,它往往会保持在3 GB左右。有什么方法可以让JAVA强行释放那段记忆吗?
答案 0 :(得分:3)
您确定要关闭的JVM确实已关闭吗?
一旦进程结束,它已分配的所有RAM都不再分配。一旦进程关闭,进程就无法挂起它,这也意味着你无法告诉它这样做。这是由操作系统完成的。
坦率地说,这听起来像JVM仍然在运行,或者其他东西在吃RAM。此外,听起来你正试图解决一个恶毒的错误,而不是寻找并杀死它?
答案 1 :(得分:0)
我怀疑JVM根本没有退出。我通过JBoss实例定期看到这种症状,该实例会因OutOfMemoryExceptions
而停止运行。当我杀死JVM(通过SIGTERM / SIGQUIT)时,JVM不会及时退出,因为它消耗了所有资源抛出/处理OOM异常。
仔细检查日志和进程表,确保JVM正常退出。此时,操作系统将清除与该进程相关的所有资源(包括消耗的内存)
答案 2 :(得分:0)
我注意到了这个过程中的一些事情。
关闭JVM后,如果我删除了写入文件系统的所有文件,那么RAM的使用率将恢复到原来的1 GB。
这会导致什么,我可以做些什么。
答案 3 :(得分:0)
出于兴趣:您是否尝试拆分流程以便它可以并行运行?
50小时工作是一项重要工作!你有一台像样的机器(8核和24GB Ram),你应该能够并行化它的某些部分。