由多线程内存溢出产生的实战分析( 二 )


java OOMTest 4000 -Xmx500m -Xss2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp运行结果如下:
由多线程内存溢出产生的实战分析文章插图
查看系统内存如下:
由多线程内存溢出产生的实战分析文章插图
结论分析:a、在tmp目录下没有生成dump文件 。 我们需要注意 , 使用-XX:+HeapDumpOnOutOfMemoryError参数的时候 , 并不一定在任何溢出场景下都会产生dump文件 。
b、系统内存还有很多 , 却无法创建线程了 。 感觉是系统中存在的进程/线程已经达到系统配置的极限 。
2、第二次测试过程:
使用ulimit -u 65535命令或者直接修改limits.conf文件 , 将max user process参数修改为65535 。
jvm参数配置如下:
java OOMTest 4000 -Xmx500m -Xss2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp程序运行结果如下:并没有报任何错误
由多线程内存溢出产生的实战分析文章插图
修改jvm参数为:
java OOMTest 40000 -Xmx500m -Xss2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp配置只是修改了创建线程数为40000 , 比上一次4000多了10倍 。
程序运行结果如下:
由多线程内存溢出产生的实战分析文章插图
查看内存如下:
由多线程内存溢出产生的实战分析文章插图
结论分析:此时已经把系统的内存全部耗尽 , 无法使用free、top命令 , 此时已经无法执行任何命令
3、综合分析a、当max user processers 设置的较小的时候 , 影响系统线程数目的是max user processers的设置b、当max user processers设置为65535的时候 , 影响系统线程数目的是系统的内存 。 c、对外的异常信息均为:OOM:unable to create native thread 。
多线程内存溢出的理论支撑通过上面的分析 , 我们看到其实多线程内存溢出有很大原因是因为系统设置和内存大小造成的 , 那么我们如何来分析当前系统配置能够支持多少线程呢?
对于java中的线程 , 我之前的理解一直是在java中new新线程的时候是直接使用jvm的内存 , 可实际情况却不是这样的 。 在java中每个线程需要分配线程内存 , 用来存储自身的线程变量 , 在jdk1.4中每个线程是256K的内存 , 在jdk1.5中每个线程是1M的内存 , jdk1.6以上版本不太清楚 。 在java中每new一个线程 , jvm都是向操作系统请求new一个本地线程 , 此时操作系统会使用剩余的内存空间来为线程分配内存 , 而不是使用jvm的内存 。 这样 , 当操作系统的可用内存越少 , 则jvm可用创建的新线程也就越少 , 我们举一个例子如下:
总内存 -Xmx -Xms -Xss 剩余内存 线程数1024M 256M 256M 1M 768M 768根据上面的知识 , 于是衍生出了下面这样的通用公式:(MaxProcessMemory – JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads注:MaxProcessMemory:进程最大寻址空间 。 JVMMMEMORY:jvm的内存空间(堆+永久区)-Xmx大小 (应该是实际分配大小)ReservedOsMemory:操作系统预留内存ThreadStackSize:-Xss大小
信息文件的导出文章开始的时候说过 , 在内存溢出的时候 , 因为服务器重启导致jstack内容消失了 , 虽然配置了jvm参数HeapDumpOnOutOfMemoryError , 但并没有产生相应的dump文件 , 于是我们采用脚本导出的方式 , 内容如下:
#!/bin/bashps -Leo pid,lwp,user,pcpu,pmem,cmd > /tmp/ps.logecho 1pid=`ps aux|grep tomcat|grep xxx|awk -F ' ' '{print $2}'`echo 2pstack $pid >/tmp/pstack.logecho 3lsof > /tmp/sys-o-files.logecho 4lsof -p $pid > /tmp/service-o-files.logecho 5jstack -l $pid> /tmp/js.logecho 6 free -m >/tmp/free.logecho endvmstat 2 1


推荐阅读