亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
一、java記憶體組成介紹:堆(Heap)非堆(Non- heap)內(nèi)存
二、JVM記憶體區(qū)域模型
三、直接記憶體
四、Java堆記憶體的10重點(diǎn)
首頁 Java Java基礎(chǔ) JVM的內(nèi)部結(jié)構(gòu)及運(yùn)作機(jī)制

JVM的內(nèi)部結(jié)構(gòu)及運(yùn)作機(jī)制

Jun 16, 2020 pm 04:23 PM
java jvm

JVM的內(nèi)部結(jié)構(gòu)及運(yùn)作機(jī)制

一、java記憶體組成介紹:堆(Heap)非堆(Non- heap)內(nèi)存

依照官方的說法:「Java 虛擬機(jī)器有一個(gè)堆,堆是運(yùn)行時(shí)資料區(qū)域,所有類別實(shí)例和陣列的記憶體均從此處分配。

堆是在Java 虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建的。」「在JVM中堆之外的記憶體稱為非堆記憶體(Non-heap memory)」。可以看出JVM主要管理兩種類型的記憶體:堆和非堆。

簡單來說堆就是Java程式碼可及的內(nèi)存,是留給開發(fā)人員使用的;非堆就是JVM留給自己用的,所以方法區(qū)、JVM內(nèi)部處理或優(yōu)化所需的內(nèi)存(如JIT編譯後的程式碼快取)、每個(gè)類別結(jié)構(gòu)(如運(yùn)行時(shí)常數(shù)池、欄位和方法資料)以及方法和建構(gòu)方法的程式碼都在非堆記憶體中。

二、JVM記憶體區(qū)域模型

JVM的內(nèi)部結(jié)構(gòu)及運(yùn)作機(jī)制

1.方法區(qū) 也稱為”永久代” 、“非堆”, 它用於儲(chǔ)存虛擬機(jī)器載入的類別資訊、常數(shù)、靜態(tài)變數(shù)、是各個(gè)執(zhí)行緒共享的記憶體區(qū)域。預(yù)設(shè)最小值為16MB,最大值為64MB,可透過-XX:PermSize-XX:MaxPermSize 參數(shù)限制方法區(qū)的大小。

運(yùn)行時(shí)常數(shù)池:是方法區(qū)的一部分,其中的主要內(nèi)容來自於JVM對(duì)Class的載入。

Class檔案中除了有類別的版本、欄位、方法、介面等描述資訊外,還有一項(xiàng)資訊是常數(shù)池,用於存放編譯器產(chǎn)生的各種符號(hào)引用,這部分內(nèi)容將在類別載入後放到方法區(qū)的運(yùn)行時(shí)常數(shù)池中。

2.虛擬機(jī)棧

描述的是java 方法執(zhí)行的記憶體模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)創(chuàng)建一個(gè)「棧幀」用於存儲(chǔ)局部變數(shù)表(包括參數(shù))、操作棧、方法出口等資訊。每個(gè)方法被呼叫到執(zhí)行完的過程,就對(duì)應(yīng)一個(gè)堆疊幀在虛擬機(jī)器棧中從入棧到出棧的過程。宣告週期與線程相同,是線程私有的。

局部變數(shù)表存放了編譯器可知的各種基本資料型別(boolean、byte、charshort、int、float、long、double)、物件引用(引用指針,並非物件本身),其中64位長度的long和double類型的資料會(huì)佔(zhàn)用2個(gè)局部變數(shù)的空間,其餘資料型別只佔(zhàn)1個(gè)。

局部變數(shù)表所需的記憶體空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在堆疊幀中分配多大的局部變數(shù)是完全確定的,在運(yùn)行期間棧幀不會(huì)改變局部變數(shù)表的大小空間。

3.本地方法堆疊

與虛擬機(jī)器堆疊基本上類似,差別在於虛擬機(jī)器堆疊為虛擬機(jī)器執(zhí)行的java方法服務(wù),而本地方法堆疊則是為Native方法服務(wù)。

4.堆

也叫做java 堆、GC堆是java虛擬機(jī)所管理的記憶體中最大的一塊記憶體區(qū)域,也是被各個(gè)執(zhí)行緒共享的內(nèi)存區(qū)域,在JVM啟動(dòng)時(shí)建立。此記憶體區(qū)域存放了物件實(shí)例及陣列(所有new的物件)。

其大小透過-Xms(最小值)和-Xmx(最大值)參數(shù)設(shè)置,-Xms為JVM啟動(dòng)時(shí)申請的最小內(nèi)存,預(yù)設(shè)為作業(yè)系統(tǒng)物理記憶體的1/64但小於1G,-Xmx為JVM可申請的最大內(nèi)存,預(yù)設(shè)為物理記憶體的1/4但小於1G,預(yù)設(shè)當(dāng)空餘堆記憶體小於40%時(shí), JVM會(huì)增加Heap到-Xmx指定的大小,可透過-XX:MinHeapFreeRation=來指定這個(gè)比列;當(dāng)空堆記憶體大於70%時(shí),JVM會(huì)減少heap的大小到-Xms指定的大小,可透過XX:MaxHeapFreeRation=來指定這個(gè)比列,對(duì)於運(yùn)行系統(tǒng),為避免在運(yùn)行時(shí)頻繁調(diào)整Heap的大小,通常-Xms與-Xmx的值設(shè)成一樣。

由於現(xiàn)在收集器都是採用分代收集演算法,因此堆被分割為新生代和老年代。新生代主要儲(chǔ)存新創(chuàng)建的物件和尚未進(jìn)入老年代的物件。老年代存放經(jīng)過多次新生代GC(Minor GC)任然存活的對(duì)象。

新生代: 程式新建立的物件都是從新生代分配內(nèi)存,新生代由Eden Space和兩塊相同大小的Survivor Space (通常又稱S0和S1或From和To)構(gòu)成,可透過-Xmn參數(shù)來指定新生代的大小,也可以透過-XX:SurvivorRation來調(diào)整Eden SpaceSurvivor Space的大小。

老年代: 用於存放經(jīng)過多次新生代GC任然存活的對(duì)象,例如緩存對(duì)象,新建的對(duì)像也有可能直接進(jìn)入老年代,主要有兩種情況:

1、大對(duì)象,可透過啟動(dòng)參數(shù)設(shè)定-XX:PretenureSizeThreshold=1024(單位為位元組,預(yù)設(shè)為0)來代表超過多大時(shí)就不在新生代分配,而是直接在老年代分配。

2、大的數(shù)組對(duì)象,切數(shù)組中無引用外部對(duì)象。老年代所佔(zhàn)的記憶體大小為-Xmx對(duì)應(yīng)的值減去-Xmn對(duì)應(yīng)的值。

JVM的內(nèi)部結(jié)構(gòu)及運(yùn)作機(jī)制

?

Young?Generation????????即圖中的Eden?+?From?Space?+?To?Space
Eden????????????????????存放新生的對(duì)象
Survivor?Space??????????有兩個(gè),存放每次垃圾回收后存活的對(duì)象
Old?Generation??????????Tenured?Generation?即圖中的Old?Space?
????????????????????????主要存放應(yīng)用程序中生命周期長的存活對(duì)象

#5.程式計(jì)數(shù)器

是最小的一塊記憶體區(qū)域,它的作用是當(dāng)前執(zhí)行緒所執(zhí)行的字節(jié)碼的行號(hào)指示器,在虛擬機(jī)器的模型裡,字節(jié)碼解釋器工作時(shí)就是透過改變這個(gè)計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、異常處理、執(zhí)行緒恢復(fù)等基礎(chǔ)功能都需要依賴計(jì)數(shù)器來完成。

三、直接記憶體

直接記憶體並不是虛擬機(jī)器記憶體的一部分,也不是Java虛擬機(jī)器規(guī)格中定義的記憶體區(qū)。 jdk1.4中新加入的NIO,引入了通道與緩衝區(qū)的IO方式,它可以呼叫Native方法直接分配堆外內(nèi)存,這個(gè)堆外內(nèi)存就是本機(jī)內(nèi)存,不會(huì)影響到堆內(nèi)存的大小。

四、Java堆記憶體的10重點(diǎn)

  1. Java堆記憶體是作業(yè)系統(tǒng)分配給JVM的記憶體的一部分。

  2. 當(dāng)我們建立物件時(shí),它們儲(chǔ)存在Java堆記憶體中.

  3. 為了方便垃圾回收,Java堆空間分成三個(gè)區(qū)域,分別叫作New Generation, Old Generation或叫作Tenured Generation,還有Perm Space。

  4. 你可以用JVM的命令列選項(xiàng) -Xms, -Xmx, -Xmn來調(diào)整Java堆空間的大小。不要忘了在大小後面加上”M”或”G”來表示單位。舉個(gè)例子,你可以用 -Xmx256m來設(shè)定堆記憶體最大的大小為256MB。

  5. 你可以用JConsole或 Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory()來查看Java中堆記憶體的大小。

  6. 你可以使用指令「jmap」來取得heap dump,用「jhat」來分析heap dump。

  7. Java堆疊空間不同於堆疊空間,堆疊空間是用來儲(chǔ)存呼叫堆疊和局部變數(shù)的。

  8. Java垃圾回收器是用來將死掉的物件(不再使用的物件)所佔(zhàn)用的記憶體回收回來,再釋放到Java堆空間中。

  9. 當(dāng)你遇到j(luò)ava.lang.outOfMemoryError時(shí),不要緊張,有時(shí)候僅僅增加堆空間就可以了,但如果經(jīng)常出現(xiàn)的話,就要看看Java程式中是不是存在記憶體洩漏了。

  10. 請使用Profiler和Heap dump分析工具來查看Java堆空間,可以查看給每個(gè)物件分配了多少記憶體。

更多相關(guān)知識(shí)請關(guān)注java基礎(chǔ)教學(xué)專欄

#

以上是JVM的內(nèi)部結(jié)構(gòu)及運(yùn)作機(jī)制的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

Python Itertools組合示例 Python Itertools組合示例 Jul 31, 2025 am 09:53 AM

itertools.combinations用於生成從可迭代對(duì)像中選取指定數(shù)量元素的所有不重複組合(順序無關(guān)),其用法包括:1.從列表中選2個(gè)元素組合,如('A','B')、('A','C')等,避免重複順序;2.對(duì)字符串取3個(gè)字符組合,如"abc"、"abd",適用於子序列生成;3.求兩數(shù)之和等於目標(biāo)值的組合,如1 5=6,簡化雙重循環(huán)邏輯;組合與排列的區(qū)別在於順序是否重要,combinations視AB與BA為相同,而permutations視為不同;

Python Pytest夾具示例 Python Pytest夾具示例 Jul 31, 2025 am 09:35 AM

fixture是用於為測試提供預(yù)設(shè)環(huán)境或數(shù)據(jù)的函數(shù),1.使用@pytest.fixture裝飾器定義fixture;2.在測試函數(shù)中以參數(shù)形式註入fixture;3.yield之前執(zhí)行setup,之後執(zhí)行teardown;4.通過scope參數(shù)控製作用域,如function、module等;5.將共用fixture放在conftest.py中實(shí)現(xiàn)跨文件共享,從而提升測試的可維護(hù)性和復(fù)用性。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

See all articles