如果我的独立java进程将消耗所有堆内存,该怎么办?

如果我的独立java进程将消耗所有堆内存,该怎么办?,java,garbage-collection,heap-memory,Java,Garbage Collection,Heap Memory,我正在运行一个最大堆大小为-Xmx1024m的java程序,我的java程序不断创建新对象 我可以通过以下命令看到进程目前使用的堆:- jmap-历史:现场89038|head num #instances #bytes class name ---------------------------------------------- 1: 34001134 816027216 java.lang.String 2: 170

我正在运行一个最大堆大小为-Xmx1024m的java程序,我的java程序不断创建新对象

我可以通过以下命令看到进程目前使用的堆:-

jmap-历史:现场89038|head

 num     #instances         #bytes  class name
----------------------------------------------
   1:      34001134      816027216  java.lang.String
   2:      17000000      408000000  OOMError$Person
   3:           327       83085304  [Ljava.lang.Object;
   4:          6307         813232  <methodKlass>
   5:          6307         714344  <constMethodKlass>
   6:           428         498840  <constantPoolKlass>
   7:           398         313088  <constantPoolCacheKlass>
num#实例#字节类名
----------------------------------------------
1:34001134 816027216 java.lang.String
2:17000000 4080000000 OOMError$人
3:327 83085304[Ljava.lang.Object;
4:          6307         813232  
5:          6307         714344  
6:           428         498840  
7:           398         313088  
字节总数已超过最大堆大小。我的java应用程序应该已停止。 å 即使是年轻的GC和完整的GC都尝试运行,但即使是它们也无法删除对象,因为我保留了引用。我的应用程序本应抛出一些错误,本应失败,但它仍在运行,不知道如何操作


当java程序消耗最大堆内存时,预期的行为应该是什么。

当您尝试
新建
对象时,它将返回
OutOfMemoryError
异常。如果您在try/catch语句中有此代码,则程序可以优雅地退出并告诉您发生此情况的位置/原因。否则分配给
new
的变量将为
null
,并将使程序崩溃。

当JVM尝试分配新对象时,它将失败,并出现OutOfMemoryError。如果循环中有一个try/catch块,并且要丢弃可丢弃或错误实例,那么程序理论上可以永远运行我将无法创建新对象。原因是我的程序正在退出,但没有在输出文件中打印任何内容,我已将system.err设置为输出文件,在捕获异常后,它应该在输出文件中打印该异常。“否则,分配给新对象的变量将为null,并将使程序崩溃。”不完全是这样。异常只是将整个线程冒泡到默认处理程序,该处理程序可能会终止应用程序(假设它是单线程/其他一切都是守护进程线程)