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

發(fā)現(xiàn)Java虛擬機(jī)內(nèi)存泄露問(wèn)題

原創(chuàng)
開(kāi)發(fā) 后端
內(nèi)存泄露問(wèn)題對(duì)于程序來(lái)說(shuō),是一個(gè)很難發(fā)現(xiàn),并且容易引起嚴(yán)重災(zāi)害的事情。Java一直以其垃圾回收機(jī)制為自豪,那是否這種機(jī)制就是完美的呢。

常規(guī)理解上,Java的內(nèi)存管理機(jī)制是將局部變量保存在堆中,當(dāng)變量的作用域結(jié)束之后,該變量所占用的內(nèi)容會(huì)被自動(dòng)回收。不需要做任何特殊的處理。比如下面的代碼:

  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.         }  
  7.         byte[] data2 = new byte[dataSize];  
  8.     }  
  9.  
  10.     public static void main(String[] args) {  
  11.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  12.         jmp.f();  
  13.     }  

在這個(gè)例子中,方法f()里定義了兩個(gè)局部變量,變量data1和data2的作用域不同。按照正常理解,雖然兩各個(gè)數(shù)組所需要的內(nèi)存之和已經(jīng)超過(guò)了可用內(nèi)存,但是因?yàn)閐ata1會(huì)被及時(shí)回收,不會(huì)出現(xiàn)內(nèi)存溢出錯(cuò)誤。

如果我們實(shí)際執(zhí)行這個(gè)例子,會(huì)發(fā)現(xiàn)出現(xiàn)了java.lang.OutOfMemoryError錯(cuò)誤。這是為什么?如果在BEA或者IBM的虛擬機(jī)上測(cè)試過(guò)這個(gè)例子,并不會(huì)出現(xiàn)錯(cuò)誤。也就是說(shuō),SUN的JVM在內(nèi)存回收機(jī)制上存在漏洞或者BUG。

這個(gè)問(wèn)題該如何修正呢,方法其實(shí)很簡(jiǎn)單。只需要在變量作用域結(jié)束之前,將變量置為空就可以了。修改之后的結(jié)果如下:

  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.             data1 = null;  
  7.         }  
  8.         byte[] data2 = new byte[dataSize];  
  9.     }  
  10.  
  11.     public static void main(String[] args) {  
  12.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  13.         jmp.f();  
  14.     }  

發(fā)現(xiàn)這個(gè)問(wèn)題,對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō)也許會(huì)很緊張,擔(dān)心自己的代碼是否會(huì)出現(xiàn)同樣問(wèn)題。大家盡可放心,連續(xù)出現(xiàn)兩個(gè)變量占用內(nèi)存之和超過(guò)內(nèi)存限制的情況概率非常小。并且在兩個(gè)變量之間,如果定義了其他變量也不會(huì)出現(xiàn)這個(gè)問(wèn)題。如下面的代碼就不會(huì)出現(xiàn)問(wèn)題:

  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.         }  
  7.     int i=1;  
  8.         byte[] data2 = new byte[dataSize];  
  9.     }  
  10.  
  11.     public static void main(String[] args) {  
  12.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  13.         jmp.f();  
  14.     }  

 

【編輯推薦】

  1. 專題:Java線程
  2. Java Swing多線程死鎖問(wèn)題解析
  3. 有趣的Java對(duì)象序列化緩存問(wèn)題
  4. Java實(shí)用技巧:當(dāng)不能拋出checked異常時(shí)
  5. Java編程語(yǔ)言的優(yōu)點(diǎn)快遞
責(zé)任編輯:佚名 來(lái)源: 51CTO
相關(guān)推薦

2019-11-20 15:02:45

Java虛擬機(jī)內(nèi)存

2020-03-10 09:30:11

Java內(nèi)存數(shù)據(jù)

2019-04-09 15:56:46

虛擬機(jī)內(nèi)存區(qū)Java

2009-10-09 09:42:07

虛擬機(jī)內(nèi)存

2011-05-26 15:41:25

java虛擬機(jī)

2009-06-18 13:51:07

Java虛擬機(jī)

2010-09-17 15:47:14

TOMCATJVM

2013-12-23 09:25:21

2018-03-28 14:58:42

虛擬機(jī)內(nèi)核系統(tǒng)

2012-08-14 10:05:08

2011-12-28 13:38:00

JavaJVM

2024-10-31 09:24:42

2017-02-21 16:40:16

Android垃圾回收內(nèi)存泄露

2009-06-17 15:39:00

本機(jī)內(nèi)存硬件限制虛擬內(nèi)存

2020-06-23 09:48:09

Python開(kāi)發(fā)內(nèi)存

2009-06-04 16:27:39

Java虛擬機(jī)JVMGC

2010-09-25 11:32:24

Java內(nèi)存泄漏

2023-06-30 23:25:46

HTTP模塊內(nèi)存

2025-01-08 08:47:44

Node.js內(nèi)存泄露定時(shí)器

2021-04-14 18:58:01

虛擬機(jī) Java內(nèi)存
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 青青草av| 午夜成人免费视频 | 国产一区二区精品在线 | 完全免费av在线 | 亚洲欧美日韩在线不卡 | 中文字幕乱码亚洲精品一区 | 亚洲色综合| 中文字幕在线免费观看 | 99久久婷婷| 亚洲视频中文字幕 | 亚洲一区二区在线免费观看 | 国内自拍偷拍 | 看特级黄色片 | 久久精品日 | 国产高清视频一区二区 | 欧美性网站| 日韩福利 | 亚洲日韩中文字幕一区 | 亚洲成av人片在线观看 | 色男人天堂av| 国产成人网 | 亚洲永久字幕 | 深夜福利亚洲 | 国产精品一区二区av | 色天堂影院 | 亚洲成人av一区二区 | 一级片成人 | 久久99精品久久久 | 毛片一区二区三区 | 欧美www在线 | 九色网址 | 久久久久中文字幕 | 中文字幕av在线一二三区 | 国产又爽又黄的视频 | 福利精品在线观看 | 日日精品 | 国产综合精品一区二区三区 | 中文字幕在线观看日韩 | 综合二区 | 99影视| 欧美网站一区二区 |