【奇淫巧技】千行代碼,bug無處藏之JVM調優

數據類型

Java虛擬機中,數據類型可以分爲兩類:基本類型和引用類型。基本類型的變量保存原始值,即:他代表的值就是數值本身;而引用類型的變量保存引用值。“引用值”代表了某個對象的引用,而不是對象本身,對象本身存放在這個引用值所表示的地址的位置。

堆和棧

棧是運行時的的單位,堆是存儲數據的單位。Java中一個線程就會相應有一個線程棧與之對應,因爲不同的線程執行邏輯有所不同,因此需要一個獨立的線程棧。棧因爲是運行單位,因此裏面存儲的信息都是跟當前線程(或程序)相關信息的。包括局部變量、程序運行狀態、方法返回值、基本類型和堆中對象的引用。堆中存的是對象,一個對象的大小是不可估計的,或者說是可以動態變化的。但是在棧中,一個對象只對應了一個4btye的引用。

Java對象的大小

基本的類型都是已知的。對於非基本類型的Java對象,其大小不是固定的。在Java中,一個空的Object對象是8byte,這個大小隻是保存堆中一個沒有任何屬性的對象的大小。

Object o=new Object();

這行語句所佔用的空間是4Byte+8Byte,4Byte是棧中引用的大小,8Byte是堆中對象的大小。因爲所有的Java對象都繼承了Object對象,所有不論是什麼對象,其大小必定大於8Byte。
有了Objcet對象的大小,就可以計算其他對象的大小了。

Class NewObject{    int count;    boolean flag;    Object o;}
  1. 其大小爲空對象(8Byte)+int類型(4Byte)+boolean(1Byte)+空對象Object的引用(4Byte)=17Byte
  2. 但是Java在對對象分配內存大小都是以8的整數倍來分的。所有實際上對象的大小爲24Byte。

這裏需要注意一下基本類型的包裝類型的大小。因爲這種包裝類型已經成爲對象了,因此需要把他們作爲對象來看待。包裝類型的大小至少是12byte(聲明一個空Object至少需要的空間),而且12byte沒有包含任何有效信息,同時,因爲Java對象大小是8的整數倍,因此一個基本類型包裝類的大小至少是16byte。//加入Java開發交流君樣:756584822一起吹水聊天

這個內存佔用是很恐怖的,它是使用基本類型的N倍(N>2),有些類型的內存佔用更是誇張(隨便想下就知道了)。因此,可能的話應儘量少使用包裝類。
在這裏插入圖片描述

引用類型

對象引用類型分爲強引用、軟引用、弱引用和虛引用。

  • 強引用:就是我們一般聲明對象是時虛擬機生成的引用,強引用環境下,垃圾回收時需要嚴格判斷當前對象是否被強引用,如果被強引用,則不會被垃圾回收

  • 軟引用:軟引用一般被做爲緩存來使用。與強引用的區別是,軟引用在垃圾回收時,虛擬機會根據當前系統的剩餘內存來決定是否對軟引用進行回收。如果剩餘內存比較緊張,則虛擬機會回收軟引用所引用的空間;如果剩餘內存相對富裕,則不會進行回收。換句話說,虛擬機在發生OutOfMemory時,肯定是沒有軟引用存在的。

  • 弱引用:弱引用與軟引用類似,都是作爲緩存來使用。但與軟引用不同,弱引用在進行垃圾回收時,是一定會被回收掉的,因此其生命週期只存在於一個垃圾回收週期內。
    虛引用:如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。虛引用主要用來跟蹤對象被垃圾回收器回收的活動。.

在這裏插入圖片描述
image

最新2020整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,
需要獲取這些內容的朋友請加Q君樣:
756584822

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章