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

發現Java虛擬機內存泄露問題

原創
開發 后端
內存泄露問題對于程序來說,是一個很難發現,并且容易引起嚴重災害的事情。Java一直以其垃圾回收機制為自豪,那是否這種機制就是完美的呢。

常規理解上,Java的內存管理機制是將局部變量保存在堆中,當變量的作用域結束之后,該變量所占用的內容會被自動回收。不需要做任何特殊的處理。比如下面的代碼:

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

在這個例子中,方法f()里定義了兩個局部變量,變量data1和data2的作用域不同。按照正常理解,雖然兩各個數組所需要的內存之和已經超過了可用內存,但是因為data1會被及時回收,不會出現內存溢出錯誤。

如果我們實際執行這個例子,會發現出現了java.lang.OutOfMemoryError錯誤。這是為什么?如果在BEA或者IBM的虛擬機上測試過這個例子,并不會出現錯誤。也就是說,SUN的JVM在內存回收機制上存在漏洞或者BUG。

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

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

發現這個問題,對于Java開發者來說也許會很緊張,擔心自己的代碼是否會出現同樣問題。大家盡可放心,連續出現兩個變量占用內存之和超過內存限制的情況概率非常小。并且在兩個變量之間,如果定義了其他變量也不會出現這個問題。如下面的代碼就不會出現問題:

  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多線程死鎖問題解析
  3. 有趣的Java對象序列化緩存問題
  4. Java實用技巧:當不能拋出checked異常時
  5. Java編程語言的優點快遞
責任編輯:佚名 來源: 51CTO
相關推薦

2019-11-20 15:02:45

Java虛擬機內存

2020-03-10 09:30:11

Java內存數據

2019-04-09 15:56:46

虛擬機內存區Java

2009-10-09 09:42:07

虛擬機內存

2011-05-26 15:41:25

java虛擬機

2009-06-18 13:51:07

Java虛擬機

2010-09-17 15:47:14

TOMCATJVM

2013-12-23 09:25:21

2018-03-28 14:58:42

虛擬機內核系統

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垃圾回收內存泄露

2009-06-17 15:39:00

本機內存硬件限制虛擬內存

2020-06-23 09:48:09

Python開發內存

2009-06-04 16:27:39

Java虛擬機JVMGC

2010-09-25 11:32:24

Java內存泄漏

2025-01-08 08:47:44

Node.js內存泄露定時器

2023-06-30 23:25:46

HTTP模塊內存

2021-04-14 18:58:01

虛擬機 Java內存
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精品一区二区三区 | 亚洲天堂免费 | 91观看 | 成人一区二区三区在线观看 | 亚洲精品美女 | 毛片一级片 | 国产羞羞视频在线观看 | 免费av手机在线观看 | 亚洲国产成人精品女人久久久 | 欧美日韩精品久久久免费观看 | 国产91在线精品 | 日本又色又爽又黄又高潮 | 伊人二区| 久久久久成人精品 | 婷婷色国产偷v国产偷v小说 | 一区二区三区免费 | 色精品视频 | 国产精品免费在线 | 精品国产欧美日韩不卡在线观看 | 国产精品成人在线观看 | 狠狠综合久久av一区二区老牛 | 中文字幕丁香5月 | 99亚洲视频 | www.性色| 精品欧美视频 | 91精品国产91久久综合桃花 | 香蕉视频黄色 | 日本免费一区二区三区四区 | 正在播放国产精品 | 日韩高清中文字幕 | 亚洲色图综合 | 国产一区在线看 | 91亚洲国产成人久久精品网站 | 亚洲日韩中文字幕一区 | 国产高清一区二区三区 | 国产一区三区在线 | 午夜爽爽爽男女免费观看影院 | 国产精品视频观看 | 国产成人精品一区二 | 亚洲国产精品久久久 | 亚洲欧美日韩国产综合 |