日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!

發(fā)布時(shí)間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:3分鐘 快速理解JVM創(chuàng)建對(duì)象的步驟!

我們平時(shí)創(chuàng)建一個(gè)對(duì)象只需要new。然而我們知道對(duì)象的創(chuàng)建到底經(jīng)歷了哪些呢?實(shí)際上只不過僅僅的3步就完成了。先來看看完整的創(chuàng)建過程,再來一步一步的分析。

| 是什么

要?jiǎng)?chuàng)建對(duì)象肯定首先要知道是什么、有沒有。所以首先就是找到對(duì)象的類信息。從上一篇文章中我們知道類信息都是放到方法區(qū)的。

從這里看出類信息放到方法區(qū)是很有必要的,因?yàn)槊總€(gè)線程每個(gè)方法都可能需要這些信息。

| 放哪里

都知道對(duì)象是放到Java堆中的,同時(shí)對(duì)象是隨時(shí)都在創(chuàng)建的,當(dāng)多個(gè)線程運(yùn)行的時(shí)候就有可能把對(duì)象放到同一個(gè)地方,那么肯定就會(huì)有線程拿到不是他想要的對(duì)象。

這里有兩種解決方案:1、把分配內(nèi)存空間這個(gè)操作給同步,虛擬機(jī)采用的CAS失敗重試機(jī)制保證操作的原子性。2、先為每個(gè)現(xiàn)在分配一點(diǎn)內(nèi)存,叫本地線程分配緩沖(Thread Local Allocation Buffer,TLAB),當(dāng)用完的時(shí)候分配新的的時(shí)候在加同步操作。虛擬機(jī)是否使用根據(jù)-XX:+/-UseTLAB參數(shù)設(shè)置。

雖然Java堆是線程共享的,但也有可能一些內(nèi)存實(shí)際上是線程獨(dú)享的。

| 初始化

現(xiàn)在對(duì)象的位置知道了,空間也分配了。但是里面還是空蕩蕩的一塊。現(xiàn)在就要?jiǎng)?chuàng)造出內(nèi)容來。

根據(jù)上圖分三步:

1、 設(shè)置屬性的零值

因?yàn)樵赥LAB模式下,初始化屬性的零值已經(jīng)設(shè)置過了,所以這里有可能不需要設(shè)置。只有設(shè)置了值,我們才能在調(diào)用的時(shí)候才能獲取到正確的值。舉例如下圖:

打印出來分別是0、null、false。我們之所以能打印出來這些,就是因?yàn)檫@里的初始化。如果沒有這一步有可能data1打印出來的就不是0。data2打印出來的就更加不知道是什么了。

2、 設(shè)置頭信息

對(duì)象里面要存必要的東西,比如對(duì)象類型信息。如果是Java數(shù)組還要記錄數(shù)組的長度。以及一些其他信息如下圖:

3、 根據(jù)我們自己的意向再次進(jìn)行配置

這一步就是我們平時(shí)的初始化了,比如new的時(shí)候調(diào)用的構(gòu)造函數(shù),去初始化設(shè)置一些值。

| 找到她

創(chuàng)建好了,那么我們平時(shí)是怎么找到的呢?

結(jié)合我上一篇文章,Java虛擬機(jī)棧來講更加有連貫性。如下圖:

訪問方式一共分兩種:

1、 通過句柄方式訪問。在Java堆中維護(hù)一個(gè)句柄池。每個(gè)句柄包含一個(gè)對(duì)象實(shí)例數(shù)據(jù)指針和一個(gè)對(duì)象類型數(shù)據(jù)指針。然后在Java虛擬機(jī)棧的棧幀里面的變量表對(duì)對(duì)象的引用指向的是句柄。這樣做的好處是在Java堆中進(jìn)行了垃圾回收,對(duì)象的地址發(fā)生了改變的時(shí)候,只需要修改句柄的對(duì)象實(shí)例數(shù)據(jù)指針就行。

2、 直接引用:棧中的引用的是對(duì)象的實(shí)際地址。這樣做的好處是訪問更快。

| 總結(jié)

可以看到JVM創(chuàng)建一個(gè)對(duì)象經(jīng)歷了不少的流程。不過總結(jié)起來和我們平時(shí)做很多事情是一樣。每個(gè)流程都合情合理,不多不少。

每一個(gè)步驟都有可能有問題,但同時(shí)也解決了這些問題。比如類信息為什么是放到方法區(qū)。分配內(nèi)存對(duì)象是并發(fā)問題的處理。

流程的梳理和每個(gè)地方出現(xiàn)問題的解決方式都值得我們平時(shí)開發(fā)的時(shí)候的學(xué)習(xí)。

Java程序員日常學(xué)習(xí)筆記,如理解有誤歡迎各位交流討論!

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。