深入jvm虚拟机第4版_深入理解JVM虚拟机
自動內存管理機制
Java虛擬機原理
所謂虛擬機,就是一臺虛擬的機器。他是一款軟件,用來執行一系列虛擬計算指令,大體上虛擬機可以分為
系統虛擬機和程序虛擬機, 大名鼎鼎的Visual Box、Vmare就屬于系統虛擬機,他們完全是對物理計算的仿真,
提供了一個可以運行完整操作系統的軟件平臺。
程序虛擬機典型代碼就是Java虛擬機,它專門為執行單個計算程序而計算,在Java虛擬機中執行的指令我們成為Java
自己碼指令。無論是系統虛擬機還是程序虛擬機,在上面運行的軟件都被限制于虛擬機提供的資源中。
Java發展至今,出現過很多虛擬機,做初Sun使用的一款叫ClassIc的Java虛擬機,到現在引用最廣泛的是HotSpot虛擬
機,除了Sum意外,還有BEA的Jrockit,目前Jrockit和HostSopt都被oralce收入旗下,大有整合的趨勢。
Java內存結構
1、類加載子系統:負責從文件系統或者網絡加載Class信息,加載的信息存放在一塊稱之方法區的內存空間。
2、方法區:就是存放類的信息、常量信息、常量池信息、包括字符串字面量和數字常量等。
3、Java堆:在Java虛擬機啟動的時候建立Java堆,它是Java程序最主要的內存工作區域,幾乎所有的對象實例都存放到
Java堆中,堆空間是所有線程共享。
4、直接內存:JavaNio庫允許Java程序直接內存,從而提高性能,通常直接內存速度會優于Java堆。讀寫頻繁的場合可能會考慮使用。
5、每個虛擬機線程都有一個私有棧,一個線程的Java棧在線程創建的時候被創建,Java棧保存著局部變量、方法參數、同事Java的方法調用、
返回值等。
6、本地方法棧,最大不同為本地方法棧用于本地方法調用。Java虛擬機允許Java直接調用本地方法(通過使用C語言寫)
7、垃圾收集系統是Java的核心,也是不可少的,Java有一套自己進行垃圾清理的機制,開發人員無需手工清理,下一節課詳細講。
8、PC(Program Couneter)寄存器也是每個線程私有的空間, Java虛擬機會為每個線程創建PC寄存器,在任意時刻,
一個Java線程總是在執行一個方法,這個方法稱為當前方法,如果當前方法不是本地方法,PC寄存器總會執行當前正在被執行的指令,
如果是本地方法,則PC寄存器值為Underfined,寄存器存放如果當前執行環境指針、程序技術器、操作棧指針、計算的變量指針等信息。
9、虛擬機核心的組件就是執行引擎,它負責執行虛擬機的字節碼,一般戶先進行編譯成機器碼后執行。
堆、棧、方法區概念區別
Java堆
堆內存用于存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象后,還可以在棧中定義一個特殊的變量,這個變量的取值等于數組或者對象在堆內存中的首地址,在棧中的這個特殊的變量就變成了數組或者對象的引用變量,以后就可以在程序中使用棧內存中的引用變量來訪問堆中的數組或者對象,引用變量相當于為數組或者對象起的一個別名,或者代號。
根據垃圾回收機制的不同,Java堆有可能擁有不同的結構,最為常見的就是將整個Java堆分為
新生代和老年代。其中新聲帶存放新生的對象或者年齡不大的對象,老年代則存放老年對象。
新生代分為den區、s0區、s1區,s0和s1也被稱為from和to區域,他們是兩塊大小相等并且可以互相角色的空間。
絕大多數情況下,對象首先分配在eden區,在新生代回收后,如果對象還存活,則進入s0或s1區,之后每經過一次
新生代回收,如果對象存活則它的年齡就加1,對象達到一定的年齡后,則進入老年代。
Java棧
Java棧是一塊線程私有的空間,一個棧,一般由三部分組成:局部變量表、操作數據棧和幀數據區
局部變量表:用于報錯函數的參數及局部變量
操作數棧:主要保存計算過程的中間結果,同時作為計算過程中的變量臨時的存儲空間。
幀數據區:除了局部變量表和操作數據棧以外,棧還需要一些數據來支持常量池的解析,這里幀數據區保存著
訪問常量池的指針,方便計程序訪問常量池,另外當函數返回或出現異常時賣虛擬機子必須有一個異常處理表,方便發送異常
的時候找到異常的代碼,因此異常處理表也是幀數據區的一部分。
Java方法區
Java方法區和堆一樣,方法區是一塊所有線程共享的內存區域,他保存系統的類信息。
比如類的字段、方法、常量池等。方法區的大小決定系統可以保存多少個類。如果系統
定義太多的類,導致方法區溢出。虛擬機同樣會拋出內存溢出的錯誤。方法區可以理解
為永久區。
虛擬機參數配置
什么是虛擬機參數配置
在虛擬機運行的過程中,如果可以跟蹤系統的運行狀態,那么對于問題的故障
排查會有一定的幫助,為此,在虛擬機提供了一些跟蹤系統狀態的參數,使用
給定的參數執行Java虛擬機,就可以在系統運行時打印相關日志,用于分析實際
問題。我們進行虛擬機參數配置,其實就是圍繞著堆、棧、方法區、進行配置。
你說下 你熟悉那些jvm參數調優
堆的參數配置
-XX:+PrintGC 每次觸發GC的時候打印相關日志
-XX:+UseSerialGC 串行回收
-XX:+PrintGCDetails 更詳細的GC日志
-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-XX:SurvivorRatio 用來設置新生代中eden空間和from/to空間的比例.
含以-XX:SurvivorRatio=eden/from=den/to
總結:在實際工作中,我們可以直接將初始的堆大小與最大堆大小相等,
這樣的好處是可以減少程序運行時垃圾回收次數,從而提高效率。
-XX:SurvivorRatio 用來設置新生代中eden空間和from/to空間的比例.
設置最大堆內存
參數: -Xms5m -Xmx20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags
/**
* jvm參數設置
*
* @author Administrator
*
*/
public class JvmDemo01 {
public static void main(String[] args) throws InterruptedException {
byte[] b1 = new byte[1 * 1024 * 1024];
System.out.println("分配了1m");
jvmInfo();
Thread.sleep(3000);
byte[] b2 = new byte[4 * 1024 * 1024];
System.out.println("分配了4m");
Thread.sleep(3000);
jvmInfo();
}
/**
* 轉換為m
*
* @param maxMemory
* @return
*/
static private String toM(long maxMemory) {
float num = (float) maxMemory / (1024 * 1024);
DecimalFormat df = new DecimalFormat("0.00");// 格式化小數
String s = df.format(num);// 返回的是String類型
return s;
}
static private void jvmInfo() {
// 最大內存
long maxMemory = Runtime.getRuntime().maxMemory();
System.out.println("maxMemory:" + maxMemory +
總結
以上是生活随笔為你收集整理的深入jvm虚拟机第4版_深入理解JVM虚拟机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓连接mysql代码_用Eclipse
- 下一篇: 3dsmax如何绘制旋转楼梯