成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解JVM之內存區域與內存溢出

開發 后端
與虛擬機棧相似,主要為虛擬機使用到的Native方法服務,在HotSpot虛擬機中直接把本地方法棧與虛擬機棧二合一.

文章目錄

  1. 1. Java內存區域與內存溢出異常

    1. 1.1. 運行時數據區域

      1. 1.1.1. 程序計數器

      2. 1.1.2. java虛擬機棧

      3. 1.1.3. 本地方法棧

      4. 1.1.4. Java堆(Java Heap)

      5. 1.1.5. 方法區

      6. 1.1.6. 運行時常量池

      7. 1.1.7. 直接內存

    2. 1.2. HotSpot虛擬機

      1. 1.2.1. 對象的創建

      2. 1.2.2. 對象的訪問定位

    3. 1.3. OOM異常的解決思路

    4. 1.4. 參考

深入理解jvm之內存區域與內存溢出

Java內存區域與內存溢出異常

運行時數據區域

深入理解jvm之內存區域與內存溢出

程序計數器

  • 當前線程所執行的字節碼的行號指示器

  • 當前線程私有

  • 不會出現OutOfMemoryError情況

java虛擬機棧

  • 線程私有,生命周期與線程相同

  • java方法執行的內存模型,每個方法執行的同時都會創建一個棧幀,存儲局部變量表(基本類型、對象引用)、操作數棧、動態鏈接、方法出口等信息

  • StackOverflowError異常:當線程請求的棧深度大于虛擬機所允許的深度

  • OutOfMemoryError異常:如果棧的擴展時無法申請到足夠的內存

本地方法棧

與虛擬機棧相似,主要為虛擬機使用到的Native方法服務,在HotSpot虛擬機中直接把本地方法棧與虛擬機棧二合一

Java堆(Java Heap)

java堆是被所有線程共享的一塊內存區域,在 虛擬機啟動時創建。此區域的***目的就是存儲對象實例。java堆是垃圾收集器管理的主要區域。java堆還可以細分為:新生代與老年代。在細一點有 Eden空間、Form Survivor空間、To Survivor空間等。

  • 可以通過-Xmx和-Xms控制堆的大小

  • OutOfMemoryError異常:當在堆中沒有內存完成實例分配,且堆也無法再擴展時。

方法區

  • 線程間共享

  • 用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據

  • OutOfMemoryError異常:當方法區無法滿足內存的分配需求時

運行時常量池

  • 方法區的一部分

  • 用于存放編譯期生成的各種字面量與符號引用

  • OutOfMemoryError異常:當常量池無法再申請到內存時

直接內存

  • NIO可以使用Native函數庫直接分配堆外內存,堆中的DirectByteBuffer對象作為這塊內存的引用進行操作

  • 大小不受Java堆大小的限制,受本機(服務器)內存限制

  • OutOfMemoryError異常:系統內存不足時

HotSpot虛擬機

對象的創建

虛擬機遇到一條new指令時,首先將去檢查這個對象的參數是否在常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果沒有,必須先執行類的加載過程。
在類加載檢查通過后,虛擬機將為新生對象分配內存。對象所需內存大小再類加載完成后便可確定。內存分配可以采用“指針碰撞”與“空閑列表”的方式。

對象的訪問定位

java程序需要通過棧上的reference數據來操作堆上的具體對象。訪問方式有使用句柄和直接指針兩種。

  • 句柄訪問 java堆中將會劃分出一塊內存來作為句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據與類型數據各自的具體地址信息

  • 直接指針訪問 java堆對象的布局中必須考慮如何放置訪問類型數據的相關信息,reference中存儲的就是對象地址

OOM異常的解決思路

生成Dump快照文件:

  • 通過jvm參數—XX:-HeapDumpOnOutOfMemoryError可以讓JVM在出現內存溢出是Dump出當前的內存轉儲快照

  • 用jmap生產dump文件,win通過任務管理器查看tomcat的進程pid,linux用ps命令查看進程pid,然后用jmap命令

先通過內存映像分析工具(如Eclipse的Memory Analyzer)進行分析,常見的情況有:

  • 內存泄露,對象已經死了,無法通過垃圾收集器進行自動回收,通過找出泄露的代碼位置和原因,才好確定解決方案;

  • 內存溢出,內存中的對象都還必須存活著,這說明Java堆分配空間不足,檢查堆設置大?。?Xmx與-Xms),檢查代碼是否存在對象生命周期太長、持有狀態時間過長的情況。

OOM異常示例:

package oom;

 

  1. import java.util.ArrayList; 
  2. import java.util.List; 
  3.  
  4. /** 
  5. * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 
  6. * @ClassName: HeapOOM 
  7. * 
  8. */ 
  9. public class HeapOOM { 
  10.     static class OOMObject{ 
  11.  
  12.     } 
  13.  
  14.     public static void main(String[] args) { 
  15.         List<OOMObject> list = new ArrayList<OOMObject>(); 
  16.         while(true){ 
  17.             list.add(new OOMObject()); 
  18.         } 
  19.     } 
責任編輯:王雪燕 來源: wustrive's blog
相關推薦

2021-11-26 00:00:48

JVM內存區域

2023-11-05 12:05:35

JVM內存

2020-05-27 21:13:27

JavaJVM內存

2020-08-10 17:49:25

JVM內存溢出

2021-09-08 17:42:45

JVM內存模型

2010-09-25 12:54:24

JVM內存

2023-10-27 07:47:58

Java語言順序性

2023-09-19 22:47:39

Java內存

2020-11-04 15:35:13

Golang內存程序員

2013-06-20 10:25:56

2022-07-06 08:05:52

Java對象JVM

2021-05-19 07:56:26

Linux內核搶占

2023-12-31 12:56:02

C++內存編程

2025-06-16 07:40:00

2015-03-24 13:28:52

Java Java Strin內存模型

2022-06-22 08:02:11

CPU操作系統Java

2012-05-15 02:04:22

JVMJava

2022-08-21 16:52:27

Linux虛擬內存

2024-03-11 08:22:40

Java內存泄漏

2018-11-01 10:34:37

JVM內存配置
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本一区二区高清不卡 | 国产免费观看视频 | 免费观看色 | 日本字幕在线观看 | 国产激情在线 | 特级生活片 | 久久久999国产精品 中文字幕在线精品 | 在线观看h视频 | 超碰av免费 | 午夜爽爽爽男女免费观看 | 成人精品一区二区三区 | 国产亚洲久 | 久热爱| 免费一级网站 | 欧美日日| 国产精品一区在线观看你懂的 | 中文字幕a√ | 综合视频在线 | 亚洲欧洲精品一区 | 日韩精品在线一区 | 91久久看片 | 在线国产视频观看 | 91在线看片| 日日干夜夜操 | 欧美久久久电影 | 黑人精品 | 亚洲一二三在线 | 久久无毛 | 2019天天操| 一级免费在线视频 | 91精品国产综合久久久久 | 国产95在线 | 一区二区三区精品视频 | 亚洲看片| 成人18亚洲xxoo | 色香蕉在线 | 免费在线一区二区三区 | 欧美日韩精品一区二区 | 一区二区国产精品 | 国产一区二区三区高清 | 色免费在线视频 |