1. 程式人生 > >【JVM讀書筆記】- Java記憶體區域

【JVM讀書筆記】- Java記憶體區域

Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體分為若干個區域。

1. 程式計數器

  • 作用:通過改變這個計數器的值來選取下一條需要執行的指令。
    • 如果正在執行的是Java方法,那麼計數器記錄的是正在執行的虛擬機器位元組碼指令地址;如果正在執行的是Native方法,那麼此計數器為空。
  • 儲存方式:由於Java虛擬機器是通過執行緒輪流切換並分配處理器的方式來實現的,在任何一個確定的時刻,一個處理器(核心)都會執行一個執行緒中的指令。每個執行緒都有自己獨立的程式計數器,各個執行緒之間計數器互不影響,獨立儲存。

2. Java虛擬機器棧

  • 作用:每個方法在執行的同時會建立一個棧幀,用於存放區域性變量表、運算元棧、動態連結、方法出口等資訊。每個方法從呼叫到執行完成,就對應著一個棧幀從入棧到出棧的過程。執行緒私有
  • 異常:如果執行緒請求的棧深度大於虛擬機器允許的深度,將丟擲stackOverFlowError異常;如果虛擬機器棧允許動態擴充套件,如果擴充套件時無法申請到足夠的記憶體,就拋outofMemoryError異常

3. Java堆

  • 作用:是所有執行緒共享的一塊區域,在虛擬機器啟動時建立,此記憶體區域的唯一目的是存放物件的例項,所有物件例項以及陣列都要在堆上分配。
  • 組成:
    • 新生代
      • Eden
      • Survivor0
      • Survivor1
    • 老年代
  • 異常:如果堆中沒有記憶體完成例項分配,並且堆無法再擴充套件,將會丟擲OutOfMemoryError

4. 方法區

  • 作用:各個執行緒共享,用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。

5. 執行時常量池

  • 作用:用於儲存編譯期生存的各種字面量和符號引用,這些常量是Class檔案中的一部分。

看了一個專案beta環境的jvm記憶體空間,試用了一下jmap

ps aux | grep java
nobody   23580  7.9 30.1 4905964 1145092 ?     Sl   17:42   1:34 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Djava.awt.headless=true 
-Xms2048m
-Xmx2048m -Xss256k
-XX:PermSize=128m -XX:MaxPermSize=384m -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:SurvivorRatio=22 -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=%CATALINA_HOME%conflogging.properties -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -Xloggc:/data/applogs/heap_trace.txt -XX:-HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/HeapDumpOnOutOfMemoryError -Dcom.sun.management.snmp.port=9998 -Dcom.sun.management.snmp.interface=localhost -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
[[email protected]_225-176 bin]$ sudo /usr/local/jdk/bin/jmap -heap 23580   # 檢視整個JVM記憶體狀態
Attaching to process ID 23580, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio = 40   #  GC後,如果發現空閒堆記憶體佔到整個預估堆記憶體的40%,則放大堆記憶體的預估最大值,但不超過固定最大值
   MaxHeapFreeRatio = 70   #  GC後,如果發現空閒堆記憶體佔到整個預估堆記憶體的70%,則收縮堆記憶體預估最大值。
   MaxHeapSize      = 2147483648 (2048.0MB)  #最大堆記憶體
   NewSize          = 1073741824 (1024.0MB)  #設定年輕代大小
   MaxNewSize       = 1073741824 (1024.0MB)  #設定年輕代最大值
   OldSize          = 5439488 (5.1875MB)     #設定老年代大小 ???
   NewRatio         = 2                      # 年老代/年輕代 = 2 即年輕代佔堆記憶體的1/3  *** 使用了UseConcMarkSweepGC垃圾回收器後,此配置失效。
   SurvivorRatio    = 22                     #eden大小/survivor大小,即eden = 22/24, survivor=1/24 *2
   PermSize         = 134217728 (128.0MB)    #持久代大小
   MaxPermSize      = 402653184 (384.0MB)    #持久代大小最大值
   G1HeapRegionSize = 0 (0.0MB)              #使用預設的G1 GC垃圾回收器時,設定G1區域的大小

根據上面的描述,可知 持久代128MB, 年老代 512MB(???), 年輕代為1024MB, eden區:1024 * (22/24)= 938.66MB, survivor區: 42.66MB
Heap Usage:
New Generation (Eden + 1 Survivor Space):    #新生代: 938+42 = 981
   capacity = 1029046272 (981.375MB)
   used     = 792923344 (756.1906280517578MB)
   free     = 236122928 (225.1843719482422MB)
   77.05419722855767% used
Eden Space:       
   capacity = 984350720 (938.75MB)
   used     = 748227800 (713.5656356811523MB)
   free     = 236122920 (225.18436431884766MB)
   76.01231804859147% used
From Space:
   capacity = 44695552 (42.625MB)
   used     = 44695544 (42.62499237060547MB)
   free     = 8 (7.62939453125E-6MB)
   99.9999821011272% used
To Space:                                    # 看起來 survivor2區並沒有算在新生代裡
   capacity = 44695552 (42.625MB)
   used     = 0 (0.0MB)
   free     = 44695552 (42.625MB)
   0.0% used
concurrent mark-sweep generation:            # 老生代使用情況情況
   capacity = 1073741824 (1024.0MB)          
   used     = 4679768 (4.462974548339844MB)
   free     = 1069062056 (1019.5370254516602MB)
   0.43583735823631287% used
Perm Generation:                             # 永久代使用情況(永久代不在堆上)
   capacity = 134217728 (128.0MB)
   used     = 71334928 (68.03028869628906MB)
   free     = 62882800 (59.96971130371094MB)
   53.14866304397583% used

23875 interned Strings occupying 2709232 bytes.

相關推薦

JVM讀書筆記- Java記憶體區域

Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體分為若干個區域。 1. 程式計數器 作用:通過改變這個計數器的值來選取下一條需要執行的指令。 如果正在執行的是Java方法,那麼計數器記錄的是正在執行的虛擬機器位元組碼指令地址;如果正在執

深入理解Java虛擬機器讀書筆記1----Java記憶體區域與HotSpot虛擬機器物件

一 Java記憶體區域與HotSpot虛擬機器物件 1 Java技術體系、JDK、JRE?     Java技術體系包括:         · Java程式設計語言;   

《深入理解java虛擬機器》讀書筆記2(java記憶體區域與OOM)

1.java執行時記憶體劃分 》程式計數器 學過彙編的童鞋都知道程式執行時會記錄當前執行的位置,以便確認接下來執行什麼。這裡的程式計數器就是用來儲存當前執行緒所執行位元組碼的行號指示器,也就是地址,位元組碼指示器通過改變程式計數器的值來指定下一條執行

《深入理解 Java 虛擬機器》讀書筆記Java 記憶體區域記憶體溢位異常

前言 最近開始看這本書,記得前段時間拿起這本書的時候,心情是相當沉重的!當時的劇本是這樣的—— 內景。家裡 - 下午 我(畫外):唉,有點無聊啊!(偶然撇過書架)這麼多書得看到什麼時候啊,要不要拿一本翻翻呢?但是在家裡好像有點看不下去啊,是太安逸了嗎?最近那本《圖解 HTTP》也還沒看完,感覺暫時有點不想

讀書筆記JAVA基礎:1、深入理解JVM

  通過《深入理解JAVA虛擬機器》和《深入理解計算機系統》兩本經典著作的學習,注重瞭解系統程序執行時記憶體結構的變化,以此徹底瞭解JVM虛擬機器在執行JAVA程式時的記憶體結構!       主要有三個方面:   &nb

JVM程式設計師進階JVM(一)——Java記憶體區域

一、前言       這篇部落格起,小編會向一個更加深層次、逼格滿滿的區域進發——JVM。       可以說JVM不是一個新鮮的東西,但是做java的都會了解JVM,都聽過JVM。有的時候我們寫的程式碼執行跟JVM也有關係。 二、JVM介紹    

讀書筆記Java 工程師修煉之道

日期:2018年10月19日 13:09 地點:玉泉慧谷 圖書:《Java 工程師修煉之道》2018年3月出版 一、記錄 前天晚上睡前無聊,在多看app裡搜了下 Java 相關的電子書。有 3 本成功吸引了我的注意力,其中一本就是上面提到的這個。看到的時候,已經很

JVM學習筆記(一)jvm初體驗-記憶體溢位問題分析及解決方案

####1、開始 建立Main類和Demo類,在Main類的main方法中建立List,並向List中無限建立Demo物件,造成記憶體溢位, 並輸出記憶體溢位錯誤檔案在專案目錄下,為了使等待時間減小,設定執行堆記憶體大小。 ####2、建立Demo類 package com.ch

深入理解Java虛擬機器Java記憶體區域模型、物件建立過程、常見OOM

本文內容來源於《深入理解Java虛擬機器》一書,非常推薦大家去看一下這本書。最近開始看這本書,打算再開一個相關係列,來總結一下這本書中的重要知識點。呃呃呃,說好的那個圖片請求框架呢~  不要急哈,因為這個請求框架設計的內容還是比較廣的,目前業餘時間正在編寫當中,弄好了之後就會

筆記:深入理解JVM 第2章 Java記憶體區域記憶體溢位

1、JVM 執行時資料區 所有執行緒共享的資料區:方法區(持久代)、堆區 執行緒隔離的資料區:程式計數器、Java虛擬機器棧區 堆區構成:新生代 ( 由Eden, From Survivor, To Survivor 構成)、老生代 執行時常量池:方法區一部分,用於存放編

java虛擬機器java記憶體區域記憶體溢位異常

本文參考自《深入理解Java虛擬機器》一書。主要總結一下java虛擬機器記憶體的各個區域,以及這些區域的作用、服務物件以及其中可能產生的問題。 ##1. 執行時資料區域   java虛擬機器在執行ja

tij學習筆記Java finalize()的使用

依賴 資源釋放 定時 java system 使用 pan 靠譜 col 《Java編程思想》中有提到,Java的垃圾回收器並不是那麽靠譜,垃圾回收會占用很大的資源開銷,垃圾回收器很懶,當變量和對象不再被引用、脫離作用域的時候,垃圾回收器會不定時的進行垃圾回收,也就是說,當

《深入理解java虛擬機器》讀書筆記(一)---java記憶體

吐槽 最近上課無聊的時候還是趕緊看下java虛擬機器這本書吧,因為最近要看熱修復技術這塊,但是直接上手發現好的原理性的東西還是不知道唉,還是先看下《深入理解java虛擬機器》這本書吧。 java的記憶體 之前和一個學C++的朋友一起聊天的時候,他給我說,C++的

深入理解Java虛擬機器讀書筆記8----Java記憶體模型與執行緒

八 Java記憶體模型與執行緒   1 Java記憶體模型     ---主要目標:定義程式中各個變數的訪問規則,即在虛擬機器中將變數儲存到記憶體和從記憶體中取出變數這樣的底層細節。     ---此處的變數和Java中的變

深入理解JVM—第二章:Java記憶體區域記憶體溢位異常

1,概述 Java較C、C++,Java可以利用虛擬機器的自動記憶體管理機制,避免繁瑣的記憶體分配與回收。不容易出現記憶體洩漏和記憶體溢位問題。 記憶體洩漏:指程式申請到的記憶體空間不再歸還(無法歸還),可使用完該記憶體空間的程式也不能再訪問該空間(

JVM 第2章 Java記憶體區域記憶體溢位異常

可以參考下,這個寫的簡練 https://blog.csdn.net/seu_calvin/article/details/51404589 1 概述 對於java程式設計師來說,在虛擬機器自動記憶體管理機制的幫助下,不需要為每一個new操作去寫配對的delete/free程式碼,不

C++入門筆記動態記憶體管理

此文針對FishC大佬的《C++快速入門》第三十三講—動態記憶體管理,本文是對其的筆記整理。 到目前為止,所有的示例程式在完成它的任務時所使用的記憶體空間都是固定不變的。 這個固定不變的記憶體空間其實是在編寫程式的時候就可以知道和確定的(一般以變數的形式)。這些程式都不能在程式執行期間動

個人學習筆記Java Web用一個簡單的jsp頁面實現輸出100以內的素數

<%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <html> <

代碼筆記Java文件的輸入輸出(1)——Java.io包的初步理解

對象 eclips 是什麽 reader optional 傳輸 gre 用戶界面 cep Java裏面文件的輸入輸出全部在java.io包裏面。 Java.io包裏面所有的類都需要掌握。 java.io包裏面所有的東西都在上面了。 包裏面的相關類

代碼筆記Java常識性基礎補充(一)——

main pan 類型 lean strong img out stat 初始化 1.0 如何定義數組以及訪問數組中的元素,如下所示。ArrayDemo01.java public class ArrayDemo01 { public stat