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

都知道堆內(nèi)存要回收垃圾,如何在開發(fā)中使用對(duì)象來(lái)減少內(nèi)存使用

存儲(chǔ) 存儲(chǔ)軟件
堆內(nèi)存我們大家都知道JVM內(nèi)存是劃分了一個(gè)是堆內(nèi)存,一個(gè)是非堆內(nèi)存,而堆內(nèi)存分為了(年輕代),(老年代)這些,而非堆內(nèi)存就是一個(gè)元空間了(1.8之后變更的,之前是永久代)。

[[379173]]

本文轉(zhuǎn)載自微信公眾號(hào)「Java極客技術(shù)」,作者鴨血粉絲。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java極客技術(shù)公眾號(hào)。  

堆內(nèi)存

我們大家都知道JVM內(nèi)存是劃分了一個(gè)是堆內(nèi)存,一個(gè)是非堆內(nèi)存,而堆內(nèi)存分為了(年輕代),(老年代)這些,而非堆內(nèi)存就是一個(gè)元空間了(1.8之后變更的,之前是永久代)。

相比較來(lái)說(shuō),大家肯定都非常的熟悉分代的概念,知道對(duì)象首先應(yīng)該放在哪里,然后移動(dòng)到哪里,最后執(zhí)行什么樣子的方法來(lái)進(jìn)行垃圾回收。而我們今天要說(shuō)的卻是如何考慮運(yùn)行程序的機(jī)器內(nèi)存限制下,讓我們的對(duì)象更小一點(diǎn)就能完成我們的功能。

減少對(duì)象大小

阿粉和大家都一樣,都知道對(duì)象會(huì)占用一定數(shù)量的堆內(nèi)存,畢竟你新生成的對(duì)象首先就是要放到Eden區(qū)的,當(dāng)Eden空間被占滿的時(shí)候,出發(fā)Minor GC,存活下來(lái)的對(duì)象移動(dòng)到Survivor區(qū)去,而我們想要減少內(nèi)存的使用,最簡(jiǎn)單的方法就是在寫程序的時(shí)候,也需要考慮對(duì)象的大小,畢竟如果說(shuō)如果說(shuō)以后再做CodeReview的時(shí)候,你會(huì)發(fā)現(xiàn)你的代碼運(yùn)行起來(lái),你看JVM的時(shí)候會(huì)賞心悅目,但是代碼也得好看不是?

阿粉就給大家看看最基礎(chǔ)的Java基礎(chǔ)實(shí)例變量的大小

圖1:

 

實(shí)例變量,這是一個(gè)和對(duì)象息息相關(guān)的,一個(gè)對(duì)象一份實(shí)例變量,而實(shí)例變量的個(gè)數(shù)和實(shí)例變量的大小也就決定你在占用內(nèi)存的大小。

大家可以想象一下,如果內(nèi)存不夠,那么有兩種方式供你選擇:

  • 選擇一:增加百分之10的堆內(nèi)存
  • 選擇二:堆中的對(duì)象的大小減少百分之10

你會(huì)選擇什么方式?一般情況你想選擇第一種方式,但是這種方式好像不是那么的實(shí)際,你堆內(nèi)存都不夠了,你還想再繼續(xù)增加點(diǎn)?那么只能你來(lái)選擇第二種了。

但是再你選擇了第二種方式之后,你又遇到了一個(gè)問(wèn)題,減少對(duì)象的方式也是有兩種方式:

  • 方式一:直接減少實(shí)例變量的數(shù)量
  • 方式二:減少實(shí)例變量的大小

其實(shí)這兩種方式都可以,這個(gè)就是要取決于你在之前代碼中做過(guò)什么,比如說(shuō)你在之前的代碼已經(jīng)進(jìn)行過(guò)實(shí)例變量的優(yōu)化了,在寫代碼之前就已經(jīng)考慮到這件事了,那么你肯定是只能選擇第一種。

如果說(shuō)你之前在代碼中并沒有去考慮過(guò)實(shí)例變量的大小,那么選擇第一種將會(huì)是你最佳的方案。

分析對(duì)象大小

一個(gè)對(duì)象的大小,我們要把它分開,由三部分來(lái)組成,對(duì)象頭、實(shí)例變量、內(nèi)存補(bǔ)充,在32位的系統(tǒng)中,假設(shè)我們定義一個(gè)int i ,那么對(duì)象頭在其中就要占據(jù) 4 字節(jié),int 在對(duì)象中占用 4 字節(jié),而如果是64位的話,那么對(duì)象頭就變了,從4字節(jié)變成8字節(jié),在這里我們就得注意一個(gè)事情了,如果說(shuō)成員變量不論是否引用了其他的對(duì)象,它占用的字節(jié)始終是 4 字節(jié)。

這里我們就引入了一個(gè)概念:Shallow Size

Shallow Size

其實(shí)簡(jiǎn)單來(lái)說(shuō),Shallow Size 就是對(duì)象本身占用內(nèi)存的大小,但是不包含其中引用的對(duì)象,這局話的后半段就是相對(duì)應(yīng)的阿粉剛才所說(shuō)的注意事項(xiàng)了。

而 Shallow Size 也是有針對(duì)的,就比如說(shuō)是非數(shù)組類型的對(duì)象,他的大小就是對(duì)象和他所有成員變量大小的總和,

針對(duì)數(shù)組類型的對(duì)象,它的大小是數(shù)組元素對(duì)象的大小的總和。

舉個(gè)例子:

  1. public class A(){ 
  2.     private int i ; 
  3.     private boolen x; 

我們的A對(duì)象在我們New出來(lái)之后,發(fā)現(xiàn),不是一個(gè)數(shù)組類型的,那么就得看成員變量,然后把成員變量加起來(lái),是不是就等于 Shallow Size 了。

Retained Size

說(shuō)了Shallow Size了,那么我們就不得不提 Retained Size了,因?yàn)榘⒎墼趯W(xué)習(xí)的時(shí)候,去專門翻找了資料,發(fā)現(xiàn)這都是一體的,你看這個(gè),你發(fā)現(xiàn)下面還有和他有關(guān)聯(lián)的,不學(xué)吧,弄不明白心里難受,那還是學(xué)習(xí)吧。

英文復(fù)制

Retained Size = 當(dāng)前對(duì)象的大小+當(dāng)前對(duì)象的引用大小(直接或者間接)都是

示例圖:

 

圖片網(wǎng)址如下https://www.yourkit.com/docs/java/help/sizes.jsp 里面也有解釋,但是阿粉還是要解釋一波。

在上圖中 obj1 的 Retained Size = obj1 + obj2 + obj4 的 Shallow size

這是左邊的,右邊的是obj1 的 Retained Size = obj1 + obj2 + obj4 +obj3 的 Shallow size

在我們進(jìn)行GC的時(shí)候,Retained Size是必不可少的,它有助于了解內(nèi)存的結(jié)構(gòu)(聚類)和對(duì)象子圖之間的依賴關(guān)系,以及查找這些子圖的潛在根源。

不過(guò)說(shuō)實(shí)在的,因?yàn)镴VM的存在,他自己的垃圾回收機(jī)制已經(jīng)算是非常的不錯(cuò)了,但是因?yàn)槲覀冊(cè)谌粘5臉I(yè)務(wù)中的需要,我們?nèi)匀恍枰W(xué)習(xí)這些內(nèi)容,畢竟萬(wàn)一在以后的實(shí)際工作中真的遇到了,你會(huì)發(fā)現(xiàn)你現(xiàn)在學(xué)的內(nèi)容是非常有用的。

文獻(xiàn)參考

 

《YouKit》 《Java性能權(quán)威指南》

 

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2023-12-19 21:52:51

Go垃圾回收開發(fā)

2022-04-29 08:05:06

內(nèi)存堆外GC

2025-01-20 08:40:00

Python對(duì)象

2019-04-23 15:20:26

JavaScript對(duì)象前端

2017-04-25 14:39:55

JVM內(nèi)存Java

2014-12-19 11:07:40

Java

2011-08-15 16:28:06

Cocoa內(nèi)存管理

2018-08-13 09:57:15

LinuxFio硬盤性能

2009-12-09 17:28:34

PHP垃圾回收機(jī)制

2019-06-24 19:00:09

JavaScript內(nèi)存泄漏垃圾回收

2017-10-20 08:52:11

內(nèi)存緩存并發(fā)模式Linux

2024-02-04 09:18:00

Python內(nèi)存管理垃圾回收

2019-08-01 08:00:04

AWS虛擬機(jī)Lightsail

2023-05-31 09:00:00

2010-09-26 16:42:04

JVM內(nèi)存組成JVM垃圾回收

2023-02-28 07:56:07

V8內(nèi)存管理

2009-09-02 09:23:26

.NET內(nèi)存管理機(jī)制

2017-02-21 16:40:16

Android垃圾回收內(nèi)存泄露

2022-07-10 23:15:46

Go語(yǔ)言內(nèi)存

2013-10-11 17:32:18

Linux運(yùn)維內(nèi)存管理
點(diǎn)贊
收藏

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