真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java內(nèi)存區(qū)域&內(nèi)存溢出異常介紹

Java 內(nèi)存區(qū)域

洪湖網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司于2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

Heap

線程公有

存放實(shí)例對(duì)象

是GC主要管理區(qū)域,因此可以更細(xì)致的劃分為:新生代、老年代

再細(xì)致一點(diǎn)劃分:Eden區(qū)、From Survivor區(qū)、To Survivor區(qū)

內(nèi)存空間:可以物理上不連續(xù)、邏輯上連續(xù)即可。

Method Area

線程公有

主要存儲(chǔ):類信息、常量、靜態(tài)變量、編譯后的代碼

運(yùn)行時(shí)常量池

主要存儲(chǔ):編譯期的字面量以及符號(hào)引用

具有動(dòng)態(tài)性,即可以在運(yùn)行時(shí)將常量放入池中。

VM Stack

線程私有

主要包括:

局部變量表:存放編譯期的各種基本數(shù)據(jù)類型、對(duì)象引用、returnAddress類型

操作數(shù)棧:每一個(gè)元素可以為任意的java類型,32位數(shù)據(jù)類型所占容量為1,64位數(shù)據(jù)類型所占容量為2

動(dòng)態(tài)連接:class文件的常量池中有大量的符號(hào)引用,這些符號(hào)引用有一部分是在類加載階段或者在第一次使用的時(shí)候就轉(zhuǎn)換為直接引用,這部分成為靜態(tài)解析。另一部分是每一次運(yùn)行的時(shí)候轉(zhuǎn)化為直接引用,這部分即為動(dòng)態(tài)連接。

方法出口:例如A方法中調(diào)用了B方法,B方法的返回值壓入A方法的棧幀中。

Native Method Stack

線程私有

與VM Stack相似,唯一區(qū)別在于該棧為Native方法服務(wù)。

Hot Spot 將VM Stack 與 Native Method Stack 合而為一。

Program Counter Register

線程私有

用于記錄線程執(zhí)行字節(jié)碼的指令的地址。

Direct Memory

NIO中使用直接內(nèi)存,提高效率。

對(duì)象創(chuàng)建過(guò)程

首先當(dāng)虛擬機(jī)遇到一條new指令時(shí),先去檢查該符號(hào)引用代表的類是否已經(jīng)完成類加載,若未完成,則執(zhí)行以下步驟

類加載

為對(duì)象分配內(nèi)存

分配方式:指針碰撞/空閑列表

線程安全:CAS解決

虛擬機(jī)初始化內(nèi)存空間

虛擬機(jī)對(duì)對(duì)象進(jìn)行必要的設(shè)置

執(zhí)行完成初始化

對(duì)象創(chuàng)建完成

對(duì)象內(nèi)存布局

第一部分用于存儲(chǔ)對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),如哈希碼(HashCode)、GC 分代年齡、鎖狀態(tài)標(biāo)志、線程持有的鎖、偏向線程 ID、偏向時(shí)間戳、對(duì)象分代年齡,這部分信息稱為“Mark Word”;Mark Word 被設(shè)計(jì)成一個(gè)非固定的數(shù)據(jù)結(jié)構(gòu)以便在極小的空間內(nèi)存儲(chǔ)盡量多的信息,它會(huì)根據(jù)自己的狀態(tài)復(fù)用自己的存儲(chǔ)空間。

第二部分是類型指針,即對(duì)象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例;

如果對(duì)象是一個(gè) Java 數(shù)組,那在對(duì)象頭中還必須有一塊用于記錄數(shù)組長(zhǎng)度的數(shù)據(jù)。因?yàn)樘摂M機(jī)可以通過(guò)普通 Java 對(duì)象的元數(shù)據(jù)信息確定 Java 對(duì)象的大小,但是從數(shù)組的元數(shù)據(jù)中無(wú)法確定數(shù)組的大小。

在 32 位系統(tǒng)下,存放 Class 指針的空間大小是 4 字節(jié),Mark Word 空間大小也是4字節(jié),因此頭部就是 8 字節(jié),如果是數(shù)組就需要再加 4 字節(jié)表示數(shù)組的長(zhǎng)度。

在 64 位系統(tǒng)及 64 位 JVM 下,開(kāi)啟指針壓縮,那么頭部存放 Class 指針的空間大小還是4字節(jié),而 Mark Word 區(qū)域會(huì)變大,變成 8 字節(jié),也就是頭部最少為 12 字節(jié),如下表所示:

Java內(nèi)存區(qū)域 &內(nèi)存溢出異常 介紹

鄭州人流醫(yī)院 http://mobile.zzzzyy120.com/

壓縮指針:開(kāi)啟指針壓縮使用算法開(kāi)銷帶來(lái)內(nèi)存節(jié)約,Java 對(duì)象都是以 8 字節(jié)對(duì)齊的,也就是以 8 字節(jié)為內(nèi)存訪問(wèn)的基本單元,那么在地理處理上,就有 3 個(gè)位是空閑的,這 3 個(gè)位可以用來(lái)虛擬,利用 32 位的地址指針原本最多只能尋址 4GB,但是加上 3 個(gè)位的 8 種內(nèi)部運(yùn)算,就可以變化出 32GB 的尋址。

對(duì)象訪問(wèn)定位

兩種方式:

句柄池:引用中存儲(chǔ)的是句柄地址,當(dāng)實(shí)例對(duì)象移動(dòng)時(shí),只需要改變句柄對(duì)應(yīng)的指針,不需要改變引用本身,比較穩(wěn)定。

直接指針:速度快,節(jié)省了一次指針定位的開(kāi)銷。

常用指令

invokeinterface:用以調(diào)用接口方法,在運(yùn)行時(shí)搜索一個(gè)實(shí)現(xiàn)了這個(gè)接口方法的對(duì)象,找出適合的方法進(jìn)行調(diào)用。

invokevirtual:指令用于調(diào)用對(duì)象的實(shí)例方法,根據(jù)對(duì)象的實(shí)際類型進(jìn)行分派

invokestatic:用以調(diào)用類方法

invokespecial:指令用于調(diào)用一些需要特殊處理的實(shí)例方法,包括實(shí)例初始化方法、私有方法和父類方法。

invokedynamic:JDK1.7新加入的一個(gè)虛擬機(jī)指令,相比于之前的四條指令,他們的分派邏輯都是固化在JVM內(nèi)部,而invokedynamic則用于處理新的方法分派:它允許應(yīng)用級(jí)別的代碼來(lái)確定執(zhí)行哪一個(gè)方法調(diào)用,只有在調(diào)用要執(zhí)行的時(shí)候,才會(huì)進(jìn)行這種判斷,從而達(dá)到動(dòng)態(tài)語(yǔ)言的支持。

基于棧的指令集 && 基于寄存器的指令集

java采用的是基于棧的指令集,這種指令集依賴操作數(shù)棧進(jìn)行工作

優(yōu)點(diǎn):

可移植:由于寄存器是由硬件直接提供的,所以程序如果依賴寄存器不可避免的會(huì)受到硬件的約束

程序代碼緊湊

編譯器實(shí)現(xiàn)簡(jiǎn)單

缺點(diǎn):

速度慢

指令數(shù)量多:完成相同功能所需的指令比寄存器架構(gòu)多,因?yàn)楣馐侨霔?、出棧就已?jīng)很多指令了

內(nèi)存訪問(wèn)多:頻繁的棧訪問(wèn)意味著頻繁的內(nèi)存訪問(wèn),而對(duì)于處理器來(lái)說(shuō),內(nèi)存始終是速度的瓶頸。

Java內(nèi)存溢出異常

內(nèi)存溢出

堆上無(wú)內(nèi)存可完成實(shí)例分配且堆無(wú)法擴(kuò)展時(shí):java.lang.OutOfMemoryError: Java heap space

方法區(qū)以及內(nèi)存的常量池?zé)o法滿足內(nèi)存分配需求時(shí):java.lang.OutOfMemoryError: PermGen space

棧擴(kuò)展時(shí)無(wú)法申請(qǐng)足夠內(nèi)存:java.lang.StackOverflowError

內(nèi)存泄漏

代碼設(shè)計(jì)引起的程序動(dòng)態(tài)分配的內(nèi)存沒(méi)有釋放,導(dǎo)致該部分內(nèi)存不可用

內(nèi)存溢出與內(nèi)存泄漏的區(qū)別

內(nèi)存泄漏是導(dǎo)致內(nèi)存溢出的原因之一,內(nèi)存泄漏積累起來(lái)就會(huì)導(dǎo)致內(nèi)存溢出

內(nèi)存泄漏可以通過(guò)完善代碼來(lái)解決,內(nèi)存溢出無(wú)法徹底避免,只能通過(guò)配置來(lái)減少發(fā)生的頻率

內(nèi)存泄漏內(nèi)存溢出的檢查

性能監(jiān)測(cè)工具:

JProfiler

Optimizeit Profiler

Eclipse Memory Analyzer

EclipseMAT

JProbe


當(dāng)前標(biāo)題:Java內(nèi)存區(qū)域&內(nèi)存溢出異常介紹
網(wǎng)站網(wǎng)址:http://weahome.cn/article/jjjsgs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部