Java虛擬機-終結篇-上篇

目錄

1 java虛擬機的概述和基本概念
2 堆,棧,方法區
3 瞭解虛擬機參數
4 垃圾回收概念和算法、及對象的分代轉換
5 垃圾收集器
6 Tomcat性能影響實驗
7 性能監控工具
7 性能監控工具==---

1 java虛擬機的概述和基本概念

1.1. java虛擬機原理

所謂虛擬機,就是一臺虛擬的機器。它是一款軟件,用來執行一系列虛擬計算機指令,大體上虛擬機可以分**爲系統虛擬機**和**程序虛擬機**,例如:Vmware,Visual Box
等屬於系統虛擬機。程序虛擬機的代表是就是java虛擬機,它專門爲執行單個計算機程序和設計。在java虛擬機中執行的指令,我們稱爲java字節碼指令。無論是哪一種虛擬機,在上面運行的軟件都被限制於虛擬機鎖提供的資源中。Java發展至今,出現過很多虛擬機。

1.2. 基本概念
java虛擬機基本機構:

1.類加載子系統
    負責從文件系統或者從網絡中獲取class信息,加載信息存放在一塊稱之爲方法區的內存空間
2.方法區
    就是存放類,常量信息,常量池,包括字符串字面量和數字常亮等。
3.java堆
    在java虛擬機啓動的時候建立java堆,它是java程序最主要的內存工作區域,幾乎所有的對象的實例都存放在堆中,對空間是所有線程共享的。
4.直接內存:
    java的NIO庫允許java程序直接使用內存,從而提高性能,通常直接內存的速度優於java堆,讀寫頻繁的場合可能會考慮使用。
5.java棧:
    虛擬機每個線程都有一個私有的棧,一個線程的java棧在線程創建時被創建。java棧中保存着局部變量,方法參數,同時java的方法調用,返回值等。
6.本地方法棧:
    本地方法棧跟java棧相似,最大不同是本地方法棧用於本地方法調用,java虛擬機允許java直接調用本地方法(通常使用c編寫)
7.垃圾收集系統:
    這是java的核心,也是必不可少的,java有一套自己進行垃圾清理的機制,開發人員無需手工清理,系統會自動清理。
8.PC(程序計數器)寄存器:
    也是每個線程的私有空間,java虛擬機會爲每個線程創建pc寄存器,在任意時刻,一個java線程的總是在執行一個方法,這個方法被稱爲當前方法,如果當前方法不是本地方法,pc寄存器就會執行當前正在被執行的命令,如果是本地方法,則pc寄存器之爲undefined,寄存器存放入當前執行環境指針,程序計數器,操作棧指針,計算的變量指針等信息。
9.執行引擎:
    是java虛擬機最核心組件,它負責執行java虛擬機的字節碼,一般是開發者用戶先編譯成機器碼後執行。

2 堆,棧,方法區

2.1 堆,棧,方法區概念和聯繫

堆解決的是數據存儲問題,即數據怎麼放,放在那兒
棧解決程序運行的問題,即程序如何執行,或者說如何處理數據
方法區就是輔助堆棧的快永久區,解決堆棧信息的產生,是先決條件。
example:
    我們創建一個對象,Student:那麼Student類信息,靜態信息都存在於方法區。

而Student類實例化出來之後,被存儲到java堆中,一塊內存空間。
當我們去使用的時候,多事使用Student對象的使用,example: Student st=new Student();
這裏的st存放在java棧中的,即Student真實對象的一個引用。

2.2辨清java堆。
java堆是和java應用程序關係最密切的內存空間,幾乎所有的對象都存放在內存其中,並且java堆完全是自動化管理的,通過垃圾回收機制,垃圾對象會自動清理,不需要顯示地釋放。
根據垃圾回收機制不同,java對可能有不同的結構。最爲常見的就是將整個java對分爲新生代和老年代,其中新生代存放新生的對象或者年齡不大的對象,老年代則存放老年對象。
新生代分爲eden區,s0區,s1區。s0區域和s1區域也被稱爲from和to區域。他們是兩塊大小相等並且可以互換角色的空間。(s1==so)
絕大多數情況下,對象首先分配在eden區,在一次新生代回購後,如果對象還存活,則會進入s0
或者s1區域。之後,每經過一次新生代回收,如果對象存活則它的年齡就加1,當對象達到一定的年齡後,則進入老年代。

2.3java棧
java棧是一塊線程的私有空間,一個棧,一般有三個部分組成:局部變量表,操作數棧和幀數據區。
局部變量表:用於報錯函數的參數及局部變量;
操作數棧:主要保存計算過程的中間結果,同時作爲計算中的臨時存儲空間;
幀數據區:除了以上兩個部分,棧還需要一些數據來支持常量池的解析,這裏保存着訪問常亮池的指針,方便程序訪問常量池。另外,當函數返回或者出現異常是,虛擬機必須有一個異常處理表。方便發送異常的時候找到異常代碼,因爲異常處理表也是幀數據區的一部分。

2.4java方法區

java方法區和java堆一樣。方法區是一塊線程共享的內存區域,它保存系統的類信息,比如類的字段,方法,常量池等。方法區大小決定了系統可以保存多少個類。如果系統綁定太多的類,導致方法區溢出,此時虛擬機同樣會跑出你內存溢出異常。方法區可以理解爲永久區。

3 虛擬機參數理解

3.1虛擬機參數
在虛擬機運行過程中,如果可以跟蹤系統的運行狀態,那麼對於問題的故障排除會有一定的幫助,爲此,虛擬機提供了一些跟蹤系統的參數,使用給定的參數執行java虛擬機,就可以在系統運行時打印日誌,用於分析實際問題。我們進行虛擬機參數配置,其實主要是圍繞,堆、棧,方法區進行配置。
3.2堆分配參數:
-XX:+PrintGC
-XX:+UseSerialGC
-XX:+PrintGCDetails
-Xms:設置java程序啓動時初始堆分配大小
-Xmx:設置java程序能獲得最大堆分配大小
-Xmx20m-Xms5m -XX:+PrintCommandLineFlags:可以將隱式或者顯示傳給虛擬機的參數輸出
新生代配置:
-Xmn:可以設置新生代的大小。
-XX:SurvivorRatio=eden/from=eden/to
-XX:NewRatio=老年代/新生代
3.3堆溢出處理:
在java程序的運行過程中,如果堆空間不足。則會拋出內存溢出的錯誤(Out Of Memory)OOM。
一旦出現這類問題,可能導致整個業務中斷,
java虛擬機提供了-XX:HeapDumpOnOutOfMemoryError,使用該參數可以在內存溢出導出整個棧的信息,與其配合的還有一個參數:
-XX:HeapDumpPath,導出路徑設置
區分以下:
內存泄露:申請使用完的內存沒有釋放,導致虛擬機不能再次使用該內存,此時這段內存就泄露 了,因爲申請者不用了,而又不能被虛擬機分配給別人用。
內存溢出:申請的內存超出了JVM能提供的內存大小,此時稱之爲溢出。
3.5棧配置
-Xss:指定最大棧空間。整個函數也直接決定了函數可調用的最大深度。
3.6方法區
-XX:PermSize=64M -XX:MaxPermSize=64M
3.7直接內存配置
主要爭對用到內存的(跳過java堆)。
-XX:MaxDirectMemorySize,若是不設置,默認是-Xmx。實際超過,也會OOM.
3.8Client和Server虛擬機工作模式。
目前java虛擬機支持Client和Server兩種運行模式。


4 垃圾回收

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章