自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【性能優(yōu)化】納尼?內(nèi)存又溢出了?!是時候總結(jié)一波了??!

存儲 存儲軟件
相信小伙伴們在平時工作的過程中,或多或少都會遇到一個場景:內(nèi)存溢出。如果你沒有遇到過這個場景,那就說明你是個假的程序員。哈哈,開個玩笑,平時工作過程中,我們確實會遇到這個問題。

[[350499]]

 作者個人研發(fā)的在高并發(fā)場景下,提供的簡單、穩(wěn)定、可擴展的延遲消息隊列框架,具有精準的定時任務(wù)和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業(yè)提供了精準定時調(diào)度方案,經(jīng)受住了生產(chǎn)環(huán)境的考驗。為使更多童鞋受益,現(xiàn)給出開源框架地址:https://github.com/sunshinelyz/mykit-delay

寫在前面

相信小伙伴們在平時工作的過程中,或多或少都會遇到一個場景:內(nèi)存溢出。如果你沒有遇到過這個場景,那就說明你是個假的程序員。哈哈,開個玩笑,平時工作過程中,我們確實會遇到這個問題。今天,我就將平時工作過程中遇到的內(nèi)存溢出情況做個簡單的總結(jié),以通俗易懂的代碼案例的形式直觀的分享給大家。希望能夠為小伙伴們帶來實質(zhì)性的幫助。

案例介紹

這里,我將在平時工作過程中總結(jié)的內(nèi)存溢出的情況,以代碼案例的形式直觀的分享給大家,希望能夠為小伙伴們帶來實質(zhì)性的幫助。

接下來,我們就以代碼案例的形式來分析各種內(nèi)存溢出的情況。

定義主類結(jié)構(gòu)

首先,我們創(chuàng)建一個類叫做BlowUpJVM,所有的案例實驗都是基于這個類進行。

  1. public class BlowUpJVM {   
  2. }  

棧深度溢出

  1. public static void  testStackOverFlow(){  
  2.       BlowUpJVM.testStackOverFlow();  
  3. }  

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

永久代內(nèi)存溢出

  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.    }  
  8. }  

打算把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.    }  
  19. }  

虛擬機成功內(nèi)存溢出了,那JDK動態(tài)代理產(chǎn)生的類能不能溢出呢?

  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.    }  
  11. }  

事實表明,JDK動態(tài)代理差生的類不會造成內(nèi)存溢出,原因是:JDK動態(tài)代理產(chǎn)生的類信息,不會放到永久代中,而是放在堆中。

本地方法棧溢出

  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.    }  
  14. }  

這個的原理就是不斷創(chuàng)建線程池,而每個線程池都創(chuàng)建10個線程,這些線程池都是在本地方法區(qū)的,久而久之,本地方法區(qū)就溢出了。

JVM棧內(nèi)存溢出

  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.      }    
  11. }  

線程的創(chuàng)建會直接在JVM棧中創(chuàng)建,但是本例子中,沒看到內(nèi)存溢出,主機先掛了,不是JVM掛了,真的是主機掛了,無論在mac還是在windows,都掛了。

溫馨提示,這個真的會死機的。

堆溢出

  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.    }  
  10. }  

不斷往堆中塞新增的StringBuffer對象,堆滿了就直接溢出了。

本文轉(zhuǎn)載自微信公眾號「冰河技術(shù)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系冰河技術(shù)公眾號。

 

 

責任編輯:武曉燕 來源: 冰河技術(shù)
相關(guān)推薦

2020-08-06 17:16:47

抖音Tiktok美國

2021-09-01 13:46:07

GitHub Copi漏洞代碼訓練

2020-04-15 10:28:57

QQ騰訊更新

2021-12-26 00:13:24

Log4jLogback漏洞

2021-11-08 12:44:48

AndroidC++內(nèi)存

2015-11-17 12:56:33

浪潮SC15

2021-12-07 08:27:19

RTTI運行類型

2014-11-17 09:36:45

2023-03-30 07:34:10

Linux性能數(shù)據(jù)結(jié)構(gòu)

2021-01-01 09:03:44

故障HAProxy服務(wù)器

2021-08-06 11:06:35

欺詐攻擊垃圾郵件廣告

2009-06-15 09:47:12

Java程序內(nèi)存溢出

2024-09-09 09:41:03

內(nèi)存溢出golang開發(fā)者

2018-07-27 15:04:36

比特幣ETF市場

2021-09-09 18:12:22

內(nèi)存分段式網(wǎng)絡(luò)

2014-09-02 10:19:22

IT程序員

2010-10-21 14:38:07

網(wǎng)絡(luò)融合

2019-05-23 10:59:24

Java內(nèi)存 C++

2021-08-26 05:00:44

生產(chǎn)環(huán)境內(nèi)存

2021-11-04 18:27:02

緩存架構(gòu)Eureka
點贊
收藏

51CTO技術(shù)棧公眾號