Java堆内存溢出异常测试

package com.sino.jvmdemo;

import java.util.ArrayList;
import java.util.List;

/**
 * function:Java堆内存溢出异常测试。将堆得最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展
 * VM Args:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
 * @author ylchou@qq.com
 *
 */
public class HeapOOM {
 static class OOMObject{
  
 }
 
 public static void main(String[] args) {
  List<OOMObject> list = new ArrayList<OOMObject>();
  while(true){
   list.add(new OOMObject());
  }
 }
}

/**
 
[GC [DefNew: 8192K->1024K(9216K), 0.0279878 secs] 8192K->4602K(19456K), 0.0280352 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
[GC [DefNew: 6237K->1024K(9216K), 0.0314259 secs] 9815K->9739K(19456K), 0.0314631 secs] [Times: user=0.02 sys=0.02, real=0.03 secs]
[GC [DefNew: 7581K->7581K(9216K), 0.0000158 secs][Tenured: 8715K->10240K(10240K), 0.0600619 secs] 16296K->11920K(19456K), [Perm : 2086K->2086K(12288K)], 0.0601376 secs] [Times: user=0.05 sys=0.00, real=0.06 secs]
[Full GC [Tenured: 10240K->7993K(10240K), 0.0602911 secs] 19456K->15528K(19456K), [Perm : 2086K->2086K(12288K)], 0.0603326 secs] [Times: user=0.05 sys=0.00, real=0.06 secs]
[Full GC [Tenured: 8595K->8595K(10240K), 0.0613435 secs] 17811K->17811K(19456K), [Perm : 2086K->2086K(12288K)], 0.0613846 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]
[Full GC [Tenured: 8595K->8592K(10240K), 0.0709844 secs] 17811K->17808K(19456K), [Perm : 2086K->2084K(12288K)], 0.0710220 secs] [Times: user=0.06 sys=0.00, real=0.07 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at java.util.Arrays.copyOf(Arrays.java:2760)
 at java.util.Arrays.copyOf(Arrays.java:2734)
 at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
 at java.util.ArrayList.add(ArrayList.java:351)
 at com.sino.jvmdemo.HeapOOM.main(HeapOOM.java:14)
Heap
 def new generation   total 9216K, used 9216K [0x03c90000, 0x04690000, 0x04690000)
  eden space 8192K, 100% used [0x03c90000, 0x04490000, 0x04490000)
  from space 1024K, 100% used [0x04490000, 0x04590000, 0x04590000)
  to   space 1024K,   0% used [0x04590000, 0x04590000, 0x04690000)
 tenured generation   total 10240K, used 8598K [0x04690000, 0x05090000, 0x05090000)
   the space 10240K,  83% used [0x04690000, 0x04ef5b78, 0x04ef5c00, 0x05090000)
 compacting perm gen  total 12288K, used 2105K [0x05090000, 0x05c90000, 0x09090000)
   the space 12288K,  17% used [0x05090000, 0x0529e728, 0x0529e800, 0x05c90000)
No shared spaces configured.

 */

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java内存溢出异常(OutOfMemoryError)不能被捕获。这是因为当内存溢出时,Java虚拟机(JVM)无法提供足够的内存来分配新的对象,因此无法继续运行。在这种情况下,JVM不会将异常传递给catch块,而是直接终止程序。因此,Java内存溢出异常是无法被捕获的。 ### 回答2: Java内存溢出异常(OutOfMemoryError)是一种严重的错误,它表示Java虚拟机无法为应用程序分配足够的内存空间。这种异常无法被普通的异常处理机制捕获和处理。 当Java应用程序运行时,Java虚拟机会将内存分为堆(Heap)和栈(Stack)两个部分。堆用于存储对象实例,而栈用于存储方法调用和局部变量。当应用程序试图创建一个新的对象实例或调用方法时,Java虚拟机会在堆或栈上分配相应的内存空间。 如果应用程序需要创建的对象过多,或者递归调用的层次太深导致栈空间耗尽,就会发生内存溢出异常。此时,Java虚拟机无法分配更多的内存空间,导致应用程序无法运行。 由于内存溢出异常不属于普通的异常类型(Throwable),因此无法被try-catch块捕获。尽管可以使用try-catch语句来捕获其他异常,但内存溢出异常会导致应用程序直接崩溃,无法再执行进一步的操作。在发生内存溢出异常时,通常会打印相关的错误信息,并且无法通过捕获和处理该异常来修复应用程序。 为了解决内存溢出异常,通常需要对应用程序进行优化,如减少对象的创建和引用、释放无用的对象、调整堆栈的大小等措施,以提高内存的使用效率和性能。 ### 回答3: Java中的内存溢出异常(OutOfMemoryError)一般情况下是无法被捕获的。内存溢出是指程序在申请内存时,无法获取到所需的内存空间而导致的异常。这种异常通常发生在堆内存空间不足以满足程序的需求时,例如创建过多的对象或者加载过大的数据。 由于内存溢出异常涉及到底层内存管理,是由Java虚拟机抛出的致命错误,无法通过传统的方式捕获和处理。一旦内存溢出发生,Java虚拟机将无法继续执行程序,直接导致程序崩溃。 但是,我们可以通过一些手段来预防和避免内存溢出异常的发生。例如,合理管理和释放对象的内存,避免创建过多且无用的对象;增加JVM堆内存的大小,确保程序有足够的内存空间;使用较新的JDK版本,其中对内存管理的优化可能有助于减少内存溢出的风险。 此外,还可以通过监控和分析程序的内存使用情况来及时发现潜在的内存溢出问题,并进行优化和调整。例如,使用一些内存分析工具,如VisualVM、Eclipse Memory Analyzer等,来检查程序的内存占用情况和对象泄漏情况,以及查找内存使用过多的地方。 总之,虽然无法直接捕获Java内存溢出异常,但通过合理的内存管理和优化,可以提高程序的稳定性和性能,减少内存溢出的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值