| Java虛擬機(jī)(英語:Java Virtual Machine,縮寫為JVM),又名爪哇虛擬器,一種能夠運(yùn)行Java bytecode的虛擬機(jī),以堆棧結(jié)構(gòu)機(jī)器來進(jìn)行實(shí)做。最早由太陽微系統(tǒng)所研發(fā)并實(shí)現(xiàn)第一個(gè)實(shí)現(xiàn)版本,是Java平臺(tái)的一部份,能夠運(yùn)行以Java語言寫作的軟件程序。Java虛擬機(jī)有自己完善的硬體架構(gòu),如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。通過對(duì)中央處理器(CPU)所執(zhí)行的軟件實(shí)作,實(shí)現(xiàn)能執(zhí)行編譯過的Java程序碼(Applet與應(yīng)用程序)。作為一種編程語言的虛擬機(jī),實(shí)際上不只是專用于Java語言,只要生成的編譯文件符合JVM對(duì)載入編譯文件格式要求,任何語言都可以由JVM編譯運(yùn)行。除外,除了甲骨文,也有其他開源或閉源的實(shí)現(xiàn)。——維基百科 |
1.創(chuàng)建JVM裝載環(huán)境和配置2.裝載JVM.dll3.初始化JVM.dll并掛界到JNIENV(JNI調(diào)用接口)實(shí)例4.調(diào)用JNIEnv實(shí)例裝載并處理class類
下面看看一個(gè)java代碼是怎么運(yùn)行起來的:參考文:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/四、JVM的內(nèi)存管理這里有一篇文章講的很詳細(xì):http://developer.51cto.com/art/201303/387175.htmJVM的內(nèi)存結(jié)構(gòu)分為6塊:PC Register(PC寄存器)、JVM堆、JVM棧、方法區(qū)域、運(yùn)行時(shí)常量、本地方法堆棧。如下圖示意:

對(duì)于開發(fā)來說主要關(guān)注的還是堆和棧。JVM一些參數(shù)設(shè)置:-Xss:這個(gè)參數(shù)就是用來指定棧的大小-Xms:設(shè)置JVM啟動(dòng)時(shí)最小的堆內(nèi)存大小-Xmx:設(shè)置JVM堆的最大內(nèi)存大小-XX:PermSize及-XX:MaxPermSize指定方法區(qū)域(MethodArea)的初始值與最大值MethodArea對(duì)應(yīng)的是持久代(PermanetGeneration),所以設(shè)置Perm的大小很重要,否則會(huì)報(bào)java.lang.OutOfMemoryError: PermGen space。五、垃圾收集器(Garbage Collector,GC)垃圾收集器這個(gè)東西對(duì)于程序員來說可謂是一種解脫,可以不用顯式釋放內(nèi)存了。這種神奇的療效還是要看看他的基本原理了解一下情況才行。下面摘了一段話:| 有幾種垃圾收集的基本策略:引用計(jì)數(shù)、標(biāo)記-清除、標(biāo)記-整理 (mark-compact) 和復(fù)制。此外,一些算法可以以增量方式完成它們的工作(不需要一次收集整個(gè)堆,使得收集暫停時(shí)間更短),一些算法可以在用戶程序運(yùn)行時(shí)運(yùn)行(并發(fā)收集)。其他算法則必須在用戶程序暫停時(shí)一次進(jìn)行整個(gè)收集(即所謂的stop-the-world收集器)。最后,還有混合型的收集器,如 1.2 和以后版本的 JDK 使用的分代收集器,它對(duì)堆的不同區(qū)域使用不同的收集算法。——摘自developerWorks 中國 |
| 由分配器分配的,但是用戶程序不可到達(dá)的內(nèi)存塊。不可到達(dá)是什么意思?可以以兩種方式之一訪問內(nèi)存塊 ―― 或者用戶程序在根 (root)中有對(duì)這一內(nèi)存塊的引用,或者在另一個(gè)可到達(dá)的塊中有對(duì)這個(gè)塊的引用。——摘自developerworks |
| 分代收集器(generializational collector)將堆分為多個(gè)代。在年輕的代中創(chuàng)建對(duì)象,滿足某些提升標(biāo)準(zhǔn)的對(duì)象,如經(jīng)歷了特定次數(shù)垃圾收集的對(duì)象,將被提升到下一更老的代。分代收集器對(duì)不同的代可以自由使用不同的收集策略,對(duì)各代分別進(jìn)行垃圾收集。——摘自developerworks |
在默認(rèn)情況下,JDK 1.4.1 將堆分為兩部分,一個(gè)年輕的代和一個(gè)老的代(實(shí)際上,還有第三部分――永久空間,它用于存儲(chǔ)裝載的類和方法對(duì)象)。借助于復(fù)制收集器,年輕的代又分為一個(gè)創(chuàng)建空間(通常稱為Eden)和兩個(gè)生存半空間。 老的代使用標(biāo)記-整理收集器。對(duì)象在經(jīng)歷了幾次復(fù)制后提升到老的代。小的收集將活的對(duì)象從 Eden 和一個(gè)生存半空間復(fù)制到另一個(gè)生存半空間,并可能提升一些對(duì)象到老的代。大的收集(major collection)既會(huì)收集年輕的代,也會(huì)收集老的代。System.gc()方法總是觸發(fā)一個(gè)大的收集,這就是應(yīng)該盡量少用(如果不能完全不用的話)System.gc()的原因之一,因?yàn)榇蟮氖占刃〉氖占ㄙM(fèi)長得多的時(shí)間。沒有辦法以編程方式觸發(fā)小的收集。 ——摘自developerworks |
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注