Java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)
- 作者:新網(wǎng)
- 來源:新網(wǎng)
- 瀏覽:100
- 2018-04-20 14:32:25
Java虛擬機(jī)運(yùn)行時,本地方法棧和Java虛擬機(jī)棧的作用是相似的,他的數(shù)據(jù)區(qū)是怎么運(yùn)行的?感興趣的可以和小編一起往下看。
Java虛擬機(jī)運(yùn)行時,本地方法棧和Java虛擬機(jī)棧的作用是相似的,他的數(shù)據(jù)區(qū)是怎么運(yùn)行的?感興趣的可以和小編一起往下看。
<
div> 一、程序計(jì)數(shù)器
每個Java虛擬機(jī)線程都有自己的程序計(jì)數(shù)器,用于存儲當(dāng)前正在執(zhí)行的虛擬機(jī)指令地址。如果當(dāng)前執(zhí)行的是native方法,那么程序計(jì)數(shù)器的值是undefined。
因?yàn)镴ava虛擬機(jī)多線程是通過線程輪流切換并分配處理器執(zhí)行時間來實(shí)現(xiàn)的,想要線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都必須私有一個程序計(jì)數(shù)器,來存儲當(dāng)前執(zhí)行的虛擬機(jī)指令地址。
二、Java虛擬機(jī)棧
Java虛擬機(jī)棧也是每個線程私有的,它存儲著棧幀數(shù)據(jù)。線程執(zhí)行過程中,每個方法從調(diào)用到返回都對應(yīng)著一個棧幀入棧到出棧的過程。如果程序中使用了遞歸,但是沒有遞歸出口,或者方法調(diào)用超過了所允許的最大深度,那么就會拋出StackOverflowError錯誤,如果沒有超過最大深度,但是沒有足夠的內(nèi)存來創(chuàng)建棧幀,那么會拋出OutOfMemoryError錯誤,這也是Java虛擬機(jī)規(guī)范中說明的兩種錯誤。這里只是舉了兩個例子說明,引發(fā)錯誤的可能還有其他方式。
棧幀,棧幀存儲數(shù)據(jù)和部分結(jié)果,以及方法返回值和異常分發(fā)。每次調(diào)用方法的時候都會創(chuàng)建一個新的棧幀,方法退出時銷毀(無論異常還是正常返回)。棧幀是線程的虛擬機(jī)棧中分配的,每個棧幀都有一個局部變量數(shù)組,操作數(shù)棧以及對當(dāng)前類當(dāng)前方法的常量池的引用。
三、Java堆
堆是Java虛擬機(jī)最重要的內(nèi)存區(qū)域,堆是所有線程共享的區(qū)域,也是垃圾收集器管理的主要區(qū)域。主要目的是存放實(shí)例數(shù)據(jù)和數(shù)組的內(nèi)存。堆中又分為新生代、老年代、永久代(Java8以后就去掉了),新生代有分為Eden
空間、s1和s2。分這么多區(qū)間是為了更好的管理內(nèi)存。關(guān)于各個區(qū)域分配的細(xì)節(jié)以后另起一篇文章解釋。以下參數(shù)可以指定各個空間的大小和比例:
-Xms50M,設(shè)置最小堆內(nèi)存為50M
-Xmx512M,設(shè)置最大堆內(nèi)存為512M
-XX:NewSize=128m,設(shè)置新生代大小為128M
-XX:MaxNewSize=128M,設(shè)置新生代最大大小為128M
-XX:NewRatio=4,設(shè)置老年代和新生代的比例為4:1
-XX:SurvivorRatio=4,設(shè)置Eden和一個s1空間的比例為4:1,那么Eden:s1:s2是4:1:1
四、方法區(qū)(永久代)
方法區(qū)是Java堆的一個邏輯部分,它存儲類結(jié)構(gòu)、運(yùn)行時常量池、字段和方法等數(shù)據(jù)??梢酝ㄟ^參數(shù)-XX:PermSize=256m來指定大小。在Java8以后,該區(qū)域已經(jīng)被移除了,替代的是元數(shù)據(jù)空間Met
aspace。在Java8以及更新版本設(shè)置PermSize將會提示:ignoring option PermSize=20M; support was removed in 8.0。
五、運(yùn)行時常量池
運(yùn)行時常量池是方法區(qū)的一部分,它存儲從編譯已知的字面量和符號引用以及類版本、字段、方法、接口描述等信息。早期版本中,String.intern()會進(jìn)入常量池存放。Java8及以后,官方的虛擬機(jī)規(guī)范并沒有更改或者詳盡的解釋。有興趣的朋友可以留言討論。
六、本地方法棧
本地方法棧和Java虛擬機(jī)棧的作用是相似的,他們的區(qū)別是,Java虛擬機(jī)棧是為Java方法服務(wù),本地方法棧是為native方法服務(wù)。官方虛擬機(jī)規(guī)范中并沒有強(qiáng)制本地方法棧中使用的語言、結(jié)構(gòu)進(jìn)行限制,不同的虛擬機(jī)可能有自己不同的實(shí)現(xiàn)。Sun的HotSpot虛擬機(jī)貌似是將本地方法棧和Java虛擬機(jī)棧合二為一了。
這就是小編介紹的幾個方法。