有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想知道

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

场景2)与上述问题相同,但例如重新部署的Weblogic应用程序,堆和permgen几乎已满


共 (1) 个答案

  1. # 1 楼答案

    对于场景1:通常,当您在Eclipse中启动应用程序时,会启动一个新的JVM进程。一旦应用程序停止,进程也将终止,内存将释放到操作系统(请注意,一旦进程结束,就没有GC或任何与JVM相关的东西,因为所有这些东西只在JVM运行时起作用)

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