查看: 2918|回复: 12

几种手动OOM的方式

[复制链接]
论坛徽章:
2
scala徽章
日期:2014-11-06 14:55:17JVM徽章
日期:2014-11-06 17:46:17
发表于 2014-8-18 10:10 | 显示全部楼层 |阅读模式
看了jvm学习资料以后,还是有好多疑问;其中关于如何搞挂jvm虚拟机,看真没有专门去研究过;
介于此,到网上找了各种资料,还真发现有那么一两篇这方面的文章,于是自己验证,果断借鉴了过来;
别急,方法依次道来:
Java堆OOM:
  1. package com.bruce.jvm.base;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. /**
  5. * Perm区溢出测试类
  6. * -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
  7. * @author bruce
  8. */
  9. public class JavaHeapSpace {
  10.         static class JavaHeapSpaceInner{
  11.                 //do nothing. just for test...
  12.         }
  13.         public static void init(){
  14.                 List<JavaHeapSpaceInner> list = new ArrayList<JavaHeapSpaceInner>();
  15.                 while(true){
  16.                         list.add(new JavaHeapSpaceInner());
  17.                 }
  18.         }
  19. }
复制代码
跑一个junt测试,运行:JavaHeapSpace.init();就可以看到效果了
正常的执行结果:    java.lang.OutOfMemoryError: Java heap space
    Dumping heap to java_pid6704.hprof ...
    Heap dump file created [28627166 bytes in 0.186 secs]
执行时候JDK版本:
    java version "1.7.0_60"
    Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
    Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

分析:
    通过代码可以看到,撑爆java堆的方法,也就是不断的创建对象,直到撑满限定的堆大小然后就爆了。
JAVA栈溢出:
  1. package com.bruce.jvm.base;
  2. /**
  3. * 栈溢出
  4. * -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
  5. * @author bruce
  6. */
  7. public class StackOverflow {
  8.         
  9.         public static StackOverflow newInstance(){
  10.                 return new StackOverflow();
  11.         }
  12.         
  13.         public void test(int inner){
  14.                 test(inner);
  15.         }
  16. }
复制代码
跑一个junit测试,运行:StackOverflow.newInstance().test(0); 就可以看到效果了。
正常执行结果:

stackoverflow

stackoverflow

JAVA运行时常量池:
  1. package com.bruce.jvm.base;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.UUID;


  5. /**
  6. * 方法区内存溢出
  7. * -XX:PermSize=5M -XX:MaxPermSize=5M -XX:+HeapDumpOnOutOfMemoryError
  8. * @author bruce
  9. */
  10. public class PerGenSpace1 {

  11.         public static void init() {
  12.                 List<String> list = new ArrayList<String>();
  13.                 while(true){
  14.                         list.add(UUID.randomUUID().toString().intern());
  15.                 }
  16.         }
  17. }
复制代码
如果vm参数设置成:-XX:PermSize=10M -XX:MaxPermSize=10M -XX:+HeapDumpOnOutOfMemoryError就看不到效果了;具体原因还未深入;
执行结果:
    java.lang.OutOfMemoryError: PermGen space
    Dumping heap to java_pid6944.hprof ...
    Heap dump file created [1997926 bytes in 0.043 secs]
    Exception in thread "Reference Handler" Exception in thread "main"
jdk版本同上.
分析:
    String的intern()方法是对String变量重复使用的优化,在这里会把我们随机生成的字符串放置到常量池里边,当这样的字符串太多之后,并且PermSize又比较小的时候,就抛OOM了
JAVA方法区:
  1. package com.bruce.jvm.base;

  2. import java.lang.reflect.Method;

  3. import org.springframework.cglib.proxy.Enhancer;
  4. import org.springframework.cglib.proxy.MethodInterceptor;
  5. import org.springframework.cglib.proxy.MethodProxy;

  6. /**
  7. * 方法区内存溢出
  8. * -XX:PermSize=10M -XX:MaxPermSize=10M -XX:+HeapDumpOnOutOfMemoryError
  9. * @author bruce
  10. */
  11. public class PerGenSpace {

  12.         public static void init() {
  13.                 while (true) {
  14.                         Enhancer enhancer = new Enhancer();
  15.                         enhancer.setSuperclass(Object.class);
  16.                         enhancer.setUseCache(false);
  17.                         enhancer.setCallback(new MethodInterceptor() {
  18.                                 public Object intercept(Object obj, Method method,
  19.                                                 Object[] args, MethodProxy proxy) throws Throwable {
  20.                                         return null;
  21.                                 }
  22.                         });
  23.                         enhancer.create();
  24.                 }
  25.         }
  26. }
复制代码
运行方式同上.
执行结果:
    java.lang.OutOfMemoryError: PermGen space
    Dumping heap to java_pid7132.hprof ...
    Heap dump file created [4063201 bytes in 0.047 secs]
    Exception in thread "main"

jdk版本同上.
分析:
    撑爆方法区的方法就是,产生足够多的类字节码,并且加载到内存中,这里使用cglib操作字节码来实现。
JAVA新建N多线程撑爆内存,鉴于这样的操作是对小弟电脑的严重考验(本人电脑配置比较低,几年前的笔记本,还是不折腾了);
原理就是用一个while死循环,新建N多线程,知道电脑死机或者蓝屏为止。
撑爆本机直接内存这个暂时没有验证到,有待后续研究。

回复

使用道具 举报

论坛徽章:
2
scala徽章
日期:2014-11-06 14:55:17JVM徽章
日期:2014-11-06 17:46:17
 楼主| 发表于 2014-8-18 11:09 | 显示全部楼层
今天深入理解JAVA虚拟机到手,发觉上边的代码,就是书中的内容,个人表示很汗...;
无知真可怕,以后得勤快点啊!
回复 支持 反对

使用道具 举报

论坛徽章:
14
Hadoop研习者初级
日期:2012-08-20 22:35:19Openstack徽章
日期:2015-09-25 12:11:33JVM徽章
日期:2014-11-06 17:46:17DB2徽章
日期:2014-11-06 15:09:28R研习者中级
日期:2014-09-19 14:18:27Hadoop研习者初级
日期:2014-09-19 14:12:00Oracle研习者初级
日期:2014-09-19 14:07:02Oracle研习者中级
日期:2014-01-19 16:02:23Oracle研习者高级
日期:2014-01-19 14:54:04Oracle研习者高级
日期:2013-08-25 14:26:25Oracle研习者初级
日期:2013-04-18 13:19:15Oracle研习者初级
日期:2013-04-07 11:39:27
发表于 2014-8-18 14:40 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

论坛徽章:
67
知识图谱徽章
日期:2019-11-08 10:48:01python徽章
日期:2017-06-15 17:35:32Java徽章
日期:2017-06-09 15:42:21Docker徽章
日期:2017-05-25 16:49:05python徽章
日期:2017-03-09 16:45:33Java徽章
日期:2016-10-27 10:52:31投资理财徽章
日期:2016-08-25 10:49:04大型分布式徽章
日期:2016-05-12 12:14:29MongoDB徽章
日期:2015-12-17 11:48:55架构徽章
日期:2015-09-17 14:14:45R研习者中级
日期:2015-08-20 14:51:11数据陷阱解读徽章
日期:2015-08-13 15:21:46
发表于 2014-8-18 16:13 | 显示全部楼层
谢谢分享。
回复 支持 反对

使用道具 举报

论坛徽章:
5
Hadoop研习者初级
日期:2014-09-19 14:12:00JVM徽章
日期:2014-11-06 17:46:17电商分布式系统徽章
日期:2015-04-15 15:28:25架构徽章
日期:2015-04-29 17:09:41Node.js徽章
日期:2016-06-23 14:38:51
发表于 2014-8-18 20:51 | 显示全部楼层
好东西,学习了
回复 支持 反对

使用道具 举报

论坛徽章:
7
JVM徽章
日期:2014-11-06 17:46:17Oracle研习者中级
日期:2014-12-18 12:09:05测试徽章
日期:2015-05-28 11:33:41Oracle研习者中级
日期:2015-09-08 12:04:28大型分布式徽章
日期:2015-10-15 11:54:41架构徽章
日期:2016-02-25 14:45:50Mycat徽章
日期:2016-10-13 17:46:45
发表于 2014-8-20 12:32 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

论坛徽章:
31
Oracle研习者初级
日期:2012-11-26 11:09:48Node.js徽章
日期:2016-09-08 11:11:27搜索引擎徽章
日期:2017-03-23 17:41:48scala徽章
日期:2017-04-20 17:19:05Hive徽章
日期:2017-11-09 17:11:46Java徽章
日期:2018-01-04 17:15:14架构徽章
日期:2018-01-11 17:24:29计算徽章
日期:2018-03-19 15:04:30spark徽章
日期:2018-05-03 15:46:20大数据课程徽章
日期:2018-08-06 14:27:09股票徽章
日期:2018-08-24 10:51:37股票徽章
日期:2019-02-21 14:41:14
发表于 2014-8-20 16:09 | 显示全部楼层
good
回复 支持 反对

使用道具 举报

论坛徽章:
31
Oracle研习者高级
日期:2013-10-21 22:32:52JVM徽章
日期:2014-11-06 17:46:17树莓派
日期:2014-12-18 14:59:40R研习者中级
日期:2014-12-24 15:25:22Oracle研习者初级
日期:2015-02-06 15:38:45电商分布式系统徽章
日期:2015-04-15 15:28:25LATEX徽章
日期:2015-05-07 11:34:18linux徽章
日期:2015-05-21 14:16:50Java徽章
日期:2015-07-29 15:04:13算法导论徽章
日期:2016-03-16 10:46:20数据陷阱解读徽章
日期:2016-06-16 10:34:33Java徽章
日期:2016-09-01 10:00:52
发表于 2014-8-21 00:12 | 显示全部楼层
谢谢分享。
回复 支持 反对

使用道具 举报

论坛徽章:
2
JVM徽章
日期:2014-11-06 17:46:17算法导论徽章
日期:2016-03-16 10:46:20
发表于 2014-8-22 16:07 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

论坛徽章:
2
JVM徽章
日期:2014-11-06 17:46:17Hadoop研习者初级
日期:2015-01-14 15:17:46
发表于 2014-8-23 11:29 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-12-10 09:57 , Processed in 0.221364 second(s), 72 queries .

关闭

扫一扫加入
本版微信群