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

JVM概念之Java對(duì)象的大小與引用類型

開發(fā) 后端
在Java中,基本數(shù)據(jù)的類型的大小是固定的,不過對(duì)于非基本類型的Java對(duì)象,大小是視情況而定的。另外,Java的三種引用類型也有不同的用法。本文總結(jié)了這兩個(gè)JVM概念。

本文來自和你在一起的博客,原文標(biāo)題:《JVM調(diào)優(yōu)總結(jié)(二)-一些概念》。本文總結(jié)了JVM概念中的Java對(duì)象的大小,以及三種引用類型的定義與區(qū)分。

基本數(shù)據(jù)的類型的大小是固定的,這里就不多說了。對(duì)于非基本類型的Java對(duì)象,其大小就值得商榷。

在Java中,一個(gè)空Object對(duì)象的大小是8byte,這個(gè)大小只是保存堆中一個(gè)沒有任何屬性的對(duì)象的大小。看下面語句:

  1. Object ob = new Object(); 

這樣在程序中完成了一個(gè)Java對(duì)象的生命,但是它所占的空間為:4byte+8byte。4byte是上面部分所說的Java棧中保存引用的所需要的空間。而那8byte則是Java堆中對(duì)象的信息。因?yàn)樗械腏ava非基本類型的對(duì)象都需要默認(rèn)繼承Object對(duì)象,因此不論什么樣的Java對(duì)象,其大小都必須是大于8byte。

有了Object對(duì)象的大小,我們就可以計(jì)算其他對(duì)象的大小了。

  1. Class NewObject {  
  2. int count;  
  3. boolean flag;  
  4. Object ob;  

其大小為:空對(duì)象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因?yàn)镴ava在對(duì)對(duì)象內(nèi)存分配時(shí)都是以8的整數(shù)倍來分,因此大于17byte的最接近8的整數(shù)倍的是24,因此此對(duì)象的大小為24byte。

#t#這里需要注意一下基本類型的包裝類型的大小。因?yàn)檫@種包裝類型已經(jīng)成為對(duì)象了,因此需要把他們作為對(duì)象來看待。包裝類型的大小至少是12byte(聲明一個(gè)空Object至少需要的空間),而且12byte沒有包含任何有效信息,同時(shí),因?yàn)镴ava對(duì)象大小是8的整數(shù)倍,因此一個(gè)基本類型包裝類的大小至少是16byte。這個(gè)內(nèi)存占用是很恐怖的,它是使用基本類型的N倍(N>2),有些類型的內(nèi)存占用更是夸張(隨便想下就知道了)。因此,可能的話應(yīng)盡量少使用包裝類。在JDK5.0以后,因?yàn)榧尤肓俗詣?dòng)類型裝換,因此,Java虛擬機(jī)會(huì)在存儲(chǔ)方面進(jìn)行相應(yīng)的優(yōu)化。

引用類型

對(duì)象引用類型分為強(qiáng)引用、軟引用、弱引用和虛引用。

強(qiáng)引用:就是我們一般聲明對(duì)象是時(shí)虛擬機(jī)生成的引用,強(qiáng)引用環(huán)境下,垃圾回收時(shí)需要嚴(yán)格判斷當(dāng)前對(duì)象是否被強(qiáng)引用,如果被強(qiáng)引用,則不會(huì)被垃圾回收

軟引用:軟引用一般被做為緩存來使用。與強(qiáng)引用的區(qū)別是,軟引用在垃圾回收時(shí),虛擬機(jī)會(huì)根據(jù)當(dāng)前系統(tǒng)的剩余內(nèi)存來決定是否對(duì)軟引用進(jìn)行回收。如果剩余內(nèi)存比較緊張,則虛擬機(jī)會(huì)回收軟引用所引用的空間;如果剩余內(nèi)存相對(duì)富裕,則不會(huì)進(jìn)行回收。換句話說,虛擬機(jī)在發(fā)生OutOfMemory時(shí),肯定是沒有軟引用存在的。

弱引用:弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在進(jìn)行垃圾回收時(shí),是一定會(huì)被回收掉的,因此其生命周期只存在于一個(gè)垃圾回收周期內(nèi)。

強(qiáng)引用不用說,我們系統(tǒng)一般在使用時(shí)都是用的強(qiáng)引用。而“軟引用”和“弱引用”比較少見。他們一般被作為緩存使用,而且一般是在內(nèi)存大小比較受限的情況下做為緩存。因?yàn)槿绻麅?nèi)存足夠大的話,可以直接使用強(qiáng)引用作為緩存即可,同時(shí)可控性更高。因而,他們常見的是被使用在桌面應(yīng)用系統(tǒng)的緩存。

責(zé)任編輯:yangsai 來源: JavaEye博客
相關(guān)推薦

2009-11-25 11:08:28

JVM基礎(chǔ)概念數(shù)據(jù)類型堆與棧

2020-04-15 21:43:22

JVMJavaVMware

2017-02-27 11:48:58

JVM源碼分析Java

2024-03-27 14:31:57

JVM對(duì)象內(nèi)存

2025-01-02 09:48:52

JVMCARD_元素

2011-06-08 13:03:52

C#值類型引用類型

2021-10-18 15:50:49

Android強(qiáng)引用軟引用

2013-05-23 17:21:16

C#

2024-05-20 08:58:13

Java引用類型垃圾回收器

2011-07-22 17:00:14

java

2009-07-03 14:31:43

學(xué)習(xí)JSP

2020-07-29 14:15:04

JavaJvm算法

2021-10-14 10:25:05

JavaScript類型函數(shù)

2009-06-08 18:05:00

Java進(jìn)階引用

2021-05-16 19:23:11

引用類型包裝

2010-09-27 10:30:42

JVM對(duì)象生命周期

2009-07-08 10:41:54

JDK JRE JVM

2024-11-19 16:14:46

Java開發(fā)

2009-06-19 16:19:23

Java對(duì)象引用

2011-07-11 14:36:05

JAVA
點(diǎn)贊
收藏

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