java虛擬機精講

2.程序計數器 是指當前線程所執行字節碼的行號指示器 好比if 循環 拋異常 等都須要程序計數器
若是線程執行java方法 程序計數器記錄的是虛擬機字節碼指令的地址 若是線程執行native方法時程序計數器記錄的值爲空 程序計數器是java虛擬機惟一一個沒有規定內存溢出的區域
3.虛擬機棧和本地方法棧 虛擬機棧主要是爲虛擬機執行的java方法服務 本地方法棧主要是未虛擬機使用的native方法服務
4.GC的分代收集算法 分爲年輕代和老年代 年輕代纔有複製算法 eden from to
當eden區滿了 會啓動年輕代的垃圾回收將還在被引用的對象複製到from 若是edan再次滿了
form區會將還在被引用的對象複製到to from和to是一個循環複製 當from和to都滿了則複製到
老年代區去 採用的標記清理和標記整理算法 老年代內存滿了 則進行大掃除 FUll GC
FUll GC過多會影響到系統性能 合理分配年輕代和老年代的內存大小 儘可能減小FUll GC操做
根據不一樣場景 選擇合適的垃圾收集器
5.堆 是被全部線程共享的內存區域 java虛擬機啓動時建立 主要存儲對象實例 也是垃圾收集器
管理的重要內存區域 方法區是存儲已被虛擬機加載的類信息 不多會被垃圾回收 通常收集常量池和
對類型的卸載
6.引用方式二種 使用句柄 和使用直接指針
使用句柄 存儲了穩定的句柄地址 對象被移動了 只會改變句柄中實例數據的指針 reference自己不須要修改
使用直接指針 減小了一次指針定位的時間開銷 提升效率
7.若是創建過多的線程致使棧溢出 能夠經過減小堆內存和減小每一個線程分配的棧容量增長線程數
8.怎麼判斷對象是否存活 不是用引用計數算法(對於對象相互引用的狀況不可行) 用根搜索算法
當GC roots 到對象不可達的時候表明就能夠回收了
9.對象的finalize方法只會被系統調用一次
10.方法區的無用類的判斷
第一 該類的全部實例都被回收了 也就是堆中不存在該類的任何實例對象
第二 該類的加載器ClassLoader已經被回收了
第三 該類的java.lang.Class 不在任何地方引用 任何地方不存在反射引用該類的方法
11.能夠設定進入老年代的對象最大年齡閥值 max 對象每通過一次Minor GC 對象年齡加一
對象年齡超過閥值則就進入老年代 或者是 survivor區當相同年齡的對象內存在survivor區內存的一半則將等於或者大於這個年齡的進入老年代
12.java自帶一些命令和工具查看java虛擬機內存使用狀況
jps命令 獲取到虛擬機的進程號pid
jinfo命令 獲取到java虛擬機信息
jstat命令 獲取到java虛擬機統計信息監控工具 就是堆棧和永久代等的使用狀況
jmap命令 獲取到java虛擬機 堆內存的使用狀況 好比新生代和老年代
jstack命令 獲取到java虛擬機棧內存的使用狀況
13.內存管理工具 jconsole和VisualVM(多合一故障處理工具)
jconsole啓動jdk中bing中jconsole.exe可執行文件就可使用
VisualVM須要安裝插件
14.正向代理和反向代理 正向代理 客戶端和代理在同一網 反向代理 代理和服務器在同一個網
15.Serial收集器和CMS收集器 收集器不是萬能須要更加具體的情景採用不一樣的收集器
Serial收集器採用的單線程執行 中止其餘的工做 只執行垃圾收集
ParNew收集器採用的多線程執行 中止其餘的工做 和Serial相似 就是能夠多線程執行
CMS收集器採用的和工做線程併發執行垃圾收集 低停頓 解決GC停頓時間長的問題
G1收集器是在CMS收集器上的優化 能夠控制停頓時間
Paralel Scavenge收集器控制吞吐量
通常新生代採用Serial和ParNew收集器 老年代採用CMS收集器
16.有11G垃圾並且還有大對象 致使服務器每隔十幾分鐘停頓十幾秒 怎麼解決呢
服務器採用6個32位JDK的邏輯集羣 每一個進程分配2G 總共12G 創建一個Apache服務做爲前端
均衡代理訪問門戶
17.JBossCache 和 MemCached 分佈式緩存架構
JBossCache採用的每一個集羣服務器都有公共的緩存 這樣至關於一個服務器的緩存須要同步其餘的服務器的緩存 代價大
MemCached採用的互不通信的方式 有一個公共的服務器管理全部集羣服務器的緩存
18.堆 虛擬機棧和本地方法棧(線程死鎖和直接內存) 進程(Runtime.getRuntime().exec())
19.生產者和消費者模式解決不斷建立線程致使的jvm內存不足還一直重啓的問題
20.類在虛擬機的整個生命週期 加載 驗證 準備 解析 初始化 使用 卸載
21.tomcat如何規劃用的類庫和加載器? (雙親委派模型 啓動類加載器 擴展類加載器 應用程序加載器 用戶自定義加載器)
common/ tomcat和全部的web應用程序共同使用 common類加載器
server/ tomcat使用 全部的web應用程序不能使用 catalina加載器
shared/ tomcat不能使用 全部的web應用程序使用 shared加載器
WEB-INF/ 當前應用程序使用 其餘應用程序和tomcat不能使用 webApp加載
22.javac編譯器是將java文件編譯成字節碼的class文件 加載器則是將將字節碼的class文件加載到JVM上 動態代理模式採用生成字節碼的方式實現
23.類加載器原則:委託 單一 可見性
委託:application加載器委託給Extention加載器 Extention加載器再委託給Boostsrap加載器(再向下尋找)
可見性 父類的加載的類子類可見 子類的加載的類父類不可見
單一性 父類加載的類 子類不能重複加載
24.java泛型相比C語言的泛型定義是不一致的 java的泛型能夠說是僞泛型
java泛型實現原理 採用Object 進行強制類型轉換 在編譯是存儲的是泛型T 因此會出現不一樣的泛型的List集合作爲單參沒法重載 在運行時進行強制類型轉換 缺點是容易出現ClassCastException異常
25.java虛擬機採用基於計數的熱點探測 檢查線程的棧頂常常出現的代碼 統計熱點代碼
26.線程安全的volatile修改的變量 被一個線程修改了會被及時刷新到變量中被其餘線程可見
synchronized lock
27.鎖優化方案 鎖加粗 消除鎖 偏向鎖 輕量級鎖 自旋鎖和自適應鎖 提升由於加鎖的下降的效率
相關文章
相關標籤/搜索