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

優(yōu)化技巧分享:把內(nèi)存消耗降低至原來的1/20

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

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

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

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

整個(gè)問題中最核心的部分是一個(gè)延遲加載的緩沖方案。緩存的對(duì)象是“Person”的實(shí)例:

  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;  

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

  1. <xs:schema targetNamespace="http://plumbr.eu" 
  2.     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  3.     elementFormDefault="qualified"> 
  4.     <xs:element name="person"> 
  5.         <xs:complexType> 
  6.             <xs:sequence> 
  7.                 <xs:element name="id" type="xs:string"/> 
  8.                 <xs:element name="dateOfBirth" type="xs:dateTime"/> 
  9.                 <xs:element name="forename" type="xs:string"/> 
  10.                 <xs:element name="surname" type="xs:string"/> 
  11.             </xs:sequence> 
  12.         </xs:complexType> 
  13.     </xs:element> 
  14. </xs:schema> 

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

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

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

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

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

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

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

重新跑一邊測(cè)試證實(shí)我們的改進(jìn)的確有效,堆消耗降低到了93MB。但是我們還未滿足。

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

 

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

讓我們?cè)谥貜?fù)一下學(xué)到了什么

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

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

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

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

如果你對(duì)這個(gè)實(shí)驗(yàn)很好奇,請(qǐng)?jiān)诖颂?a target="_blank" onclick="javascript:_gaq.push(['_trackEvent','download','http://www.plumbr.eu/files/plumbr-optimization-sample.zip']);" >下載相關(guān)的代碼。使用到的的測(cè)量工具和其具體描述可以在這篇博文找到。

原文鏈接: Nikita Salnikov-Tarnovski

譯文鏈接:http://blog.jobbole.com/40666/

責(zé)任編輯:林師授 來源: 伯樂在線
相關(guān)推薦

2010-08-12 09:56:44

Flex內(nèi)存優(yōu)化

2009-12-09 17:33:22

PHP性能優(yōu)化

2011-06-18 04:07:21

2010-08-10 10:17:44

Flex內(nèi)存

2011-08-10 09:06:44

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

2021-12-19 22:36:42

Python代碼開發(fā)

2011-06-13 17:15:20

內(nèi)鏈

2024-08-26 11:50:08

2010-02-04 14:58:06

C++內(nèi)存分配

2011-07-07 18:39:22

SEO

2019-07-16 11:15:04

JavaScriptCSS數(shù)據(jù)庫(kù)

2025-02-27 13:30:00

2011-08-18 14:28:44

數(shù)據(jù)中心能源消耗

2023-11-21 08:03:43

語言架構(gòu)偏移量

2021-06-27 06:25:14

代碼優(yōu)化技巧Java

2023-01-11 11:16:40

2009-08-13 10:39:46

降低IT設(shè)備能源消耗

2013-02-27 10:42:07

前端工具Web

2025-04-11 08:26:41

2021-03-21 20:08:56

AI人工智能機(jī)器學(xué)習(xí)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产精品高 | 午夜久久久久久久久久一区二区 | 欧美激情一区 | 在线观看免费黄色片 | 国产精品综合 | 久草视频在线看 | 瑞克和莫蒂第五季在线观看 | 亚洲视频国产 | www亚洲成人 | 免费成人在线网 | 精品一区二区三区在线观看 | 伊人久久综合影院 | 国产欧美一区二区三区在线看 | 99久久精品免费看国产小宝寻花 | 噜久寡妇噜噜久久寡妇 | 在线观看电影av | 一区中文 | 国产精品国产a | 国产1区2区3区 | 国户精品久久久久久久久久久不卡 | 99精品免费久久久久久久久日本 | 能免费看的av | 国产精品观看 | 国产www成人 | 免费一级毛片 | 国产一区二区免费在线 | 国产精品久久国产精品 | 免费久久精品视频 | 国产成人精品午夜视频免费 | 嫩草视频在线免费观看 | 久久久久国产精品人 | 一区二区国产精品 | 在线视频 中文字幕 | 九七午夜剧场福利写真 | 日本中文字幕一区 | 罗宾被扒开腿做同人网站 | 久久久久久影院 | 成人国产精品一级毛片视频毛片 | 欧美性生活一区二区三区 | 中文字幕第三页 | 日韩视频一级 |