国产精品无码一区二区三区太,亚洲一线产区二线产区区别,欧美A区,人妻jealousvue人妻

×

Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)

  • 作者:新網(wǎng)
  • 來源:新網(wǎng)
  • 瀏覽:100
  • 2018-04-20 14:32:25

Java虛擬機(jī)運(yùn)行時(shí),本地方法棧和Java虛擬機(jī)棧的作用是相似的,他的數(shù)據(jù)區(qū)是怎么運(yùn)行的?感興趣的可以和小編一起往下看。

        Java虛擬機(jī)運(yùn)行時(shí),本地方法棧和Java虛擬機(jī)棧的作用是相似的,他的數(shù)據(jù)區(qū)是怎么運(yùn)行的?感興趣的可以和小編一起往下看。

330490-14091606193126(4).jpg

<div>  一、程序計(jì)數(shù)器
  每個(gè)Java虛擬機(jī)線程都有自己的程序計(jì)數(shù)器,用于存儲(chǔ)當(dāng)前正在執(zhí)行的虛擬機(jī)指令地址。如果當(dāng)前執(zhí)行的是native方法,那么程序計(jì)數(shù)器的值是undefined。
  因?yàn)镴ava虛擬機(jī)多線程是通過線程輪流切換并分配處理器執(zhí)行時(shí)間來實(shí)現(xiàn)的,想要線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都必須私有一個(gè)程序計(jì)數(shù)器,來存儲(chǔ)當(dāng)前執(zhí)行的虛擬機(jī)指令地址。
  二、Java虛擬機(jī)棧
  Java虛擬機(jī)棧也是每個(gè)線程私有的,它存儲(chǔ)著棧幀數(shù)據(jù)。線程執(zhí)行過程中,每個(gè)方法從調(diào)用到返回都對(duì)應(yīng)著一個(gè)棧幀入棧到出棧的過程。如果程序中使用了遞歸,但是沒有遞歸出口,或者方法調(diào)用超過了所允許的最大深度,那么就會(huì)拋出StackOverflowError錯(cuò)誤,如果沒有超過最大深度,但是沒有足夠的內(nèi)存來創(chuàng)建棧幀,那么會(huì)拋出OutOfMemoryError錯(cuò)誤,這也是Java虛擬機(jī)規(guī)范中說明的兩種錯(cuò)誤。這里只是舉了兩個(gè)例子說明,引發(fā)錯(cuò)誤的可能還有其他方式。
  棧幀,棧幀存儲(chǔ)數(shù)據(jù)和部分結(jié)果,以及方法返回值和異常分發(fā)。每次調(diào)用方法的時(shí)候都會(huì)創(chuàng)建一個(gè)新的棧幀,方法退出時(shí)銷毀(無論異常還是正常返回)。棧幀是線程的虛擬機(jī)棧中分配的,每個(gè)棧幀都有一個(gè)局部變量數(shù)組,操作數(shù)棧以及對(duì)當(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)于各個(gè)區(qū)域分配的細(xì)節(jié)以后另起一篇文章解釋。以下參數(shù)可以指定各個(gè)空間的大小和比例:
  -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和一個(gè)s1空間的比例為4:1,那么Eden:s1:s2是4:1:1
  四、方法區(qū)(永久代)
  方法區(qū)是Java堆的一個(gè)邏輯部分,它存儲(chǔ)類結(jié)構(gòu)、運(yùn)行時(shí)常量池、字段和方法等數(shù)據(jù)??梢酝ㄟ^參數(shù)-XX:PermSize=256m來指定大小。在Java8以后,該區(qū)域已經(jīng)被移除了,替代的是元數(shù)據(jù)空間Metaspace。在Java8以及更新版本設(shè)置PermSize將會(huì)提示:ignoring option PermSize=20M; support was removed in 8.0。
  五、運(yùn)行時(shí)常量池
  運(yùn)行時(shí)常量池是方法區(qū)的一部分,它存儲(chǔ)從編譯已知的字面量和符號(hào)引用以及類版本、字段、方法、接口描述等信息。早期版本中,String.intern()會(huì)進(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ī)棧合二為一了。
這就是小編介紹的幾個(gè)方法。

免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

免費(fèi)咨詢獲取折扣

Loading