日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
優(yōu)化技巧分享:把內(nèi)存消耗降低至原來的1/20

這是最近發(fā)生的又一起內(nèi)存相關的事件了。這個案例是從一個最近的客戶報告中提取出來,一個異常運行的應用在其產(chǎn)品中反復報告內(nèi)存耗盡。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名與空間、虛擬空間、營銷軟件、網(wǎng)站建設、莊河網(wǎng)站維護、網(wǎng)站推廣。

這個癥狀是由我們的一個實驗性功能發(fā)現(xiàn),它主要用來監(jiān)測某一類數(shù)據(jù)結構的使用情況。它提供了一個信號探針,結果會指向問題源代碼的某一位置。為了保護客戶的隱私,我們?nèi)藶橹亟嗽摾硬⒈3炙鎸崍鼍霸诩夹g層面的一致性。你可以免費在此處下載到源碼。

故事開始于一組從外界源加載進來的對象。同外部的信息交互是基于XML的接口,這本身并沒什么大不了的,但事實上“基于XML的格式進行通訊”的實現(xiàn)細節(jié)被分散到了系統(tǒng)的每一個角落。 傳入系統(tǒng)的文檔是首先被轉(zhuǎn)換成XMLBean實例,然后在整個系統(tǒng)范圍內(nèi)被使用,這中做法聽起來有點傻。

整個問題中最核心的部分是一個延遲加載的緩沖方案。緩存的對象是“Person”的實例:

 
 
 
 
  1. // Imports and methods removed to improve readability
  2. public class Person {
  3.     private String id;
  4.     private Date dateOfBirth;
  5.     private String forename;
  6.     private String surname;
  7. }

你也許會說這才能消耗多少內(nèi)存呢。但當我們揭開進一步的細節(jié)時,發(fā)現(xiàn)事情就變了味了。表面上根據(jù)設計,聲稱實現(xiàn)只用到的諸如上文提到的那樣一些簡單的類,但真實的情形是使用了基于模型生成的數(shù)據(jù)結構。使用的模型是諸如下面的這個簡化的XSD片段。

 
 
 
 
  1.     xmlns:xs="http://www.w3.org/2001/XMLSchema"
  2.     elementFormDefault="qualified">
  3.     
  4.         
  5.             
  6.                 
  7.                 
  8.                 
  9.                 
  10.             
  11.         
  12.     

使用XMLBeans,開發(fā)者生成了該模型,并在真實的場景中使用?,F(xiàn)在我們回到開始的這個緩存的方案上來,假設它設計初衷是為了支持最多1.3M Person類的實例,而我們實際卻要塞進去同等數(shù)量的大家伙,這從根上就注定了失敗。

跑一組測試用例后,發(fā)現(xiàn)1.3M個基于XMLBean的生成的實例需要消耗大概1.5GB的堆空間。我們當時想這肯定可以做的更好。

第一個改進是顯而易見的,外部同系統(tǒng)內(nèi)部集成的實現(xiàn)細節(jié)是不應該把影響傳遞給系統(tǒng)的每一個角落的。所以我們把緩存改成了使用簡單的 java.util.HashMap。ID是鍵,Person是值。我們發(fā)現(xiàn)內(nèi)存的消耗立即降低到了214MB。但這還不能令我們滿意。

由于Map中的鍵是一個數(shù),我們有十足的理由使用Trove Collections來進一步降低它的內(nèi)存消耗。這在實現(xiàn)上的改動很快,我們只需把 HashMap 改成 TLongObjectHashMap ,堆的消耗進一步降低到了143MB。

活干到這個程度我們已經(jīng)可以收工了,但是工程師的好奇心驅(qū)使我們要更進一步。不由自主的我們發(fā)現(xiàn)了系統(tǒng)的數(shù)據(jù)存在著大量的重復信息。例如Date Of Birth其實已經(jīng)在ID中編碼了,所以Date Of Birth可以直接從ID中得到,而不必使用額外的空間去它。

經(jīng)過改良,Person類現(xiàn)在變成了這個樣子:

 
 
 
 
  1. // Imports and methods removed to improve readability
  2. public class Person {
  3.     private String id;
  4.     private String forename;
  5.     private String surname;
  6. }

重新跑一邊測試證實我們的改進的確有效,堆消耗降低到了93MB。但是我們還未滿足。

該應用在64位的機器上使用老的JDK6。默認情況下,這么做不能壓縮普通對象的指針的。通過參數(shù)”-XX:UseCompressedOops“切換到壓縮模式使我們獲得了額外的收獲,現(xiàn)在我們的內(nèi)存消耗降低到了73MB。

當然,我們還能走的更遠。比如基于鍵值建立B-tree,但這已經(jīng)開始影響到了代碼的可讀性,所以我們決定到此為止。降低21.5倍的堆內(nèi)存應該已經(jīng)是一個足夠好的結果了。

讓我們在重復一下學到了什么

別把同外部模塊的整合影響到系統(tǒng)的每一個角落

冗余的數(shù)據(jù)可能帶來開銷。在可能的情況下盡量消除它

基本數(shù)據(jù)類型是你最經(jīng)常打交道的朋友,務必知道些關于它們的工具,如果還沒玩過Trove請立刻開始吧

JVM自帶的優(yōu)化技術不可忽視

如果你對這個實驗很好奇,請在此處下載相關的代碼。使用到的的測量工具和其具體描述可以在這篇博文找到。


網(wǎng)站名稱:優(yōu)化技巧分享:把內(nèi)存消耗降低至原來的1/20
文章地址:http://m.5511xx.com/article/cccscjc.html