内存溢出测试之二

本文详细解析了Java虚拟机栈内存分配过大和创建线程过多导致的内存溢出异常,通过实例代码展示了异常产生的原因及解决方案。
 

package com.jfans;

/*
 * VM参数:-Xss2M
 *
 * 抛出如下异常:
 *  Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
 at java.lang.Thread.start0(Native Method)
 at java.lang.Thread.start(Thread.java:597)
 at com.jfans.JavaVMStackOutOfMemoryError.stackLeakByThread(JavaVMStackOutOfMemoryError.java:27)
 at com.jfans.JavaVMStackOutOfMemoryError.main(JavaVMStackOutOfMemoryError.java:13)
   招聘此异常的主要原因是方法栈内存分配过大和创建线程过多造成的。
 */
public class JavaVMStackOutOfMemoryError {

 /**
  * @param args
  */
 public static void main(String[] args) {
   JavaVMStackOutOfMemoryError jvsme = new JavaVMStackOutOfMemoryError();
   jvsme.stackLeakByThread();
 }

 public void stackLeakByThread(){
  while(true){
   Thread thread = new Thread(new Runnable(){

    @Override
    public void run() {
      dontStop();
    }
    
   });
   
   thread.start();
  }
 }
 
 private void dontStop(){
   for(int i=0; i<1000; i++){
   
   }
 }
}

### 测试内存溢出问题的方法 测试内存溢出问题通常涉及模拟和重现内存溢出的场景,以验证应用程序在内存受限情况下的行为。以下是一些常见的测试方法: #### 1. 使用内存分析工具 利用内存分析工具(如MAT、VisualVM、JProfiler等)可以监控应用程序的内存使用情况,并帮助识别潜在的内存泄漏或溢出问题。这些工具可以提供详细的内存快照,帮助分析内存的使用情况和对象的生命周期。 #### 2. 模拟高内存负载 通过编写测试代码或使用性能测试工具(如JMeter、LoadRunner等),可以模拟高内存负载的场景。例如,可以通过创建大量对象或分配大块内存来触发内存溢出。以下是一个简单的Java代码示例,用于测试内存溢出: ```java public class MemoryOverflowTest { public static void main(String[] args) { // 创建一个无限循环,不断分配内存 while (true) { byte[] data = new byte[1024 * 1024]; // 每次分配1MB内存 try { Thread.sleep(100); // 暂停100毫秒 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 在运行此代码时,可以通过监控工具观察内存使用情况,直到触发内存溢出异常。 #### 3. 调整JVM参数 在测试内存溢出时,可以通过调整JVM参数来限制堆内存的大小。例如,使用`-Xmx`参数设置最大堆内存为较小的值,以加速内存溢出的发生。以下是一个JVM启动参数的示例: ```bash java -Xmx100m -jar your_application.jar ``` 通过限制堆内存,可以更容易地触发内存溢出问题,从而进行测试和分析。 #### 4. 监控和分析性能指标 在测试过程中,监控应用程序的性能指标(如内存使用率、CPU使用率、线程数等)是非常重要的。可以使用监控工具(如Prometheus、Grafana、New Relic等)来实时监控这些指标,并分析内存溢出发生时的系统状态。 #### 5. 分析内存快照 当内存溢出发生时,生成内存快照(heap dump)并进行分析可以帮助识别问题的根本原因。内存快照可以使用工具(如MAT)进行分析,以识别内存泄漏的对象和类。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值