偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

發(fā)現Java虛擬機內存泄露問題

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

常規(guī)理解上,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會被及時回收,不會出現內存溢出錯誤。

如果我們實際執(zhí)行這個例子,會發(fā)現出現了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.     }  

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

  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編程語言的優(yōu)點快遞
責任編輯:佚名 來源: 51CTO
相關推薦

2019-11-20 15:02:45

Java虛擬機內存

2020-03-10 09:30:11

Java內存數據

2009-10-09 09:42:07

虛擬機內存

2019-04-09 15:56:46

虛擬機內存區(qū)Java

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

虛擬機內核系統(tǒng)

2012-08-14 10:05:08

2011-12-28 13:38:00

JavaJVM

2024-10-31 09:24:42

2009-06-17 15:39:00

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

2017-02-21 16:40:16

Android垃圾回收內存泄露

2020-06-23 09:48:09

Python開發(fā)內存

2025-10-15 00:26:20

2009-06-04 16:27:39

Java虛擬機JVMGC

2010-09-25 11:32:24

Java內存泄漏

2025-01-08 08:47:44

Node.js內存泄露定時器

2018-12-26 09:45:38

Windows 10修復待機內存
點贊
收藏

51CTO技術棧公眾號