1窘哈、說說你知道的幾種主要的jvm參數(shù)
-server -Xmx3g -Xms3g -XX:MaxPermSize=128m?
-XX:NewRatio=1? eden/old 的比例
-XX:SurvivorRatio=8? s/e的比例?
-XX:+UseParallelGC?
-XX:ParallelGCThreads=8??
-XX:+UseParallelOldGC? 這是JAVA6出現(xiàn)的參數(shù)選項(xiàng)?
-XX:LargePageSizeInBytes=128m 內(nèi)存頁的大小君账, 不可設(shè)置過大慧起, 會影響Perm的大小腕侄。?
-XX:+UseFastAccessorMethods 原始類型的快速優(yōu)化?
-XX:+DisableExplicitGC? 關(guān)閉System.gc()
2按灶、-XX:+UseCompressedOops有什么作用寿桨?
1)允許在64位JVM中內(nèi)存引用地址為32位汉柒,并且訪問接近32GB的堆空間地址惹悄;
2)壓縮64位指針春叫,減少了在GC中花費(fèi)的時間,可能性能略有下降泣港;
3)jdk1.6.0_22默認(rèn)關(guān)閉暂殖,之后的JVM默認(rèn)啟用;
3爷速、Java 類加載器都有哪些央星?
引導(dǎo)類加載器(bootstrap?class?loader):用來加載Java核心庫(jre/lib/rt.jar)。
擴(kuò)展類加載器(extensions?class?loader):用來加載Java擴(kuò)展庫(jre/ext/*.jar)惫东。
系統(tǒng)類加載器(system class?loader):根據(jù)類路徑(CLASSPATH)來加載Java類莉给。
自定義類加載器(custom?class?loader):繼承java.lang.ClassLoader類實(shí)現(xiàn)自己的類加載器毙石。
4、簡單說說你了解的類加載器颓遏,是否實(shí)現(xiàn)過類加載器徐矩?
一個類的生命周期:加載、驗(yàn)證叁幢、準(zhǔn)備滤灯、解析、初始化曼玩、使用鳞骤、卸載。其中加載黍判、驗(yàn)證豫尽、準(zhǔn)備、初始化顷帖、使用美旧、卸載是按順序執(zhí)行的。
在加載階段贬墩,虛擬機(jī)完成三件事:?
1)通過一個類的全限定名類獲取定義此類的二進(jìn)制字節(jié)流榴嗅。
2)將字節(jié)流的所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化成方法區(qū)運(yùn)行時的數(shù)據(jù)結(jié)構(gòu)。
3)在內(nèi)存中生成一個代表這個類的java.lang.Class的對象陶舞,作為方法區(qū)的這個類各種數(shù)據(jù)訪問的入口嗽测。?
驗(yàn)證是為了確保Class文件字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害到虛擬機(jī)本身吊说。?
準(zhǔn)備階段是給類變量賦予初始值的階段论咏。這里的初始值是指變量默認(rèn)的指,并不是用戶賦予的初始值颁井。?
初始化階段是類加載的最后一步厅贪。是給類變量賦予初始值。
類加載器的雙親委派原理:
加載器在加載類時雅宾,先檢查當(dāng)前類有沒有被加載养涮,如果沒有被加載,則首先調(diào)用父類加載器加載眉抬,如果父類加載器加載失敗贯吓,才交給當(dāng)前的類加載器加載。
自定義類加載器
1)如果不想打破雙親委派模型蜀变,只需重寫findClass方法即可
2)如果想打破雙親委派模型悄谐,就重寫整個loadClass方法
5、JVM如何加載字節(jié)碼文件库北?
類加載是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中爬舰,將其放在運(yùn)行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi)们陆,然后在堆區(qū)創(chuàng)建一個這個類的java.lang.Class對象,用來封裝類在方法區(qū)類的對象情屹。
加載類的方式:
1)從本地系統(tǒng)直接加載
2)通過網(wǎng)絡(luò)下載.class文件
3)從zip坪仇,jar等歸檔文件中加載.class文件
4)從專有數(shù)據(jù)庫中提取.class文件
5)將源文件動態(tài)編譯為.class文件(服務(wù)器)
6、JVM內(nèi)存分哪幾個區(qū)垃你,每個區(qū)的作用是什么椅文?
JVM內(nèi)存區(qū)域分為五個部分:堆,方法區(qū)惜颇,虛擬機(jī)棧皆刺,本地方法棧,程序計數(shù)器官还。
堆: 是Java對象的存儲區(qū)域芹橡,任何用new分配的對象實(shí)例和數(shù)組,都分配在堆上望伦,可用-Xms -Xmx進(jìn)行內(nèi)存控制,從JDK1.7之后煎殷,運(yùn)行時常量池從方法區(qū)移到了堆上屯伞。
方法區(qū):用于存儲被虛擬機(jī)加載的類信息、常量豪直、靜態(tài)變量劣摇、即時編譯器編譯后的代碼等數(shù)據(jù),在JDK1.7及以前稱為永久代弓乙,JDK1.8永久代被移除末融。
虛擬機(jī)棧:虛擬機(jī)棧中執(zhí)行每個方法時,都會創(chuàng)建一個棧幀用于存儲局部變量表暇韧、操作數(shù)棧勾习、動態(tài)鏈接、方法出口等信息懈玻。
本地方法棧:與虛擬機(jī)棧作用相似巧婶,虛擬機(jī)棧為Java方法服務(wù),本地方法棧為Native方法服務(wù)涂乌,執(zhí)行每個本地方法時艺栈,都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧湾盒、動態(tài)鏈接湿右、方法出口等信息。
程序計數(shù)器:指示JVM下一條要執(zhí)行的字節(jié)碼指令罚勾。?
其中方法區(qū)和堆被JVM中多個線程共享毅人,比如類的靜態(tài)常量就存放在方法區(qū)吭狡,供類對象之間共享,虛擬機(jī)棧堰塌、本地方法棧赵刑、pc寄存器是每個線程獨(dú)立擁有的,不與其他線程共享场刑。
7般此、一個對象從創(chuàng)建到銷毀都是怎么在這些部分里存活和轉(zhuǎn)移的?
1)用戶創(chuàng)建一個對象牵现,運(yùn)行時JVM首先會去方法區(qū)尋找該對象的類型信息铐懊,沒有則使用類加載器將字節(jié)碼文件加載至內(nèi)存中的方法區(qū),并將對象的類型信息存放至方法區(qū)瞎疼。?
2)接著JVM在堆中為新的對象實(shí)例分配內(nèi)存空間科乎,這個實(shí)例持有指向方法區(qū)的對象類型信息的引用,引用指的是類型信息在方法區(qū)中的內(nèi)存地址贼急。?
3)在此運(yùn)行的JVM進(jìn)程中茅茂,會首先起一個線程跑該用戶程序,創(chuàng)建線程的同時也創(chuàng)建了一個虛擬機(jī)棧太抓,虛擬機(jī)棧用來跟蹤線程運(yùn)行中的一系列方法調(diào)用過程空闲,每調(diào)用一個方法就會創(chuàng)建并往棧中壓入一個棧幀,棧幀用來存儲方法的參數(shù)走敌、局部變量和運(yùn)算過程的臨時數(shù)據(jù)碴倾。
4)JVM根據(jù)對象引用持有的堆中對象的內(nèi)存地址,定位到堆中的實(shí)例掉丽,由于堆中實(shí)例持有指向方法區(qū)的對象類型信息的引用跌榔,從而獲得方法的字節(jié)碼信息,接著執(zhí)行方法包含的指令捶障。?
5)將對象指向null?
6)JVM GC
8僧须、解釋內(nèi)存中的棧(stack)、堆(heap)和方法區(qū)(method area)的用法残邀?
棧的使用:基本數(shù)據(jù)類型的變量皆辽,一個對象的引用,還有函數(shù)調(diào)用的現(xiàn)場保存都使用椊嬲酰空間驱闷。
堆的使用:通過new關(guān)鍵字和構(gòu)造器創(chuàng)建的對象則放在堆空間,堆是垃圾收集器管理的主要區(qū)域空免。
方法區(qū)的使用:方法區(qū)和堆都是各個線程共享的內(nèi)存區(qū)域空另,用于存儲已經(jīng)被JVM加載的類信息、常量蹋砚、靜態(tài)變量扼菠、JIT編譯器編譯后的代碼等數(shù)據(jù)摄杂;程序中的字面量(literal)如直接書寫100、"hello"和常量都是放在常量池中循榆,常量池是方法區(qū)的一部分析恢。
棧空間操作最快但棧很小秧饮,通常大量的對象都放在堆空間映挂,棧和堆的大小都可以通過JVM的啟動參數(shù)來調(diào)整,椀潦空間不足會引發(fā)StackOverflowError柑船,堆和常量池空間不足則會引發(fā)OutOfMemoryError。
9泼各、JVM中哪個參數(shù)是用來控制線程的棧大邪笆薄?
-Xss參數(shù)
10扣蜻、簡述內(nèi)存分配與回收策略
一逆巍、對象優(yōu)先在Eden分配
大多數(shù)情況下,對象在新生代Eden區(qū)分配莽使。當(dāng)Eden區(qū)沒有足夠空間時蒸苇,JVM將發(fā)起一次Minor GC。
二吮旅、大對象直接分配到老年區(qū)
大對象是指需要大量連續(xù)內(nèi)存空間的對象,典型的就是很長的字符串和數(shù)組味咳。大對象易導(dǎo)致內(nèi)存還有不少空間時提前觸發(fā)垃圾收集以獲取足夠的連續(xù)空間庇勃。
設(shè)置參數(shù):-XX:PretenureSizeThreshold=x。x表示大小的數(shù)值槽驶,大于設(shè)置值的對象直接在老年代分配责嚷。避免在Eden區(qū)和兩個Survivor區(qū)之間發(fā)生大量的內(nèi)存復(fù)制。
三掂铐、長期存活的對象將進(jìn)入老年代
JVM給每個對象定義了一個對象年齡(Age)計數(shù)器罕拂,如果對象在Eden出現(xiàn)并經(jīng)過一次Minor GC后仍存活,并能被Survivor容納的話全陨,將被移動到Survivor中爆班,并且年齡設(shè)為1。對象在Survivor區(qū)每熬過一次Minor GC辱姨,年齡就增加1歲柿菩,當(dāng)它的年齡增加到一定程度(默認(rèn)為15歲)就會進(jìn)入老年代中。對象晉升老年代的年齡閾值可通過參數(shù)-XX:MaxTenuringThreshold設(shè)置雨涛。
四枢舶、動態(tài)對象年齡判定
JVM并不總是要求對象的年齡必須達(dá)到MaxTenuringThreshold才能晉升到老年代懦胞,如果在Survivor區(qū)中相同年齡的對象所有大小之和超過Survivor空間的一半,年齡大于或等于該年齡的對象直接進(jìn)入老年代凉泄,無需等到MaxTenuringThreshold中要求的年齡躏尉。
五、空間分配擔(dān)保
只要老年代的連續(xù)空間大于新生代對象總大小或歷次晉升的平均大小就會Full GC后众,否則Minor GC胀糜。
11、簡述重排序吼具,內(nèi)存屏障僚纷,happen-before,主內(nèi)存拗盒,工作內(nèi)存怖竭?
從源代碼到指令序列的重排序:
1) 編譯器優(yōu)化的重排序:編譯器在不改變單線程語義情況下,重新安排語句的執(zhí)行順序
2) 指令級的并行重排序:現(xiàn)代處理器采用了指令級別的并行技術(shù)將多條指令重疊執(zhí)行
3) 內(nèi)存系統(tǒng)的重排序:由于處理器使用緩存讀/寫緩沖區(qū),使得加載和存儲看上去可能是亂序執(zhí)行陡蝇,對于編譯器痊臭,JMM的編譯器指令重排序規(guī)則會禁止特定類型的編譯器重排列,對于處理器的重排序登夫,JMM的處理器重排序規(guī)則會要求插入特定類型的內(nèi)存屏障广匙,通過內(nèi)存屏障指令來禁止特定類型的處理器重新排序。
happens-before簡介
在JMM中如果一個操作的結(jié)果需要對另一個操作可見恼策,兩個操作間必須存在happens-before關(guān)系鸦致。
1)程序順序規(guī)則:一個線程中的每個操作,happens-before于該線程中的任意后續(xù)操作
2)監(jiān)視器鎖規(guī)則:對一個鎖的解鎖涣楷,happens-before于隨后對這個鎖的加鎖
3)volatile變量規(guī)則: 對于一個volatile域的寫分唾,happens-before于任意后續(xù)對這個volatile域的讀
內(nèi)存屏障:
1)確保指令重排序時不會將其后面的代碼排到內(nèi)存屏障之前
2)確保指令重排序時不會將其前面的代碼排到內(nèi)存屏障之后
3)確保在執(zhí)行到內(nèi)存屏障修飾的指令時前面的代碼全都執(zhí)行完成
4)強(qiáng)制將線程工作內(nèi)存中的值修改到主內(nèi)存中
5)如果是寫操作,則會導(dǎo)致其他線程工作內(nèi)存的緩存數(shù)據(jù)無效
JVM將內(nèi)存分為主內(nèi)存和工作內(nèi)存兩個部分狮斗。
1)所有變量都存儲在主內(nèi)存中绽乔,對所有線程都共享。
2)每條線程都有自己的工作內(nèi)存碳褒,保存的是主存中某些變量的拷貝折砸,線程對變量的所有操作都必須在工作內(nèi)存中進(jìn)行,不能直接讀寫主內(nèi)存中的變量沙峻。
3)線程之間無法直接訪問對方工作內(nèi)存中的變量睦授,線程間變量的傳遞均需通過主內(nèi)存來完成。
線程對內(nèi)存間交互操作:
Lock(鎖定):作用于主內(nèi)存中的變量专酗,把一個變量標(biāo)識為一條線程獨(dú)占的狀態(tài)睹逃。
Read(讀取):作用于主內(nèi)存中的變量,把一個變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中。
Load(加載):作用于工作內(nèi)存中的變量沉填,把從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中疗隶。
Use(使用):作用于工作內(nèi)存中的變量,把工作內(nèi)存中一個變量值傳遞給執(zhí)行引擎翼闹。
Assign(賦值):作用于工作內(nèi)存中的變量斑鼻,把一個從執(zhí)行引擎接收到的值賦給工作內(nèi)存中的變量。
Store(存儲):作用于工作內(nèi)存中的變量猎荠,把工作內(nèi)存中的一個變量值傳到主內(nèi)存中坚弱。
Write(寫入):作用于主內(nèi)存中的變量,把從工作內(nèi)存中得到的變量值放入主內(nèi)存變量中关摇。
Unlock(解鎖):作用于主內(nèi)存中的變量荒叶,把一個處于鎖定狀態(tài)的變量釋放,之后可被其它線程鎖定输虱。
將變量從主內(nèi)存讀取到工作內(nèi)存中些楣,必須順序執(zhí)行read、load宪睹;
將變量從工作內(nèi)存同步回主內(nèi)存中愁茁,必須順序執(zhí)行store、write亭病。
12鹅很、Java中存在內(nèi)存泄漏問題嗎?請舉例說明
內(nèi)存泄露指不再被程序使用的對象或變量一直占據(jù)在內(nèi)存中罪帖。Java使用有向圖的方式進(jìn)行垃圾回收管理促煮,可以消除引用循環(huán)的問題,例如有兩個對象相互引用整袁,只要它們和根進(jìn)程不可達(dá)污茵,那么GC可以回收它們。
java中內(nèi)存泄露的發(fā)生場景
1)程序員可能創(chuàng)建了一個對象葬项,以后一直不使用,這個對象卻一直被引用迹蛤,即這個對象無用但是卻無法被垃圾回收器回收民珍,這就是內(nèi)存泄露,一定要讓程序?qū)⒏鞣N分支情況都完整執(zhí)行到結(jié)束盗飒,然后看某個對象是否被使用過嚷量,如果沒有,才能判定這個對象屬于內(nèi)存泄露逆趣。
2)如果一個外部類實(shí)例對象的方法返回了一個內(nèi)部類的實(shí)例對象蝶溶,這個內(nèi)部類對象被長期引用了,即使那個外部類實(shí)例對象不再被使用,但由于內(nèi)部類持久外部類的實(shí)例對象抖所,這個外部類對象將不會被垃圾回收梨州,也會造成內(nèi)存泄露。
3)當(dāng)一個對象被存進(jìn)HashSet集合中田轧,就不能修改這個對象中的那些參與計算哈希值的字段了暴匠,否則,對象修改后的哈希值與最初存進(jìn)HashSet集合中時的哈希值就不同了傻粘,在這種情況下每窖,即使在contains方法使用該對象的當(dāng)前引用作為參數(shù)去HashSet集合中檢索對象,也將返回找不到對象的結(jié)果弦悉,這也會導(dǎo)致無法從HashSet集合中單獨(dú)刪除當(dāng)前對象窒典,造成內(nèi)存泄露。
4)Hibernate的Session(一級緩存)中的對象屬于持久態(tài)稽莉,垃圾回收器是不會回收這些對象的瀑志,然而這些對象中可能存在無用的垃圾對象,如果不及時關(guān)閉(close)或清空(flush)一級緩存就可能導(dǎo)致內(nèi)存泄露肩祥。
13后室、簡述 Java 中軟引用(SoftReference)、弱引用(WeakReference)和虛引用混狠?
強(qiáng)引用:類似“Object obj = new Object()”這類的引用岸霹,只要強(qiáng)引用還存在,GC永遠(yuǎn)不會回收被引用的對象将饺。
軟引用(SoftReference):描述一些還有用贡避,但并非必需的對象。對于軟引用關(guān)聯(lián)著的對象予弧,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常前刮吧,將會把這些對象列進(jìn)回收范圍并進(jìn)行第二次回收。如果這次回收還是沒有足夠的內(nèi)存掖蛤,才會拋出內(nèi)存溢出異常杀捻。
弱引用(WeakReference):描述非必需對象,強(qiáng)度比軟引用更弱蚓庭,被弱引用關(guān)聯(lián)的對象只能生存到下一次GC前致讥。當(dāng)執(zhí)行GC時,無論當(dāng)前內(nèi)存是否足夠器赞,都會回收掉被弱引用關(guān)聯(lián)的對象垢袱。
虛引用(PhantomReference):也稱幽靈引用或幻影引用,是最弱的一種引用關(guān)系港柜。一個對象是否有虛引用的存在请契,完全不會對其生存時間構(gòu)成影響,也無法通過虛引用來取得一個對象實(shí)例。為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是希望在這個對象被回收時收到一個系統(tǒng)通知爽锥。
14涌韩、32位JVM和64位JVM的最大堆內(nèi)存分別是多數(shù)?32位和64位的JVM救恨,int類型變量的長度贸辈?
32位JVM堆內(nèi)存理論上可達(dá)到2^32,即4GB肠槽,但實(shí)際會比這個小很多擎淤。
64位JVM堆內(nèi)存理論上可達(dá)到2^64,實(shí)際可指定到100GB秸仙。
32和64位JVM 中嘴拢,int類型變量的長度相同,都是32位或者4個字節(jié)(一個字節(jié)8位)寂纪。
15席吴、怎樣通過Java程序來判斷JVM是32位還是64位?
1)System.getProperty("sun.arch.data.model")
2)控制臺輸入java -version
3)java -d64 -version
16捞蛋、什么情況下會發(fā)生棧內(nèi)存溢出孝冒?
每個方法在執(zhí)行時都會創(chuàng)建一個棧幀,用來存儲局部變量表拟杉、操作數(shù)棧庄涡、動態(tài)鏈接、方法出口等信息搬设。局部變量表又包含基本數(shù)據(jù)類型穴店、對象引用類型(局部變量表編譯器完成,運(yùn)行期間不會變化)拿穴。
棧溢出就是方法執(zhí)行時創(chuàng)建的棧幀超過了棧的深度泣洞。最有可能的就是方法遞歸調(diào)用。
17默色、雙親委派模型是什么球凰?
JVM存在兩種不同的類加載器:一種是啟動類加載器(Bootstrap ClassLoader),使用C++實(shí)現(xiàn)(HotSpot虛擬機(jī)中)腿宰,是虛擬機(jī)自身的一部分弟蚀;另一種就是所有其他的類加載器,獨(dú)立于虛擬機(jī)外部酗失,并且全部繼承自java.lang.ClassLoader。
某個特定的類加載器在接到加載類的請求時昧绣,首先將加載任務(wù)委托給父類加載器规肴,依次遞歸,如果父類加載器可以完成類加載任務(wù),就成功返回拖刃;只有父類加載器無法完成此加載任務(wù)時删壮,才自己去加載。
使用雙親委派模型的好處在于Java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層次關(guān)系兑牡。例如類java.lang.Object央碟,它存在rt.jar中,無論哪一個類加載器要加載這個類均函,最終都是委派給處于模型最頂端的Bootstrap ClassLoader進(jìn)行加載亿虽,因此Object類在程序的各種類加載器環(huán)境中都是同一個類。
18苞也、jinfo洛勉,jstack,jstat如迟,jmap收毫,jconsole怎么用?
jinfo:觀察運(yùn)行中的JAVA程序運(yùn)行環(huán)境參數(shù)殷勘,參數(shù)包括Java System屬性和JVM命令行參數(shù)此再,java class path等信息。格式:jinfo 進(jìn)程pid
jps:用來顯示本地java進(jìn)程玲销,并顯示進(jìn)程號输拇。格式:jps?或 jps遠(yuǎn)程服務(wù)ip地址(默認(rèn)端口1099)
jstat:一個極強(qiáng)的監(jiān)視VM內(nèi)存工具。用來監(jiān)視JVM的各種堆和非堆的大小及其內(nèi)存使用量痒玩。
jstack:可以觀察到j(luò)vm中當(dāng)前所有線程的運(yùn)行情況和線程當(dāng)前狀態(tài)淳附。格式:jstack 進(jìn)程pid。當(dāng)程序出現(xiàn)死鎖時使用命令:jstack 進(jìn)程ID > jstack.log蠢古,在jstack.log文件中搜索關(guān)鍵字“BLOCKED”奴曙,定位到引起死鎖的地方。
jmap:觀察運(yùn)行中的jvm物理內(nèi)存占用情況(如產(chǎn)生哪些對象及其數(shù)量)草讶。格式:jmap [option] pid
option參數(shù)如下:
-heap:打印jvm heap情況
-histo:打印jvm heap直方圖洽糟。其輸出信息包括類名,對象數(shù)量堕战,對象占用大小坤溃。
-histo:同上,但只打印存活對象的情況
-permstat:打印permanent generation heap情況
使用jmap進(jìn)行heap dump: jmap?-dump:format=b,file=<filename>?<pid>??
打印內(nèi)存統(tǒng)計圖:jmap -histo:live <pid>
jconsole:一個java GUI監(jiān)視工具嘱丢,以圖表化的形式顯示各種數(shù)據(jù)薪介,并可通過遠(yuǎn)程連接監(jiān)視遠(yuǎn)程的服務(wù)器VM。
19越驻、JRE汁政、JDK道偷、JVM 及 JIT 之間有什么不同?
JVM:--java虛擬機(jī)(JVM)
JVM是一種用于計算設(shè)備的規(guī)范记劈,它是一個虛構(gòu)出來的計算機(jī)勺鸦,是通過在實(shí)際的計算機(jī)上仿真模擬各種計算機(jī)功能來實(shí)現(xiàn)的。
Java虛擬機(jī)在執(zhí)行字節(jié)碼時目木,把字節(jié)碼解釋成具體平臺上的機(jī)器指令執(zhí)行换途。
JRE:--java運(yùn)行時環(huán)境(JRE)
JRE是JVM的一個超集,用于執(zhí)行java程序刽射,運(yùn)行時JRE變成了JVM军拟。
JDK:--java開發(fā)工具箱(JDK)
指的是編寫一個java應(yīng)用所需要的所有jar文件和可執(zhí)行文件。jdk把.java文件編譯成為.class字節(jié)碼文件柄冲。JRE是JDK的一部分吻谋。
JIT:--即時編譯器(JIT)
是種特殊的編譯器,它通過有效的把字節(jié)碼變成機(jī)器碼來提高JVM的效率现横。
20漓拾、操作系統(tǒng)中 heap 和 stack 的區(qū)別?
棧是一種線形集合戒祠,其添加和刪除元素的操作應(yīng)在同一端尾部完成骇两。棧后進(jìn)先出。
堆是棧的一個組成元素姜盈。Stack存取速度僅次于寄存器低千,存儲效率比heap高,可共享存儲數(shù)據(jù)馏颂。
21示血、虛擬內(nèi)存是什么?
虛擬內(nèi)存是WIN系統(tǒng)用來管理內(nèi)存的一種方法救拉,就是把內(nèi)存中的信息分出去一部分存在硬盤上难审。