`

JVM内存区溢出场景模拟

    博客分类:
  • java
 
阅读更多
模拟jvm内存溢出,需手动设置jvm启动参数。方法如下图:
在Default VM Arguments 配置参数:-Xms6m -Xmx6m -XX:PermSize=1m -XX:MaxPermSize=2m



[list]
  • java.lang.OutOfMemoryError: Java heap space
    堆是用来存储对象的,当然对象不一定都存在堆里(由于逃逸技术的发展)。那么堆如果溢出了,一定是不能被杀掉的对象太多了。模拟 Heap 内存溢出,只要不断创建对象并保持有引用存在即可。
    package test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class TestOutOfMemoryHeapspace {
    	public static void main(String[] args) {
    		List list = new ArrayList();
    		for(int i = 0; i < Integer.MAX_VALUE; i++) {
    			TestMain tm = new TestMain();
    			list.add(tm);
    			System.out.println(tm);
    		}
    	}
    }
    

    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 test.TestOutOfMemoryHeapspace.main(TestOutOfMemoryHeapspace.java:11)
    
  • java.lang.OutOfMemoryError: PermGen space
    在运行时产生大量常量就可以实现让 Method Area 溢出的目的。运行是常量可以用 String 类的 intern 方法,不断地产生新的常量。
    package test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class TestOutOfMemoryPermGenspace {
    	public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            int i = 0;
            while (true) {
                list.add(String.valueOf(i++).intern());
            }
        }
    }
    

    Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
    	at java.lang.String.intern(Native Method)
    	at test.TestOutOfMemoryPermGenspace.main(TestOutOfMemoryPermGenspace.java:11)
    
  • java.lang.StackOverflowError
    什么时候会让 Java Method Stack 栈溢出啊?栈的基本特点就是 FILO(First In Last Out),如果 in 的太多而 out 的太少,就好 overflow 了。而 Java Method Stack 的功能就是保存每一次函数调用时的“现场”,即为入栈,函数返回就对应着出栈,所以函数调用的深度越大,栈就变得越大,足够大的时候就会溢出。所以模拟 Java Method Stack 溢出,只要不断递归调用某一函数就可以。
    package test;
    
    public class TestOutOfMemoryStackOverFlow {
    
    	private int stackLength = 0;
    
    	public void stackOverflow() {
    		++stackLength;
    		stackOverflow();
    	}
    
    	public static void main(String[] args) throws Throwable {
    		TestOutOfMemoryStackOverFlow test = new TestOutOfMemoryStackOverFlow();
    
    		try {
    			test.stackOverflow();
    		} catch (Throwable e) {
    			System.out.println("stack length: " + test.stackLength);
    			throw e;
    		}
    	}
    
    }
    

    stack length: 9560
    Exception in thread "main" java.lang.StackOverflowError
    	at test.TestOutOfMemoryStackOverFlow.stackOverflow(TestOutOfMemoryStackOverFlow.java:9)
    	at test.TestOutOfMemoryStackOverFlow.stackOverflow(TestOutOfMemoryStackOverFlow.java:9)
    	at test.TestOutOfMemoryStackOverFlow.stackOverflow(TestOutOfMemoryStackOverFlow.java:9)
    	at test.TestOutOfMemoryStackOverFlow.stackOverflow(TestOutOfMemoryStackOverFlow.java:9)
    	at test.TestOutOfMemoryStackOverFlow.stackOverflow(TestOutOfMemoryStackOverFlow.java:9)
    

    [/list]
    • 大小: 245.9 KB
    分享到:
    评论

    相关推荐

      JVM实战-对象访问与内存溢出异常解析

      针对多线程情况下栈内存不足的情况,可以通过设置`-Xss`参数来减小每个线程的栈大小,然后尝试创建大量的线程来模拟栈内存不足的场景。然而,在实际测试过程中发现,这种方式可能导致系统假死而无法观察到异常情况。...

      JVM模拟内存泄漏代码

      本篇文章将通过一个简单的"JVM模拟内存泄漏代码"来深入探讨堆内存泄漏和元空间泄漏,帮助开发者理解和预防这类问题。 堆内存泄漏是指程序中的对象在不再被使用后,由于某些原因没有被垃圾收集器回收,导致堆内存...

      jprofiler的使用及联调内存溢出解决方案交流

      然后,需要模拟现场场景,例如模拟内存溢出场景、模拟性能问题场景等。 jprofiler 是一个功能强大且多功能的 Java 剖析工具,能够帮助开发者快速定位和解决内存溢出问题,提高程序的性能和可靠性。

      JVM内存参数调优

      根据提供的代码片段,我们可以看到一个简单的测试类 `A`,其中通过不断地创建对象来模拟内存占用情况。使用 `-verbosegc` 参数可以打印出详细的GC日志,帮助我们分析内存使用情况。通过比较不同代码实现方式下的GC...

      java内存溢出原因

      本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space溢出以及Native Heap溢出,并提供相应的解决方案。 1. **JVM PermGen space溢出** - ** PermGen space** 是JVM内存模型中的...

      Axis2_1.4.1客户端内存溢出

      ### Axis2_1.4.1客户端内存溢出实验解析 #### 实验背景与目标 在软件开发领域,特别是Web服务开发中,Apache Axis2是一个非常重要的开源框架,用于实现和部署SOAP(Simple Object Access Protocol)和RESTful Web...

      用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip

      "用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip"文件提供了一个实战平台,让我们可以模拟JVM内存状况,学习如何识别和解决内存溢出问题。 首先,JVM的内存区域主要分为堆(Heap)、方法区(Method Area)、虚拟机...

      实战JAVA虚拟机 JVM故障诊断与性能优化带源码

      例如,可能会有模拟内存泄漏、线程死锁、GC优化等场景的代码,让读者亲手操作,加深理解。 总的来说,这本书对于Java开发者来说是一份宝贵的资源,它不仅讲解了JVM的内部工作原理,还提供了实用的故障诊断工具和...

      jvm参数调优-jvmSample.zip

      然而,如果不合理地配置JVM参数,可能会导致性能瓶颈、内存溢出等问题。因此,掌握JVM参数调优技巧是每个Java开发者必备的技能。本文将深入探讨JVM参数的设置方法,并结合实例"jvmSample-master"进行分析。 一、JVM...

      用JAVA做的虚拟内存管理.rar,JDK是6.2

      5. **内存溢出**:如果程序分配的内存超过了JVM的可用内存,就会发生内存溢出错误。可以通过调整JVM的启动参数,如-Xms和-Xmx来控制堆的初始大小和最大大小,以防止这种情况发生。 6. **类加载机制**:JVM使用双亲...

      jvm调优学习-optimizeJVM.zip

      - 运行压力测试,模拟真实负载下的JVM行为。 JVM调优是一个持续的过程,涉及到很多细节和技巧。通过深入理解JVM工作原理,结合具体的应用场景和需求,我们可以逐步调整和优化,以实现最佳性能。"optimizeJVM-...

      jvm-demo1.zip

      JVM的内存模型包括堆、栈、方法区、本地方法栈和程序计数器等几个部分,每个部分都有其特定的功能和优化策略。 1. **死锁的演示**:死锁是多线程编程中的常见问题,当两个或多个线程互相等待对方释放资源而形成的一...

      OOMDemo,.zip

      项目中的代码可能包含模拟内存消耗过大的场景,例如创建大量大对象、无限制地增加对象引用等,以触发OOM异常。通过分析这些代码,我们可以学习如何监控和调整JVM内存设置,以及如何优化代码以减少内存占用。 为了...

      一个JSP页面导致的tomcat内存溢出的解决方法

      5. 使用工具进行性能测试:使用LoadRunner这类性能测试工具,可以模拟高并发场景下的用户请求,有助于发现和解决潜在的内存问题。通过观察在压力测试下的内存消耗情况,可以针对性地调整代码和配置以优化性能。 6. ...

      一篇文章让你了解chaosblade-niaoshuai1

      对于 JVM 实验,ChaosBlade 提供了多种故障类型,例如 `outofmemoryerror`,可以模拟 JVM 的内存溢出情况。通过运行 `./blade create jvm outofmemoryerror -h` 可以获取该实验类型的帮助信息,了解如何配置和启动...

      实战JAVA虚拟机随书源码

      1. 堆内存溢出:源码中可能包含模拟堆内存溢出的场景,帮助我们理解如何通过JVM参数调整堆大小,以及如何使用JConsole、VisualVM等工具识别和解决此类问题。 2. 线程死锁:学习如何通过`jstack`命令查看线程状态,...

      memorytest_java_

      8. **内存计算与分析**:"memorytest"可能是一个简单的Java程序,用于模拟不同场景的内存使用,或者是一个分析工具,用来统计内存分配和对象生命周期。这有助于识别内存瓶颈,优化代码以减少不必要的内存消耗。 ...

      Java工程师成神之路~-HollisChuang's Blog1

      同时,学习编写各种模拟内存溢出和栈溢出的程序,可以帮助我们更好地理解内存管理机制。 当遇到性能问题时,比如响应慢、频繁的Full GC或内存溢出,我们需要熟练掌握如何定位问题。例如,通过分析GC日志找出Full GC...

      面试专题--虚拟机篇代码

      3. 内存区域与内存溢出:JVM的内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈。了解每个区域的作用和大小调整,对于优化性能和避免内存溢出问题至关重要。 4. 虚拟机调优:通过调整JVM参数,可以优化应用...

    Global site tag (gtag.js) - Google Analytics