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

深入Java虛擬機(jī)之內(nèi)存優(yōu)化

開發(fā) 后端
前面一篇文章介紹了Java虛擬機(jī)的體系結(jié)構(gòu)和內(nèi)存模型,既然提到內(nèi)存,就不得不說到內(nèi)存泄露。下文將詳細(xì)講解關(guān)于內(nèi)存的優(yōu)化。

前面一篇文章介紹了Java虛擬機(jī)的體系結(jié)構(gòu)和內(nèi)存模型,既然提到內(nèi)存,就不得不說到內(nèi)存泄露。眾所周知,Java是從C++的基礎(chǔ)上發(fā)展而來的,而C++程序的很大的一個(gè)問題就是內(nèi)存泄露難以解決,盡管Java的JVM有一套自己的垃圾回收機(jī)制來回收內(nèi)存,在許多情況下并不需要java程序開發(fā)人員操太多的心,但也是存在泄露問題的,只是比C++小一點(diǎn)。比如說,程序中存在被引用但無用的對(duì)象:程序引用了該對(duì)象,但后續(xù)不會(huì)或者不能再使用它,那么它占用的內(nèi)存空間就浪費(fèi)了。

我們先來看看GC是如何工作的:監(jiān)控每一個(gè)對(duì)象的運(yùn)行狀態(tài),包括對(duì)象的申請(qǐng)、引用、被引用、賦值等,當(dāng)該對(duì)象不再被引用時(shí),釋放對(duì)象(GC本文的重點(diǎn),不做過多闡述)。很多Java程序員過分依賴GC,但問題的關(guān)鍵是無論JVM的垃圾回收機(jī)制做得多好,內(nèi)存總歸是有限的資源,因此就算GC會(huì)為我們完成了大部分的垃圾回收,但適當(dāng)?shù)刈⒁饩幋a過程中的內(nèi)存優(yōu)化還是很必要的。這樣可以有效的減少GC次數(shù),同時(shí)提升內(nèi)存利用率,***限度地提高程序的效率。

總體而言,Java虛擬機(jī)的內(nèi)存優(yōu)化應(yīng)從兩方面著手:Java虛擬機(jī)和Java應(yīng)用程序。前者指根據(jù)應(yīng)用程序的設(shè)計(jì)通過虛擬機(jī)參數(shù)控制虛擬機(jī)邏輯內(nèi)存分區(qū)的大小以使虛擬機(jī)的內(nèi)存與程序?qū)?nèi)存的需求相得益彰;后者指優(yōu)化程序算法,降低GC負(fù)擔(dān),提高GC回收成功率。

通過參數(shù)優(yōu)化虛擬機(jī)內(nèi)存的參數(shù)如下所示:

◆  Xms

初始Heap大小

◆ Xmx

java heap***值

◆ Xmn

young generation的heap大小

◆ Xss

每個(gè)線程的Stack大小

上面是三個(gè)比較常用的參數(shù),還有一些:

◆ XX:MinHeapFreeRatio=40

Minimum percentage of heap free after GC to avoid expansion.

◆ XX:MaxHeapFreeRatio=70

Maximum percentage of heap free after GC to avoid shrinking.

◆ XX:NewRatio=2

Ratio of new/old generation sizes. [Sparc -client:8; x86 -server:8; x86 -client:12.]-client:8 (1.3.1+), x86:12]

◆ XX:NewSize=2.125m

Default size of new generation (in bytes) [5.0 and newer: 64 bit VMs are scaled 30% larger; x86:1m; x86, 5.0 and older: 640k]

◆ XX:MaxNewSize=

Maximum size of new generation (in bytes). Since 1.4, MaxNewSize is computed as a function of NewRatio.

◆ XX:SurvivorRatio=25

Ratio of eden/survivor space size [Solaris amd64: 6; Sparc in 1.3.1: 25; other Solaris platforms in 5.0 and earlier: 32]

◆ XX:PermSize=

Initial size of permanent generation

◆ XX:MaxPermSize=64m

Size of the Permanent Generation. [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]

下面所說通過優(yōu)化程序算法來提高內(nèi)存利用率,并降低內(nèi)存風(fēng)險(xiǎn),完全是經(jīng)驗(yàn)之談,僅供參考,如有不妥,請(qǐng)指正,謝謝!

1.盡早釋放無用對(duì)象的引用(XX = null;)

看一段代碼:

  1. public List<PageData> parse(HtmlPage page) {  
  2.         List<PageData> list = null;          
  3.         try {  
  4.             List valueList = page.getByXPath(config.getContentXpath());  
  5.             if (valueList == null || valueList.isEmpty()) {  
  6.                 return list;  
  7.             }  
  8.             //需要時(shí)才創(chuàng)建對(duì)象,節(jié)省內(nèi)存,提高效率  
  9.             list = new ArrayList<PageData>();  
  10.             PageData pageData = new PageData();  
  11.             StringBuilder value = new StringBuilder();  
  12.             for (int i = 0; i < valueList.size(); i++) {  
  13.                 HtmlElement content = (HtmlElement) valueList.get(i);  
  14.                 DomNodeList<HtmlElement> imgs = content.getElementsByTagName("img");  
  15.                 if (imgs != null && !imgs.isEmpty()) {  
  16.                     for (HtmlElement img : imgs) {  
  17.                         try {  
  18.                             HtmlImage image = (HtmlImage) img;  
  19.                             String path = image.getSrcAttribute();  
  20.                             String format = path.substring(path.lastIndexOf("."), path.length());  
  21.                             String localPath = "D:/images/" + MD5Helper.md5(path).replace("\\", ",").replace("/", ",") + format;  
  22.                             File localFile = new File(localPath);  
  23.                             if (!localFile.exists()) {  
  24.                                 localFile.createNewFile();  
  25.                                 image.saveAs(localFile);  
  26.                             }  
  27.                             image.setAttribute("src""file:///" + localPath);  
  28.                             localFile = null;  
  29.                             image = null;  
  30.                             img = null;  
  31.                         } catch (Exception e) {  
  32.                         }  
  33.                     }  
  34.                     //這個(gè)對(duì)象以后不會(huì)在使用了,清除對(duì)其的引用,等同于提前告知GC,該對(duì)象可以回收了  
  35.                     imgs = null;  
  36.                 }  
  37.                 String text = content.asXml();  
  38.                 value.append(text).append("<br/>");  
  39.                 valueList=null;  
  40.                 content = null;  
  41.                 text = null;  
  42.             }  
  43.             pageData.setContent(value.toString());  
  44.             pageData.setCharset(page.getPageEncoding());             
  45.             list.add(pageData);  
  46.             //這里 pageData=null; 是沒用的,因?yàn)閘ist仍然持有該對(duì)象的引用,GC不會(huì)回收它  
  47.             value=null;  
  48.             //這里可不能 list=null; 因?yàn)閘ist是方法的返回值,否則你從該方法中得到的返回值永遠(yuǎn)為空,而且這種錯(cuò)誤不易被發(fā)現(xiàn)、排除  
  49.         } catch (Exception e) {              
  50.         }          
  51.         return list;  

2.謹(jǐn)慎使用集合數(shù)據(jù)類型,如數(shù)組,樹,圖,鏈表等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)對(duì)GC來說回收更復(fù)雜。

3.避免顯式申請(qǐng)數(shù)組空間,不得不顯式申請(qǐng)時(shí),盡量準(zhǔn)確估計(jì)其合理值。

4.盡量避免在類的默認(rèn)構(gòu)造器中創(chuàng)建、初始化大量的對(duì)象,防止在調(diào)用其自類的構(gòu)造器時(shí)造成不必要的內(nèi)存資源浪費(fèi)

5.盡量避免強(qiáng)制系統(tǒng)做垃圾內(nèi)存的回收,增長系統(tǒng)做垃圾回收的最終時(shí)間

6.盡量做遠(yuǎn)程方法調(diào)用類應(yīng)用開發(fā)時(shí)使用瞬間值變量,除非遠(yuǎn)程調(diào)用端需要獲取該瞬間值變量的值。

7.盡量在合適的場景下使用對(duì)象池技術(shù)以提高系統(tǒng)性能

原文鏈接:http://yshjava.iteye.com/blog/1328015

【編輯推薦】

  1. 深入Java虛擬機(jī)之虛擬機(jī)體系結(jié)構(gòu)
  2. Java與XML:采用DOM操作XML文件
  3. 從Java的角度理解Ext的extend
  4. Windows 64位環(huán)境的Java服務(wù)配置
  5. Grizzly 2.2發(fā)布 開源Java NIO框架
責(zé)任編輯:林師授 來源: 楊勝寒的博客
相關(guān)推薦

2011-12-28 13:24:47

JavaJVM

2012-11-14 09:57:46

JavaJava虛擬機(jī)JVM

2012-03-05 11:09:01

JavaClass

2019-07-24 16:04:47

Java虛擬機(jī)并發(fā)

2024-03-29 11:42:21

Java虛擬機(jī)

2024-04-10 07:40:45

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

2024-03-26 07:30:07

Java虛擬機(jī)源文件

2024-04-03 13:49:00

Java虛擬機(jī)方法區(qū)

2009-09-09 08:05:51

優(yōu)化VMware Se

2015-09-16 15:21:23

Android性能優(yōu)化內(nèi)存

2016-12-22 17:21:11

Android性能優(yōu)化內(nèi)存泄漏

2009-06-04 16:27:39

Java虛擬機(jī)JVMGC

2012-01-18 11:24:18

Java

2018-09-11 14:24:34

Java虛擬機(jī)優(yōu)化

2023-01-26 00:06:05

JAVA虛擬機(jī)優(yōu)化

2010-03-15 14:24:59

StackHeapJVM

2011-12-25 15:33:13

ibmdwKVM

2016-09-01 12:37:13

OpenStack虛擬機(jī)Metadata

2012-05-18 10:22:23

2015-12-28 11:41:57

JVM內(nèi)存區(qū)域內(nèi)存溢出
點(diǎn)贊
收藏

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