大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 阿里Java工程師筆試題,Jvm必問面試題

阿里Java工程師筆試題,Jvm必問面試題

更新時間:2020-02-26 09:49:14 來源:動力節點 瀏覽2606次


  什么是Java虛擬機?為什么Java被稱作是“平臺無關的編程語言”?


  Java虛擬機是一個可以執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。Java被設計成允許應用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。Java虛擬機讓這個變為可能,因為它知道底層硬件平臺的指令長度和其他特性。


  Java內存結構?


阿里Java工程師筆試題,Jvm必問面試題


  方法區和對是所有線程共享的內存區域;而java棧、本地方法棧和程序員計數器是運行是線程私有的內存區域。


  Java堆(Heap),是Java虛擬機所管理的內存中最大的一塊。Java堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。


  方法區(MethodArea),方法區(MethodArea)與Java堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。


  程序計數器(ProgramCounterRegister),程序計數器(ProgramCounterRegister)是一塊較小的內存空間,它的作用可以看做是當前線程所執行的字節碼的行號指示器。


  JVM棧(JVMStacks),與程序計數器一樣,Java虛擬機棧(JavaVirtualMachineStacks)也是線程私有的,它的生命周期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每個方法被執行的時候都會同時創建一個棧幀(StackFrame)用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息。每一個方法被調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。


  本地方法棧(NativeMethodStacks),本地方法棧(NativeMethodStacks)與虛擬機棧所發揮的作用是非常相似的,其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的Native方法服務。


  解釋內存中的棧(stack)、堆(heap)和方法區(methodarea)的用法


  通常我們定義一個基本數據類型的變量,一個對象的引用,還有就是函數調用的現場保存都使用JVM中的棧空間;而通過new關鍵字和構造器創建的對象則放在堆空間,堆是垃圾收集器管理的主要區域,由于現在的垃圾收集器都采用分代收集算法,所以堆空間還可以細分為新生代和老生代,再具體一點可以分為Eden、Survivor(又可分為FromSurvivor和ToSurvivor)、Tenured;方法區和堆都是各個線程共享的內存區域,用于存儲已經被JVM加載的類信息、常量、靜態變量、JIT編譯器編譯后的代碼等數據;程序中的字面量(literal)如直接書寫的100、”hello”和常量都是放在常量池中,常量池是方法區的一部分,。棧空間操作起來最快但是棧很小,通常大量的對象都是放在堆空間,棧和堆的大小都可以通過JVM的啟動參數來進行調整,棧空間用光了會引發StackOverflowError,而堆和常量池空間不足則會引發OutOfMemoryError。


  Stringstr=newString("hello");


  上面的語句中變量str放在棧上,用new創建出來的字符串對象放在堆上,而”hello”這個字面量是放在方法區的。


  補充1:較新版本的Java(從Java6的某個更新開始)中,由于JIT編譯器的發展和”逃逸分析”技術的逐漸成熟,棧上分配、標量替換等優化技術使得對象一定分配在堆上這件事情已經變得不那么絕對了。


  補充2:運行時常量池相當于Class文件常量池具有動態性,Java語言并不要求常量一定只有編譯期間才能產生,運行期間也可以將新的常量放入池中,String類的intern()方法就是這樣的。看看下面代碼的執行結果是什么并且比較一下Java7以前和以后的運行結果是否一致。


  Strings1=newStringBuilder("go")


  .append("od").toString();


  System.out.println(s1.intern()==s1);


  Strings2=newStringBuilder("ja")


  .append("va").toString();


  System.out.println(s2.intern()==s2);


  對象分配規則


  對象優先分配在Eden區,如果Eden區沒有足夠的空間時,虛擬機執行一次MinorGC。


  大對象直接進入老年代(大對象是指需要大量連續內存空間的對象)。這樣做的目的是避免在Eden區和兩個Survivor區之間發生大量的內存拷貝(新生代采用復制算法收集內存)。


  長期存活的對象進入老年代。虛擬機為每個對象定義了一個年齡計數器,如果對象經過了1次MinorGC那么對象會進入Survivor區,之后每經過一次MinorGC那么對象的年齡加1,知道達到閥值對象進入老年區。


  動態判斷對象的年齡。如果Survivor區中相同年齡的所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象可以直接進入老年代。


  空間分配擔保。每次進行MinorGC時,JVM會計算Survivor區移至老年區的對象的平均大小,如果這個值大于老年區的剩余值大小則進行一次FullGC,如果小于檢查HandlePromotionFailure設置,如果true則只進行MonitorGC,如果false則進行FullGC。


  什么是類的加載


  類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的加載的最終產品是位于堆區中的Class對象,Class對象封裝了類在方法區內的數據結構,并且向Java程序員提供了訪問方法區內的數據結構的接口。


阿里Java工程師筆試題,Jvm必問面試題


      以上就是動力節點Java培訓機構小編介紹的“阿里Java工程師筆試題,Jvm必問面試題”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 四虎在线免费观看视频 | 一级毛片在线播放 | 国产精品免费一区二区三区 | 奇米影视在线视频 | 亚洲韩精品欧美一区二区三区 | 国产福利91| 日本免费小视频 | 97在线免费看视频 | 日本欧美一区二区三区在线观看 | 国产日产亚洲精品 | 91久久澡人人爽人人添 | 午夜毛片 | 多色视频 | 九九视频免费在线 | 久久久久女人精品毛片 | 999yy成年在线视频免费看 | 午夜色网 | 欧美色爱综合网 | 日韩天堂在线观看 | 日本色婷婷 | 亚洲精品欧美一区二区三区 | 中文字幕久热精品视频免费 | 国产区一区二 | 一道本一区二区三区 | 日韩成人一级 | 国内精品久久久久久影院网站小说 | 九九视频在线观看6 | 久久99综合国产精品亚洲首页 | 亚洲国产二区三区久久 | 中文字幕亚洲无线码在线一区 | a亚洲欧美中文日韩在线v日本 | www.伊人| 免费深夜福利 | 性欧美一级毛片在线播放 | 国产美女视频免费 | 欧美精品久久久亚洲 | 成人免费视频一区二区三区 | 久久综合九色综合91 | 久久精品7 | 91免费国产在线观看尤物 | 精品无码久久久久久久动漫 |