jvm學習筆記(一) ----- JAVA 內存

JAVA 內存

  • 一、程序計數器
  • 二、虛擬機棧
  • 三、本地方法棧
  • 四、堆
  • 五、非JAVA內存(堆外內存)
    • 1.元空間(Metaspace)
    • 2.直接內存

鏈接: jvm學習筆記(二) ----- 垃圾回收
鏈接: jvm學習筆記(三) ----- 垃圾回收器

在這里插入圖片描述

一、程序計數器

  1. 虛擬機需要通過『程序計數器』記錄指令執行到哪了。
  2. 線程要輪流使用 CPU 時間片,因此需要『程序計數器』來記住正在執行的字節碼的地址。例如 線程 A 的計數器記錄當前執行到了第三行字節碼,這時候時間片用完了,CPU 切換到其它線程運行,當 CPU 再次切換到 線程 A 時,它就會從計數器得知上次執行的代碼位置,繼續向下運行。

在這里插入圖片描述

二、虛擬機棧

  1. 作用: 一個線程使用的內存大小。線程內調用一次方法,就會產生一個棧幀,棧幀內包含方法內局部變量,方法參數,返回地址等。多個棧幀合稱為『棧』,而正在執行的方法稱為『活動棧幀』,一個線程內同一時刻只能有一個『活動棧幀』
  2. 配置:
-XssThe default value depends on the platform: 
* Linux/x64 (64-bit): 1024 KB 
* macOS (64-bit): 1024 KB 
* Oracle Solaris/x64 (64-bit): 1024 KB 
* Windows: The default value depends on virtual memory
*
  1. 特點:
    • 方法執行完畢,棧幀內存即被釋放
    • 因為線程私有,不存在共享,因此線程安全
    • 值越大,會讓線程數更少
  2. 棧內存溢出情況
    • 棧太小,方法調用過深(棧幀太多)
    • 棧太小,方法內局部變量太多(棧幀太大)
  3. 測試代碼如下:
public class Demo1 {private static  int count = 0;public static void main(String[] args) {method1();}private static void method1() {count ++ ;System.out.println(count);method1();}}

三、本地方法棧

  • 每個線程啟動時,還會分配『本地方法棧』內存,來給哪些其它語言實現的方法(稱為本地方法)使用。
    +在這里插入圖片描述

四、堆

  1. Java堆通常是Java虛擬機所管理的內存中最大的一塊。Java堆是被鎖有線程共享的一塊內存區域,在虛擬機啟動時創建。這塊區域唯一的目的就是存放對象實例,幾乎所有對象實例及數組都在該區域分配內存,從 JDK1.7 開始,StringTable等也會使用堆內存。
  2. Java堆時垃圾收集器管理的主要區域(GC堆),從內存回收的角度(收集器一般采用分代收集算法),堆被劃分為新生代和舊生代,新生代又被進一步劃分為Eden(伊甸園) 和 Survivor(幸存區) 區,最后Survivor由FromSpace和ToSpace組成,結構圖如下所示:在這里插入圖片描述
  3. 堆空間內存分配(默認情況下)
  • 老年代 : 三分之二的堆空間

  • 年輕代 : 三分之一的堆空間

  • eden區: 8/10 的年輕代空間

  • survivor From : 1/10 的年輕代空間

  • survivor To : 1/10 的年輕代空間

五、非JAVA內存(堆外內存)

1.元空間(Metaspace)

在這里插入圖片描述

  1. 作用:用來存儲類對象,類加載器,靜態變量,StringTable,SymbolTable,即時編譯器生成的代碼等。

  2. 歷史:

    1. 『方法區』是 Java VM 規范中定義的概念,具體實現根據各個虛擬機廠商的不同而不同。對于 Oracle 的 HotSpot 虛擬機來說,最初作為『方法區』的實現稱之為『永久代』,從 Java 8 開始,『永久代』被替換為『元空間』。
    2. 『永久代』,垃圾回收仍然會考慮『永久代』,但回收效率不高,StringTable 最初也使用的是『永久代』內存,容易造成 OOM 問題。
    3. 『元空間』,使用了操作系統內存,默認沒有上限。并且 StringTable 的空間被移至堆內存,『元空間』中僅存儲類加載器、類對象等信息,垃圾回收不用考慮『元空間』,元空間自己管理內存釋放。

2.直接內存

  1. 定義:在 NIO 進行 IO 操作時,用到的數據緩沖內存 DirectBuffer
  2. 特點:典型實現由 DirectByteBuffer,它使用了堆外內存,可以用 allocateDirect 方法創建
  3. 好處:
    • 沒有使用堆內存,減少 GC 壓力
    • I/O 讀寫操作直接操作堆外內存,省去了系統空間和用戶空間的數據拷貝
    • 堆外內存回收通過虛引用實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24200.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24200.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營day43

題目:1049. 最后一塊石頭的重量 II 、494. 目標和、474.一和零 參考鏈接:代碼隨想錄 1049. 最后一塊石頭的重量 II 思路:本題石頭是相互粉碎,粉碎后剩下的重量就是兩塊石頭之差,我們可以想到,把石頭分成…

使用智譜 GLM-4-9B 和 SiliconCloud 云服務快速構建一個編碼類智能體應用

本篇文章我將介紹使用智譜 AI 最新開源的 GLM-4-9B 模型和 GenAI 云服務 SiliconCloud 快速構建一個 RAG 應用,首先我會詳細介紹下 GLM-4-9B 模型的能力情況和開源限制,以及 SiliconCloud 的使用介紹,最后構建一個編碼類智能體應用作為測試。…

數據結構和算法之數組和鏈表

一、數組 數組是一種線性數據結構,它是由一組連續的內存單元組成的,用于存儲相同類型的數據。在JavaScript中,數組可以包含任意類型的數據,不只限于基本數據類型。 1.存儲方式 在內存中,數組的元素是連續存儲的&…

【Vue】組件的存放目錄問題

注意: .vue文件 本質無區別 組件分類 .vue文件分為2類,都是 .vue文件(本質無區別) 頁面組件 (配置路由規則時使用的組件)復用組件(多個組件中都使用到的組件) 存放目錄 分類開來的…

Llama模型家族之拒絕抽樣(Rejection Sampling)(二)均勻分布簡介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

ssti模板注入

一、Flask應用 1、介紹 定義 Flask:是一個使用Python編寫的輕量級web應用框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。 特點 良好的文檔、豐富的插件、包含開發服務器和調試器、集成支持單元測試、RESTful請求調度、支持安全cookies、基于Unicode。 …

手機短信刪除怎么恢復?快速找回的3個秘密武器

手機,這個我們每天離不開的小玩意兒,有時候也會讓我們頭疼不已。比如,你一不小心,或者為了清理點空間,就把那些重要的短信給刪了。這些短信可能是你和好友的深夜聊天,或者是重要的工作信息。一旦刪除&#…

人工智能就業方向有哪些?

人工智能就業方向有哪些? 隨著人工智能技術的不斷發展,其應用領域也越來越廣泛。對于想要進入人工智能領域的年輕人來說,選擇一個合適的職業方向是至關重要的。今天給大家介紹六個熱門的人工智能就業方向,分別是機器學習工程師、自然語言處理…

Webshell檢測初識

最近在研究webshell檢測的小東西,所以開啟一個專門記錄webshell檢測工具開發的專欄,若有遺漏之處,請大佬們指出。 本篇大致了解以下內容 什么是webshll?有哪些類型?各自有什么不同?Webshell有哪些常見的檢測…

鼠標側鍵映射虛擬桌面切換 —— Win11

鼠標側鍵映射虛擬桌面切換 —— Win11 基于 AutoHotkey 實現功能 下載軟件 AutoHotkey建議安裝在默認路徑下(C盤) 此軟件非常小,幾乎不占用資源軟件安裝在默認路徑以外的位置可能導致部分功能不可用 新建一個 .ahk 文件使用記事本打開該 .a…

哪款開放式耳機佩戴最舒服?2024五款備受推崇產品分享!

?在現今耳機市場,開放式耳機憑借其舒適的佩戴體驗和獨特的不入耳設計,備受消費者追捧。它們不僅讓你在享受音樂時,仍能察覺周圍的聲音,確保與人交流無障礙,而且有利于耳朵的衛生與健康。對于運動愛好者和耳機發燒友而…

GIGE 協議摘錄 —— 引導寄存器(四)

系列文章目錄 GIGE 學習筆記 GIGE 協議摘錄 —— 設備發現(一) GIGE 協議摘錄 —— GVCP 協議(二) GIGE 協議摘錄 —— GVSP 協議(三) GIGE 協議摘錄 —— 引導寄存器(四) GIGE 協議…

Flutter Dismissible 屬性介紹及使用指南

在移動應用開發中,滑動刪除是一種常見的交互方式。Flutter 提供了一個強大的小部件 Dismissible,使得實現這一功能變得非常簡單。本文將介紹 Dismissible 的主要屬性及其使用方法。 1. Dismissible 簡介 Dismissible 是一個 Flutter 小部件&#xff0c…

前后端實現文件上傳進度條-實時進度

后端接口代碼&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 獲取文件名String fileName file.getOriginalFilename();// 創建上傳目標路徑Path targetPa…

基于簡單Agent對醫療數據進行分析

數據表 供應商資格審核規定.pdf 醫生名錄.xlsx 歷史就診記錄.xlsx 患者信息名錄.xlsx 藥品.xlsx 藥品庫存管理.xlsx 采購單位基本信息.xlsx Agent測試 模型基于ChatGPT-3.5 問題&#xff1a;幫我找出不達標的供應商 Agent分析過程 [Thought: 0] Key Concepts: - 不達標的供…

P7 品牌管理

逆向生成頁面 新增菜單—商品系統的品牌管理 —product/brand 在代碼生成器得到的文件中&#xff0c; main-resources-src-views-modules-product brand.vue、brand-add-or-update.vue放到category.vue同級vue文件有新增、刪除按鈕&#xff0c;但頁面未顯示&#xff0c;是因…

嵌入式Linux系統中RTC應用的操作詳解

第一:RTC的作用以及時間簡介 “RTC”的英文全稱是Reul-Time Clock,翻譯過來是實時時鐘芯片.實時時鐘芯片是日常生活中應用最為廣泛的電子器件之一,它為人們或者電子系統提供精確的實時時間,實時時鐘芯片通過引腳對外提供時間讀寫接口,通常內部帶有電池,保證在外部系統關…

【Android】使用EventBus進行線程間通訊

EventBus 簡介 EventBus&#xff1a;github EventBus是Android和Java的發布/訂閱事件總線。 簡化組件之間的通信 解耦事件發送者和接收者 在 Activities, Fragments, background threads中表現良好 避免復雜且容易出錯的依賴關系和生命周期問題 Publisher使用post發出…

好書推薦-人工智能數學基礎

本書以零基礎講解為宗旨&#xff0c;面向學習數據科學與人工智能的讀者&#xff0c;通俗地講解每一個知識點&#xff0c;旨在幫助讀者快速打下數學基礎。    全書分為 4 篇&#xff0c;共 17 章。其中第 1 篇為數學知識基礎篇&#xff0c;主要講述了高等數學基礎、微積分、泰…

鴻蒙Ability Kit(程序框架服務)【應用啟動框架AppStartup】

應用啟動框架AppStartup 概述 AppStartup提供了一種更加簡單高效的初始化組件的方式&#xff0c;支持異步初始化組件加速應用的啟動時間。使用啟動框架應用開發者只需要分別為待初始化的組件實現AppStartup提供的[StartupTask]接口&#xff0c;并在[startup_config]中配置App…