面試集錦(四)

1、 JVM的組成java

JVM由4大部分組成:ClassLoader,Runtime Data Area,Execution Engine,Native Interface。web

2、windows

2.1.ClassLoader是負責加載class文件,class文件在文件開頭有特定的文件標示,而且ClassLoader只負責class文件的加載,至於它是否能夠運行,則由Execution Engine決定。數組

2.2.Native Interface是負責調用本地接口的。他的做用是調用不一樣語言的接口給JAVA用,他會在Native Method Stack中記錄對應的本地方法,而後調用該方法時就經過Execution Engine加載對應的本地lib。本來多於用一些專業領域,如JAVA驅動,地圖製做引擎等,如今關於這種本地方法接口的調用已經被相似於Socket通訊,WebService等方式取代。服務器

2.3.Execution Engine是執行引擎,也叫Interpreter。Class文件被加載後,會把指令和數據信息放入內存中,Execution Engine則負責把這些命令解釋給操做系統。架構

2.4.Runtime Data Area則是存放數據的,分爲五部分:Stack,Heap,Method Area,PC Register,Native Method Stack。幾乎全部的關於java內存方面的問題,都是集中在這塊。app

3、關於stack框架

Stack是java棧內存,它等價於C語言中的棧,棧的內存地址是不連續的,每一個線程都擁有本身的棧。棧裏面存儲着的是StackFrame,在《JVM Specification》中文版中被譯做java虛擬機框架,也叫作棧幀。StackFrame包含三類信息:局部變量,執行環境,操做數棧。局部變量用來存儲一個類的方法中所用到的局部變量。執行環境用於保存解析器對於java字節碼進行解釋過程當中須要的信息,包括:上次調用的方法、局部變量指針和操做數棧的棧頂和棧底指針。操做數棧用於存儲運算所須要的操做數和結果。StackFrame在方法被調用時建立,在某個線程中,某個時間點上,只有一個框架是活躍的,該框架被稱爲Current Frame,而框架中的方法被稱爲Current Method,其中定義的類爲Current Class。局部變量和操做數棧上的操做老是引用當前框架。當Stack Frame中方法被執行完以後,或者調用別的StackFrame中的方法時,則當前棧變爲另一個StackFrame。Stack的大小是由兩種類型,固定和動態的,動態類型的棧能夠按照線程的須要分配。webapp

4、關於heapjvm

Heap是用來存放對象信息的,和Stack不一樣,Stack表明着一種運行時的狀態。換句話說,棧是運行時單位,解決程序該如何執行的問題,而堆是存儲的單位,解決數據存儲的問題。Heap是伴隨着JVM的啓動而建立,負責存儲全部對象實例和數組的。堆的存儲空間和棧同樣是不須要連續的,它分爲Young Generation和Old Generation(也叫Tenured Generation)兩大部分。Young Generation分爲Eden和Survivor,Survivor又分爲From Space和 ToSpace。

和Heap常常一塊兒說起的概念是PermanentSpace,它是用來加載類對象的專門的內存區,是非堆內存,和Heap一塊兒組成JAVA內存,它包含MethodArea區(在沒有CodeCache的HotSpotJVM實現裏,則MethodArea就至關於GenerationSpace)。在JVM初始化的時候,咱們能夠經過參數來分別指定,PermanentSpace的大小、堆的大小、以及Young Generation和Old Generation的比值、Eden區和From Space的比值,從而來細粒度的適應不一樣JAVA應用的內存需求。

5、

JVM的運行原理簡介

Java 程序被javac工具編譯爲.class字節碼文件以後,咱們執行java命令,該class文件便被JVM的Class Loader加載,能夠看出JVM的啓動是經過JAVA Path下的java.exe或者java進行的。JVM的初始化、運行到結束大概包括這麼幾步:

調用操做系統API判斷系統的CPU架構,根據對應CPU類型尋找位於JRE目錄下的/lib/jvm.cfg文件,而後經過該配置文件找到對應的jvm.dll文件(若是咱們參數中有-server或者-client, 則加載對應參數所指定的jvm.dll,啓動指定類型的JVM),初始化jvm.dll而且掛接到JNIENV結構的實例上,以後就能夠經過JNIENV實例裝載而且處理class文件了。class文件是字節碼文件,它按照JVM的規範,定義了變量,方法等的詳細信息,JVM管理而且分配對應的內存來執行程序,同時管理垃圾回收。直到程序結束,一種狀況是JVM的全部非守護線程中止,一種狀況是程序調用System.exit(),JVM的生命週期也結束。

6、

加載階段作了什麼,其實加載階段作了有三件事情:

  • 獲取.class文件的二進制流
  • 將類信息、靜態變量、字節碼、常量這些.class文件中的內容放入方法區中
  • 在內存中生成一個表明這個.class文件的java.lang.Class對象,做爲方法區這個類的各類數據的訪問入口。通常這個Class是在堆裏的,不過HotSpot虛擬機比較特殊,這個Class對象是放在方法區中的

7、

堆溢出

Java堆惟一的做用就是存儲對象實例,只要保證不斷建立對象而且對象不被回收,那麼對象數量達到最大堆容量限制後就會產生內存溢出異常了。因此測試的時候把堆的大小固定住而且讓堆不可擴展便可。

棧溢出

Java虛擬機規範中描述了若是線程請求的棧深度太深(換句話說方法調用的深度太深),就會產生棧溢出了。

方法區和運行時常量池溢出

運行時常量池也是方法區的一部分,因此這兩個區域一塊兒看就能夠了。這個區域的OutOfMemoryError能夠利用String.intern()方法來產生。這是一個Native方法,意思是若是常量池中有一個String對象的字符串就返回池中的這個字符串的String對象;不然,將此String對象包含的字符串添加到常量池中去,而且返回此String對象的引用。

8、

  類的實例化順序,好比父類靜態數據,構造函數,字段,子類靜態數據,構造函數,字段,他們的執行順序

答:先靜態、先父後子。 
先靜態:父靜態 > 子靜態 
優先級:父類 > 子類 靜態代碼塊 > 非靜態代碼塊 > 構造函數 
一個類的實例化過程: 
1,父類中的static代碼塊,當前類的static 
2,順序執行父類的普通代碼塊 
3,父類的構造函數 
4,子類普通代碼塊 
5,子類(當前類)的構造函數,按順序執行。 
6,子類方法的執行,

9、

JVM內存分配

這裏寫圖片描述

這裏寫圖片描述

10、常見的目錄結構: • /bin:存放windows或Linux平臺上啓動和關閉Tomcat的腳本文件 • /conf:存放Tomcat服務器的各類全局配置文件,其中最重要的是server.xml和web.xml • /doc:存放Tomcat文檔 • /server:包含三個子目錄:classes、lib和webapps • /server/lib:存放Tomcat服務器所需的各類JAR文件 • /server/webapps:存放Tomcat自帶的兩個WEB應用admin應用和 manager應用 • /common/lib:存放Tomcat服務器以及全部web應用均可以訪問的jar文件 • /shared/lib:存放全部web應用均可以訪問的jar文件(可是不能被Tomcat服務器訪問) • /logs:存放Tomcat執行時的日誌文件 • /src:存放Tomcat的源代碼 • /webapps:Tomcat的主要Web發佈目錄,默認狀況下把Web應用文件放於此目錄 • /work:存放JSP編譯後產生的class文件

相關文章
相關標籤/搜索