成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

來人啊給我炸了那個Java虛擬機

開發 開發工具
深度長文,非常非常長,執行這些程序可能導致機器完全死機,請遵照指示安全開車。

[[202267]]

你指尖躍動的電光,是我此生不滅的信仰,唯我超電磁炮永世長存。

瞬間爆炸,完成單殺。

深度長文,非常非常長,執行這些程序可能導致機器完全死機,請遵照指示安全開車。

JVM中分了兩大塊,公共區域和棧私有區域。公共區域中有堆,用來放對象的。還有方法區,用來放一些類信息啊,方法信息啊或者一些運行時的常量信息的。棧私有區域中有分為,PC寄存器(下一條操作指令地址),棧(臨時的指針和數值)和本地方法區(native方法調用會用到)。

今天教大家怎么花式搞死Java虛擬機,順便大概知道一下GC是啥,先了解一下JVM內存的結構吧。

真實的GC信息是長這樣的。

  1. PSYoungGen      total 3072K, used 128K 
  2.     eden space 2560K, 5% used  
  3.     survivor  space 
  4.         from space 512K, 0% used  
  5.          to   space 512K, 0% used  
  6.  
  7. ParOldGen       total 6656K, used 408K 
  8.     object space 6656K, 6% used   
  9.  
  10. PSPermGen       total 4096K, used 3039K    
  11.     object space 4096K, 74% used  

一般的GC過程都是這樣的,***產生的對象,是可能***就要消滅嘛~對象先在Eden區出生,過一段時間GC掃描,如果對象還能用,那就丟到Survivor區。如果再過一段時間還能用,那就繼續丟到OldGen區。PerGem區呢,只會放一些Class類啊,方法啊,1.7之前字符串常量池也是放這里,只有Full GC的時候會進行回收。

有小伙伴就會問了,那為毛Survivor有兩個區,from和to?這是其中一個GC策略,每次GC在對Survivor區掃描的時候呢,會把有用的從from 直接 復制到to區,這兩個區是互相備份的,這樣就減少了內存碎片的信息收集了,這樣from-to-from-to來回來回好幾次,才把他們丟到老年代。

好了,開始花式吊打JVM了,先指定一下我們今天的JVM配置,大家自己配上,啊。

  • -Xmx10m
  • -XX:MaxPermSize=5m
  • -XX:MaxDirectMemorySize=5m
  • -XX:+PrintGCDetails

首先咱的主類長這樣。

  1. public class BlowUpJVM {  

既然說了是花式,今天的過程是這樣的。

  • - [√] 棧深度溢出
  • - [ ] ***代內存溢出
  • - [ ] 本地方法棧溢出
  • - [ ] JVM棧內存溢出
  • - [ ] 堆溢出
  1. public static void  testStackOverFlow(){ 
  2.       BlowUpJVM.testStackOverFlow(); 

棧不斷遞歸,而且沒有處理,所以虛擬機棧就不斷深入不斷深入,棧深度就這樣爆炸了。

  • - [ ] 棧深度溢出
  • - [√] ***代內存溢出
  • - [ ] 本地方法棧溢出
  • - [ ] JVM棧內存溢出
  • - [ ] 堆溢出
  1. public static void testPergemOutOfMemory1(){ 
  2.    //方法一失敗 
  3.     List<String> list = new ArrayList<String>(); 
  4.  
  5.    while(true){ 
  6.       list.add(UUID.randomUUID().toString().intern()); 
  7.    } 

打算把String常量池堆滿,沒想到失敗了,JDK1.7后常量池放到了堆里,也能進行垃圾回收了傲。

馬上第二次嘗試,使用cglib,用Class把老年代取堆滿,嗯,說走咱就走啊。

  1. public static void testPergemOutOfMemory2(){ 
  2.    try { 
  3.       while (true) { 
  4.          Enhancer enhancer = new Enhancer(); 
  5.          enhancer.setSuperclass(OOM.class); 
  6.          enhancer.setUseCache(false); 
  7.          enhancer.setCallback(new MethodInterceptor() { 
  8.             @Override 
  9.             public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 
  10.                return proxy.invokeSuper(obj, args); 
  11.             } 
  12.          }); 
  13.          enhancer.create(); 
  14.       } 
  15.    } 
  16.    catch (Exception e){ 
  17.       e.printStackTrace(); 
  18.    } 

虛擬機成功gg了,那JDK動態代理產生的類能不能撐爆呢?

  1. public static void testPergemOutOfMemory3(){ 
  2.    while(true){ 
  3.    final OOM oom = new OOM(); 
  4.    Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() { 
  5.          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  6.             Object result = method.invoke(oom, args); 
  7.             return result; 
  8.          } 
  9.       }); 
  10.    } 

答案是不行!會進行回收。JDK動態代理產生的類信息,不會放到***代中,而是放在堆中。

  • - [ ] 棧深度溢出
  • - [ ] ***代內存溢出
  • - [√] 本地方法棧溢出
  • - [ ] JVM棧內存溢出
  • - [ ] 堆溢出
  1. public static void testNativeMethodOutOfMemory(){ 
  2.    int j = 0; 
  3.    while(true){ 
  4.       Printer.println(j++); 
  5.       ExecutorService executors = Executors.newFixedThreadPool(50); 
  6.       int i=0; 
  7.       while(i++<10){ 
  8.          executors.submit(new Runnable() { 
  9.             public void run() { 
  10.             } 
  11.          }); 
  12.       } 
  13.    } 

這個的原理就是不斷創建線程池,而每個線程池都創建10個線程,這些線程池都是在本地方法區的,久而久之,本地方法區就爆炸了。

  • - [ ] 棧深度溢出
  • - [ ] ***代內存溢出
  • - [ ] 本地方法棧溢出
  • - [√] JVM棧內存溢出
  • - [ ] 堆溢出
  1. public static void testStackOutOfMemory(){ 
  2.     while (true) {   
  3.             Thread thread = new Thread(new Runnable() {   
  4.                    public void run() { 
  5.                           while(true){ 
  6.                       } 
  7.                    }   
  8.             });   
  9.             thread.start();   
  10.      }   

線程的創建會直接在JVM棧中創建,但是本例子中,沒看到爆炸,主機先掛了,不是JVM掛了,真的是主機掛了,無論在mac還是在windows,都掛了。溫馨提示,這個真的會死機的。。

  • - [ ] 棧深度溢出
  • - [ ] ***代內存溢出
  • - [ ] 本地方法棧溢出
  • - [ ] JVM棧內存溢出
  • - [√] 堆溢出
  1. public static void testOutOfHeapMemory(){ 
  2.    List<StringBuffer> list = new ArrayList<StringBuffer>(); 
  3.    while(true){ 
  4.       StringBuffer B = new StringBuffer(); 
  5.       for(int i = 0 ; i < 10000 ; i++){ 
  6.          B.append(i); 
  7.       } 
  8.       list.add(B); 
  9.    } 

好了終于到了最簡單的環節,不斷往堆中塞新增的StringBuffer對象,堆滿了就直接爆炸了。

妥妥的。小伙伴們拿回去好好玩吧,就醬。

【本文為51CTO專欄作者“大蕉”的原創稿件,轉載請通過作者微信公眾號“一名叫大蕉的程序員”獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-06-29 11:00:49

2010-06-18 10:13:17

虛擬機消失

2012-05-18 10:22:23

2013-07-17 09:32:58

2010-07-26 09:02:38

2010-09-17 15:12:57

JVMJava虛擬機

2020-06-03 19:07:49

Java虛擬機JVM

2020-08-27 22:18:27

WindowsLinux虛擬機

2020-09-14 14:30:31

WindowsLinux命令

2011-12-28 13:24:47

JavaJVM

2009-06-12 15:41:01

Java虛擬機

2018-06-19 15:39:21

HeapJava虛擬機

2020-05-08 16:55:48

Java虛擬機JVM

2011-06-22 13:35:55

JVM

2009-06-12 16:15:42

死鎖Java虛擬機

2020-06-03 14:43:26

Java虛擬機JVM

2014-02-21 11:20:34

KVMXen虛擬機

2020-01-17 10:52:37

無服務器容器技術

2010-12-23 14:05:12

虛擬機

2012-04-10 10:29:29

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99这里只有精品视频 | 国产三级国产精品 | 久久成人免费 | 久久av网站 | 国产精品一区二区av | 日韩中文字幕 | 成人啊啊啊 | 成人国产精品久久 | 国产日韩一区二区三免费 | 色婷婷亚洲国产女人的天堂 | 黄色一级大片在线免费看产 | 亚洲人成人一区二区在线观看 | 中文字幕一区在线观看视频 | 亚洲97 | 亚洲美女天堂网 | 美女久久 | 国产精品日日摸夜夜添夜夜av | 国产成人一区二区三区电影 | 视频一区二区中文字幕 | 亚洲第一av| 97精品国产97久久久久久免费 | 欧美一区二区三区四区在线 | 日本精品一区二区 | 在线视频中文字幕 | 99精品国自产在线 | 欧美一级片在线观看 | 91精品国产91久久综合桃花 | 精品国产一区二区三区日日嗨 | 免费一级欧美在线观看视频 | 97精品国产97久久久久久免费 | 国产又色又爽又黄又免费 | 中文字幕在线一区二区三区 | 国产精品三级久久久久久电影 | 午夜成人免费视频 | 国产高清精品一区二区三区 | 国产视频久久久 | 中文字幕 欧美 日韩 | 伊人色综合久久久天天蜜桃 | 精品丝袜在线 | 精品国产一区二区三区久久 | 日韩欧美在线免费 |