模拟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
分享到:
相关推荐
针对多线程情况下栈内存不足的情况,可以通过设置`-Xss`参数来减小每个线程的栈大小,然后尝试创建大量的线程来模拟栈内存不足的场景。然而,在实际测试过程中发现,这种方式可能导致系统假死而无法观察到异常情况。...
本篇文章将通过一个简单的"JVM模拟内存泄漏代码"来深入探讨堆内存泄漏和元空间泄漏,帮助开发者理解和预防这类问题。 堆内存泄漏是指程序中的对象在不再被使用后,由于某些原因没有被垃圾收集器回收,导致堆内存...
然后,需要模拟现场场景,例如模拟内存溢出场景、模拟性能问题场景等。 jprofiler 是一个功能强大且多功能的 Java 剖析工具,能够帮助开发者快速定位和解决内存溢出问题,提高程序的性能和可靠性。
根据提供的代码片段,我们可以看到一个简单的测试类 `A`,其中通过不断地创建对象来模拟内存占用情况。使用 `-verbosegc` 参数可以打印出详细的GC日志,帮助我们分析内存使用情况。通过比较不同代码实现方式下的GC...
本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space溢出以及Native Heap溢出,并提供相应的解决方案。 1. **JVM PermGen space溢出** - ** PermGen space** 是JVM内存模型中的...
### Axis2_1.4.1客户端内存溢出实验解析 #### 实验背景与目标 在软件开发领域,特别是Web服务开发中,Apache Axis2是一个非常重要的开源框架,用于实现和部署SOAP(Simple Object Access Protocol)和RESTful Web...
"用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip"文件提供了一个实战平台,让我们可以模拟JVM内存状况,学习如何识别和解决内存溢出问题。 首先,JVM的内存区域主要分为堆(Heap)、方法区(Method Area)、虚拟机...
例如,可能会有模拟内存泄漏、线程死锁、GC优化等场景的代码,让读者亲手操作,加深理解。 总的来说,这本书对于Java开发者来说是一份宝贵的资源,它不仅讲解了JVM的内部工作原理,还提供了实用的故障诊断工具和...
然而,如果不合理地配置JVM参数,可能会导致性能瓶颈、内存溢出等问题。因此,掌握JVM参数调优技巧是每个Java开发者必备的技能。本文将深入探讨JVM参数的设置方法,并结合实例"jvmSample-master"进行分析。 一、JVM...
5. **内存溢出**:如果程序分配的内存超过了JVM的可用内存,就会发生内存溢出错误。可以通过调整JVM的启动参数,如-Xms和-Xmx来控制堆的初始大小和最大大小,以防止这种情况发生。 6. **类加载机制**:JVM使用双亲...
- 运行压力测试,模拟真实负载下的JVM行为。 JVM调优是一个持续的过程,涉及到很多细节和技巧。通过深入理解JVM工作原理,结合具体的应用场景和需求,我们可以逐步调整和优化,以实现最佳性能。"optimizeJVM-...
JVM的内存模型包括堆、栈、方法区、本地方法栈和程序计数器等几个部分,每个部分都有其特定的功能和优化策略。 1. **死锁的演示**:死锁是多线程编程中的常见问题,当两个或多个线程互相等待对方释放资源而形成的一...
项目中的代码可能包含模拟内存消耗过大的场景,例如创建大量大对象、无限制地增加对象引用等,以触发OOM异常。通过分析这些代码,我们可以学习如何监控和调整JVM内存设置,以及如何优化代码以减少内存占用。 为了...
5. 使用工具进行性能测试:使用LoadRunner这类性能测试工具,可以模拟高并发场景下的用户请求,有助于发现和解决潜在的内存问题。通过观察在压力测试下的内存消耗情况,可以针对性地调整代码和配置以优化性能。 6. ...
对于 JVM 实验,ChaosBlade 提供了多种故障类型,例如 `outofmemoryerror`,可以模拟 JVM 的内存溢出情况。通过运行 `./blade create jvm outofmemoryerror -h` 可以获取该实验类型的帮助信息,了解如何配置和启动...
1. 堆内存溢出:源码中可能包含模拟堆内存溢出的场景,帮助我们理解如何通过JVM参数调整堆大小,以及如何使用JConsole、VisualVM等工具识别和解决此类问题。 2. 线程死锁:学习如何通过`jstack`命令查看线程状态,...
8. **内存计算与分析**:"memorytest"可能是一个简单的Java程序,用于模拟不同场景的内存使用,或者是一个分析工具,用来统计内存分配和对象生命周期。这有助于识别内存瓶颈,优化代码以减少不必要的内存消耗。 ...
同时,学习编写各种模拟内存溢出和栈溢出的程序,可以帮助我们更好地理解内存管理机制。 当遇到性能问题时,比如响应慢、频繁的Full GC或内存溢出,我们需要熟练掌握如何定位问题。例如,通过分析GC日志找出Full GC...
3. 内存区域与内存溢出:JVM的内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈。了解每个区域的作用和大小调整,对于优化性能和避免内存溢出问题至关重要。 4. 虚拟机调优:通过调整JVM参数,可以优化应用...