Java語言與c語言有一個非常重要的區別就是:內存管理方式的不同,java語言內存管理不需要程序開發人員關注,而c語言的內存的請求和釋放都是開發人員來處理。辯證的思維來看,不同內存管理實現方式有優點和缺點,所以語言應用的場景,效率會有很大不同。
Jvm運行時的數據區域主要有:程序計數器、虛擬機棧、本地方法棧、方法區和堆。其中程序計數器、虛擬機棧和本地方法棧是線程獨享,而方法區和堆是所有線程共享。
ü 程序計數器:jvm每個線程都有一個程序計數器。在任一時刻都有一個線程的方法在運行,如果這個方法不是本地方法,那么程序計數器存放的就是正在執行的指令地址;如果是本地方法,那么程序計數器中存放的指定地址為undefined。
ü 虛擬機棧:當jvm創建一個線程的時候就會為線程分配一個虛擬機棧。主要用于存放方法的一些本地變量和部分結果,一般這里的大小都是固定,但不是絕對。一個方法的執行到完成就是棧的入棧和出棧。假設在某方法中定義了一個對象Object obj=new Object();其中obj是存放在棧上,而new Object()是在堆上分配。-Xss可以控制jvm虛擬機棧的大小。
ü 本地方法棧:大體跟虛擬機棧類似,不過是給本地方法使用的。虛擬機棧和本地方法棧在hotspot是沒有分開實現的,而是統稱為棧。
ü 方法區:主要存放靜態變量,常量,類加載器加載的類等一些信息。
ü 堆:jvm絕大部分的對象分配都在堆上分配。-Xmn –Xmx是控制堆最小值和最大值,一般堆的大小在使用了超過mx設定的70%的時候,就會自動擴大到最大值,所以防止這種擴大和縮小我們設置成一樣的值。