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

都知道堆內存要回收垃圾,如何在開發中使用對象來減少內存使用

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

[[379173]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。  

堆內存

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

相比較來說,大家肯定都非常的熟悉分代的概念,知道對象首先應該放在哪里,然后移動到哪里,最后執行什么樣子的方法來進行垃圾回收。而我們今天要說的卻是如何考慮運行程序的機器內存限制下,讓我們的對象更小一點就能完成我們的功能。

減少對象大小

阿粉和大家都一樣,都知道對象會占用一定數量的堆內存,畢竟你新生成的對象首先就是要放到Eden區的,當Eden空間被占滿的時候,出發Minor GC,存活下來的對象移動到Survivor區去,而我們想要減少內存的使用,最簡單的方法就是在寫程序的時候,也需要考慮對象的大小,畢竟如果說如果說以后再做CodeReview的時候,你會發現你的代碼運行起來,你看JVM的時候會賞心悅目,但是代碼也得好看不是?

阿粉就給大家看看最基礎的Java基礎實例變量的大小

圖1:

 

實例變量,這是一個和對象息息相關的,一個對象一份實例變量,而實例變量的個數和實例變量的大小也就決定你在占用內存的大小。

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

  • 選擇一:增加百分之10的堆內存
  • 選擇二:堆中的對象的大小減少百分之10

你會選擇什么方式?一般情況你想選擇第一種方式,但是這種方式好像不是那么的實際,你堆內存都不夠了,你還想再繼續增加點?那么只能你來選擇第二種了。

但是再你選擇了第二種方式之后,你又遇到了一個問題,減少對象的方式也是有兩種方式:

  • 方式一:直接減少實例變量的數量
  • 方式二:減少實例變量的大小

其實這兩種方式都可以,這個就是要取決于你在之前代碼中做過什么,比如說你在之前的代碼已經進行過實例變量的優化了,在寫代碼之前就已經考慮到這件事了,那么你肯定是只能選擇第一種。

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

分析對象大小

一個對象的大小,我們要把它分開,由三部分來組成,對象頭、實例變量、內存補充,在32位的系統中,假設我們定義一個int i ,那么對象頭在其中就要占據 4 字節,int 在對象中占用 4 字節,而如果是64位的話,那么對象頭就變了,從4字節變成8字節,在這里我們就得注意一個事情了,如果說成員變量不論是否引用了其他的對象,它占用的字節始終是 4 字節。

這里我們就引入了一個概念:Shallow Size

Shallow Size

其實簡單來說,Shallow Size 就是對象本身占用內存的大小,但是不包含其中引用的對象,這局話的后半段就是相對應的阿粉剛才所說的注意事項了。

而 Shallow Size 也是有針對的,就比如說是非數組類型的對象,他的大小就是對象和他所有成員變量大小的總和,

針對數組類型的對象,它的大小是數組元素對象的大小的總和。

舉個例子:

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

我們的A對象在我們New出來之后,發現,不是一個數組類型的,那么就得看成員變量,然后把成員變量加起來,是不是就等于 Shallow Size 了。

Retained Size

說了Shallow Size了,那么我們就不得不提 Retained Size了,因為阿粉在學習的時候,去專門翻找了資料,發現這都是一體的,你看這個,你發現下面還有和他有關聯的,不學吧,弄不明白心里難受,那還是學習吧。

英文復制

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

示例圖:

 

圖片網址如下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

在我們進行GC的時候,Retained Size是必不可少的,它有助于了解內存的結構(聚類)和對象子圖之間的依賴關系,以及查找這些子圖的潛在根源。

不過說實在的,因為JVM的存在,他自己的垃圾回收機制已經算是非常的不錯了,但是因為我們在日常的業務中的需要,我們仍然需要去學習這些內容,畢竟萬一在以后的實際工作中真的遇到了,你會發現你現在學的內容是非常有用的。

文獻參考

 

《YouKit》 《Java性能權威指南》

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-12-19 21:52:51

Go垃圾回收開發

2022-04-29 08:05:06

內存堆外GC

2011-08-15 16:28:06

Cocoa內存管理

2019-04-23 15:20:26

JavaScript對象前端

2017-04-25 14:39:55

JVM內存Java

2014-12-19 11:07:40

Java

2025-01-20 08:40:00

Python對象

2009-12-09 17:28:34

PHP垃圾回收機制

2018-08-13 09:57:15

LinuxFio硬盤性能

2019-06-24 19:00:09

JavaScript內存泄漏垃圾回收

2019-08-01 08:00:04

AWS虛擬機Lightsail

2024-02-04 09:18:00

Python內存管理垃圾回收

2009-09-02 09:23:26

.NET內存管理機制

2023-02-28 07:56:07

V8內存管理

2010-09-26 16:42:04

JVM內存組成JVM垃圾回收

2017-02-21 16:40:16

Android垃圾回收內存泄露

2017-10-20 08:52:11

內存緩存并發模式Linux

2022-07-10 23:15:46

Go語言內存

2013-10-11 17:32:18

Linux運維內存管理

2019-09-16 19:00:48

Linux變量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 青青青伊人 | 国产一区二区三区久久久久久久久 | 久久国产亚洲 | 国产视频中文字幕 | 国产最新视频在线 | 91在线网站 | 日韩中文一区二区三区 | 国产精品网页 | 成人精品久久 | 国产精品国产a级 | 日韩一区中文字幕 | 91久久综合| 在线一区 | 在线免费观看毛片 | 国产区在线观看 | www.亚洲视频 | 在线免费视频一区 | 四虎精品在线 | 在线亚洲一区二区 | 国产欧美一级二级三级在线视频 | 精品国产一区二区 | 国产一级在线 | 欧美日韩成人一区二区 | 久久一二| 欧美片网站免费 | 逼逼视频 | 国产精品明星裸体写真集 | 日韩黄色免费 | 欧美日韩国产一区二区三区 | 这里只有精品99re | 国产精品久久久久久久久久久免费看 | 国产精品久久久久久久久久久免费看 | 一区二区三区日韩 | 国产精品一区二区av | 黄色一级片在线播放 | 国产精品视频不卡 | 国产午夜高清 | 亚洲欧洲在线视频 | www.4虎影院 国产999精品久久久影片官网 | 亚洲精品成人免费 | 欧美视频成人 |