1. 程式人生 > >Java記憶體管理機制詳解

Java記憶體管理機制詳解

Java記憶體管理機制

本文將介紹Java虛擬機器所管理的記憶體區域以及記憶體回收問題:

  • 1、Java虛擬機器所管理的記憶體區域
  • 2、記憶體回收問題
    <1>:常用垃圾收集演算法
    <2>:JVM如何判斷一個物件已經消亡可以被回收
    <3>:如何設定JVM引數

1、Java虛擬機器所管理的記憶體區域

Java記憶體區域分為五部分:分別是方法區、虛擬機器棧、本地方法棧、堆和程式計數器。
其結構圖如下:
這裡寫圖片描述
其中方法區和堆是所有執行緒共享的資料區。其他三部分是執行緒隔離的。
各個區域的具體情況如下:

  1. 程式計數器:
    可以看作是當前執行緒所執行的位元組碼的行號指示器,類似組原中的計數器,指定下一條要執行的指令。
  2. Java虛擬機器棧:
    執行緒私有,生命週期跟隨著執行緒,虛擬機器棧所描述的是Java方法執行的記憶體模型,每個方法在執行的同時都會建立一個棧幀用於儲存區域性變量表,運算元棧,動態連結串列,方法出口資訊等。

  3. 本地方法棧:
    為虛擬機器使用的Native方法服務。

  4. Java堆
    所有執行緒共享的一塊記憶體區域,在虛擬機器啟動的時候建立,此區域的唯一目的是存放物件例項。Java堆是垃圾收集器管理的主要區域,收集器基本採用分代回收演算法。

  5. 方法區
    各個執行緒共享的區域,用於儲存已被虛擬機器載入的類資訊,常量,靜態變數,即時編譯器編譯後的程式碼等資料。總的來說,該區域類似C++中的靜態儲存區。

2、JVM記憶體回收問題(GC)

<1> 常用的基本垃圾回收演算法

(1)標記-清除演算法
首先標記出所有需要回收的物件,然後回收所有需要回收的物件。
缺點是會使記憶體不連續,無法分配大記憶體塊
(2)標記-清除-壓縮演算法
這種垃圾回收演算法對上一種進行了優化,記憶體回收後進行一次記憶體優化壓縮,跟作業系統裡的記憶體緊縮相似。
缺點是會造成記憶體間不停的拷貝複製,效能非常差。
(3)標記-清除-複製演算法
這種垃圾回收演算法首先將記憶體空間分為兩塊相同的區域A和B,在記憶體回收時將A中還存活的記憶體塊複製到B中,然後一次性清空A。
缺點是:對記憶體的要求大一些,長期複製拷貝上也會受到影響。

這三種是基礎的垃圾回收演算法,Java中使用的是分代收集演算法,主要根據物件存活期將記憶體進行劃分為兩部分:

新生代 (3)複製演算法進行回收
老年代 (2)標記-清除-壓縮演算法進行回收

<2> 如何判斷一個物件可以被回收

(1)引用計數器法
思想十分簡單,引用某一物件,計數器便加1,引用失效就減1,計數器為零的物件便是可以回收的。
Java並沒有使用這種方法,因為不能很好解決迴圈引用的問題。
(2)通過根搜尋演算法
通過一系列的名為“GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈,當一個物件沒有任何引用鏈相連時,該物件即為不可達,無法引用該物件。
可以作為GC Roots的物件:

虛擬機器棧(棧幀中的本變量表)中引用的物件
方法區中的類靜態屬性引用的物件
方法區中的常量引用物件
本地方法棧中的JNI引用的物件

<3> 如何設定JVM中堆的大小以及年輕代中的Eden區和Survivor區

引數 含義 解釋
-xms 初始堆大小 空餘堆記憶體小於40%的時候,JVM會增大堆直到-xms的最大限制
-xmx 最大堆大小 空餘堆記憶體大於70%的時候,JVM會減小堆直到-xms的最小限制
-xmn 年輕代大小
-xxsurivorRatio Eden區與Survivor區的大小比值 設定為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區佔整個年輕代的1/10

相關推薦

Java記憶體管理機制

Java記憶體管理機制 本文將介紹Java虛擬機器所管理的記憶體區域以及記憶體回收問題: 1、Java虛擬機器所管理的記憶體區域 2、記憶體回收問題 <1>:常用垃圾收集演算法 <2>:JVM如何判斷一個物件已經消亡可以被回收

Java記憶體分配機制

文章轉載自:http://www.cnblogs.com/zhguang/p/3257367.html 本文僅載抄了部分內容,若想知道JVM記憶體全量資訊,請檢視原文 Java記憶體分配機制 這裡所說的記憶體分配,主要指的是在堆上的分配,一般的,物件的記憶體分配都是在堆

Android記憶體管理機制

無意中在MIUI看到的文章,感覺不錯,轉了過來。 原文如下: 最近看到很多機油發帖抱怨記憶體太小程序殺不掉。首先要表示,這個帖子是從百度貼吧轉來的,主要針對正常的安卓機,像里程碑這種悲劇的小記憶體機器

Java的反射機制(一)

pbc spa 詳解 uno face target lan tor cin 8n72q傅釁8戰sig叢http://www.docin.com/app/user/userinfo?userid=179185461 8u炊3F7LB椒1http://huiyi.docin.

Java中反射機制

turn face instance java struct () 分享 2.6 一個     序言       在學習java基礎時,由於學的不紮實,講的實用性不強,就覺得沒用,很多重要的知識就那樣一筆帶過了,像這個馬上要講的反射機制一樣,當時學的時候就忽略了,到後來學習

mybatis事務管理機制

attribute log builder tween gen 事務管理 getc there spro 1.mybatis事務的配置和使用 mybatis事務有兩種使用方式: (a):使用JDBC的事務管理機制:即使用java.Sql.Connection對象完成對事務的

Java 類載入機制

一、類載入器   類載入器(ClassLoader),顧名思義,即載入類的東西。在我們使用一個類之前,JVM需要先將該類的位元組碼檔案(.class檔案)從磁碟、網路或其他來源載入到記憶體中,並對位元組碼進行解析生成對應的Class物件,這就是類載入器的功能。我們可以利用類載入器,實現類的動態載入。 二、類的

java回撥機制

原文出自這兒:https://blog.csdn.net/fengye454545/article/details/80198446   為了自己能夠加深理解自己動手敲了一遍,也寫寫,有時間看看。更詳細建議訪問原創博主。 ===========================

0.2.Java垃圾回收機制

一、為什麼需要垃圾回收   如果不進行垃圾回收,記憶體遲早都會被消耗空,因為我們在不斷的分配記憶體空間而不進行回收。除非記憶體無限大,我們可以任性的分配而不回收,但是事實並非如此。所以,垃圾回收是必須的。 二、哪些記憶體需要回收? 哪些記憶體需要回收是垃圾回收機制第一個

Java動態代理機制

 在學習spring的時候,我們知道Spring主要有兩大思想,一個是IoC,另一個就是AOP,對於IoC,依賴注入就不用多說了,而對於Spring的核心AOP來說,我們不但要知道怎麼通過AOP來滿足的我們的功能,我們更需要學習的是其底層是怎麼樣的一個原理,而AOP的原理就是Java的動態代理機制,所以本篇

jvm之java垃圾回收機制

      傳統的C/C++等程式語言,需要程式設計師負責回收已經分配出去的記憶體。顯示進行垃圾回收是一件令人頭疼的事情,因為程式設計師並不總是知道記憶體應該何時進行釋放。如果一些分配出去的記憶體不能及時的回收就會引起系統執行速度下降,甚至導致程式癱瘓,這種現象稱為記憶體洩露

java記憶體管理機制(一)-執行時資料區

前言   本打算花一篇文章來聊聊JVM記憶體管理機制,結果發現越扯越多,於是分了三遍文章(文章講解JVM以Hotspot虛擬機器為例,jdk版本為1.8),本文為其中第一篇。from java記憶體管理機制(一)-執行時資料區    1、 java記憶體管理機制-執行時資料區

C語言記憶體管理

補充: 1.一個正在執行著的C編譯程式佔用的記憶體分為棧區、堆區、未初始化資料區(BBS)、初始化資料區、程式碼區5個部分。 (1)棧區:存放函式的引數值、區域性變數的值。由編譯器自動分配釋放。 (2)堆區:用於動態記憶體分配。由使用者通過malloc或new函式分配,由使

Android開發——Android 6.0許可權管理機制

0.前言最近在研究所實習,我負責維護Android手機取證專案的Android客戶端,有客戶反映我們的APP在Android6.0無響應,經過除錯發現SD卡讀寫許可權許可權被拒絕。但明明是在AndroidManifest.xml檔案中宣告過的。查了很多資料才知道Android

java的執行機制 .

我們可以通過helloworld來理解這幾個縮寫詞的具體含義: public class HelloWorld { public static void main(String[] args) { System.out.println("hellowo

Spark 統一記憶體管理模型

其實 Spark UI 上面顯示的 Storage Memory 可用記憶體等於堆內記憶體和堆外記憶體之和,計算公式如下: 堆內 systemMemory = 17179869184 位元組 reservedMemory = 300MB = 300 * 1024 *

基於STM32原子戰艦板記憶體管理原始碼

走到今天,已經開始涉及到計算機核心一點的東西了---記憶體管理。通過本實驗的學習,能夠較為深刻體會到“指標是c語言的靈魂”這句話的分量。自然對c語言的能力要求就高很多了。       最近有點亂,但是有關嵌入式系統的學習不曾怠慢過。本文是基於原子老師的c原始碼,自己的學

Android記憶體基礎——Java記憶體管理機制

參考連結 參考資料1 背景介紹 Java優勢之一就是其具有垃圾回收機制。在大部分情況下,JVM的GC(垃圾回收器)能夠幫助我們回那些不可到達的物件(就是未被引用的物件)。 當然,在一些情況下

淺析java記憶體管理機制

記憶體管理是計算機程式設計中的一個重要問題,一般來說,記憶體管理主要包括記憶體分配和記憶體回收兩

Java動態代理機制(JDK動態代理與CGLIB動態代理區別)

代理是一種常用的設計模式,其目的就是為其他物件提供一個代理以控制對某個物件的訪問。代理類負責為委託類預處理訊息,過濾訊息並轉發訊息,以及進行訊息被委託類執行後的後續處理。在講述動態代理前,我們先通過一個例子瞭解一下什麼是靜態代理,這裡以事務控制為例。 1.靜態