Java:停止或重新部署应用程序 - 内存中的对象会发生什么

时间:2015-05-06 17:16:54

标签: java garbage-collection

我想知道..

场景1) - 在Eclipse上运行的简单应用程序在许多线程中执行某些操作并且有时会休眠。我有一个应用程序在eclipse上启动,简单的Java应用程序正在memmory中创建一些泄漏的对象...例如,我创建了一个带有静态hashmap的类,存储对对象的强引用。我几乎耗尽内存,我停止应用程序在Eclipse中单击停止或kill -9 procId。我用一些jvm参数启动了该应用程序,如xms,xmx,maxpermsize。在JVM Heap / permgen中创建的对象会发生什么?只要应用程序还活着,我就有了一个方法,我对静态hashmap键进行强引用,而不是GC-ed(我在VisualVM-> VisualGC中检查过它)。现在我杀了这个应用程序,这些obects会发生什么情况,他们是GC-ed immidiatelly还是GC-ed,我的应用程序分配的堆突然被释放而没有检查强/弱引用?如何调用这种机制?

场景2)与上面相同的问题,但是例如正在重新部署的Weblogic应用程序,Heap和permgen几乎已满......

1 个答案:

答案 0 :(得分:0)

对于方案1:通常,在Eclipse中启动应用程序时,会启动新的JVM进程。一旦应用程序停止,进程也会终止并且内存被释放到操作系统(注意,一旦进程结束,就没有GC或与JVM相关的任何其他内容,因为只有那些东西只有只要JVM正在运行就可以工作。

对于方案2:如果重新部署应用程序,则应用程序服务器应释放类加载器并为新部署的应用程序创建新的加载器。因此,与旧类加载器相关的所有类和对象应在下次运行时进行垃圾收集。然而,这并不总是有效,例如在重新部署应用程序多次时,Tomcat已经(或曾经)存在完全permgen的问题。