日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)

發(fā)布時(shí)間:2025/3/8 linux 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(zhuǎn)載自美團(tuán)技術(shù)團(tuán)隊(duì)發(fā)表的同名文章

https://tech.meituan.com/linux-jvm-memory.html

一, linux與進(jìn)程內(nèi)存模型

要理解jvm最重要的一點(diǎn)是要知道jvm只是linux的一個(gè)進(jìn)程,把jvm的視野放大,就能很好的理解JVM細(xì)分的一些概念

下圖給出了硬件系統(tǒng)進(jìn)程三個(gè)層面內(nèi)存之間的關(guān)系.

從硬件上看,Linux系統(tǒng)的內(nèi)存空間由兩個(gè)部分構(gòu)成:物理內(nèi)存和SWAP(位于磁盤(pán))。物理內(nèi)存是Linux活動(dòng)時(shí)使用的主要內(nèi)存區(qū)域;當(dāng)物理內(nèi)存不夠使用時(shí),Linux會(huì)把一部分暫時(shí)不用的內(nèi)存數(shù)據(jù)放到磁盤(pán)上的SWAP中去,以便騰出更多的可用內(nèi)存空間;而當(dāng)需要使用位于SWAP的數(shù)據(jù)時(shí),必須先將其換回到內(nèi)存中。

從Linux系統(tǒng)上看,除了引導(dǎo)系統(tǒng)的BIN區(qū),整個(gè)內(nèi)存空間主要被分成兩個(gè)部分:內(nèi)核內(nèi)存(Kernel space)、用戶內(nèi)存(User space)。

內(nèi)核內(nèi)存是linux自身使用的內(nèi)存空間,主要提供程序調(diào)度,內(nèi)存分配,鏈接硬件資源等程序邏輯使用.用戶內(nèi)存是提供給各個(gè)進(jìn)程主要空間,linux給每個(gè)進(jìn)程提供4G相同的虛擬內(nèi)存空間;這種虛擬內(nèi)存空間,是一種尋址的空間,進(jìn)程之間都有相互獨(dú)立的4G空間地址,實(shí)際用到多少,最終會(huì)通過(guò)頁(yè)表寫(xiě)入真正的磁盤(pán).因此進(jìn)程之間也是相互獨(dú)立的,互不干擾

虛擬內(nèi)存空間分配如下,

從進(jìn)程角度看進(jìn)程能直接訪問(wèn)的用戶內(nèi)存被劃分為五個(gè)部分(與jvm的內(nèi)存劃分類(lèi)似,因?yàn)樗彩莑inux的一個(gè)進(jìn)程):代碼區(qū),數(shù)據(jù)區(qū),堆區(qū),棧區(qū),未使用區(qū),

代碼區(qū)中存放應(yīng)用程序的機(jī)器代碼,運(yùn)行過(guò)程中代碼不能被修改,具有只讀和固定大小的特點(diǎn)

數(shù)據(jù)區(qū)中存放應(yīng)用程序的機(jī)器代碼靜態(tài)數(shù)據(jù)和一些常量字符串等,其大小也是固定的,

堆是運(yùn)行時(shí)程序動(dòng)態(tài)申請(qǐng)的空間,屬于程序運(yùn)行時(shí)直接申請(qǐng)釋放的內(nèi)存資源(jvm的GC也主要回收該部分空間)

棧區(qū)用來(lái)存放函數(shù)的傳入?yún)?shù),臨時(shí)變量(jvm中的方法使用的棧幀),以及返回地址等數(shù)據(jù),

二,進(jìn)程與jvm內(nèi)存模型

jvm本質(zhì)是一個(gè)進(jìn)程,因此其內(nèi)部也有進(jìn)程的一般特點(diǎn),但是jvm不是一個(gè)普通的進(jìn)程,其內(nèi)存模型有一些新特點(diǎn):1,jvm將許多本來(lái)屬于操作系統(tǒng)管理范疇的東西,移植到了jvm內(nèi)部,目的在于減少系統(tǒng)調(diào)用的次數(shù);2,JavaNIO,目的在于減少用于讀寫(xiě)IO的系統(tǒng)調(diào)用的銷(xiāo),jvm進(jìn)程與普通進(jìn)程內(nèi)存模型比較圖:

需要說(shuō)明的是,這個(gè)模型的并不是JVM內(nèi)存使用的精確模型,更側(cè)重于從操作系統(tǒng)的角度而省略了一些JVM的內(nèi)部細(xì)節(jié)(盡管也很重要)。下面從用戶內(nèi)存和內(nèi)核內(nèi)存兩個(gè)方面講解JVM進(jìn)程的內(nèi)存特點(diǎn)。

1,用戶內(nèi)存

上圖特別強(qiáng)調(diào)了JVM進(jìn)程模型的代碼區(qū)和數(shù)據(jù)區(qū)指的是JVM自身的,而非Java程序的。普通進(jìn)程棧區(qū),在JVM一般僅僅用做線程棧。JVM的堆區(qū)和普通進(jìn)程的差別是最大的,下面具體詳細(xì)說(shuō)明

首先是永久代,永久代本質(zhì)上是Java程序的代碼區(qū)和數(shù)據(jù)區(qū),Java程序中類(lèi)(class),會(huì)被加載整個(gè)區(qū)域的不同數(shù)據(jù)結(jié)構(gòu)中去,包括常量池,域,方法數(shù)據(jù),方法體,構(gòu)造函數(shù),以及類(lèi)中的專(zhuān)用方法,實(shí)例初始化,接口初始化.永久代對(duì)于操作系統(tǒng)來(lái)說(shuō)是堆的一部分;而對(duì)于Java程序來(lái)說(shuō),這是容納程序本身及靜態(tài)資源的空間

其次是新生代和老年代,新生代和老年代才是Java程序真正使用的堆空間,主要用于內(nèi)存對(duì)象的存儲(chǔ);但是其管理方式和普通進(jìn)程有本質(zhì)的區(qū)別。

普通進(jìn)程在運(yùn)行時(shí)給內(nèi)存對(duì)象分配空間時(shí),比如C++執(zhí)行new操作時(shí),會(huì)觸發(fā)一次分配內(nèi)存空間的調(diào)用,由操作系統(tǒng)的線程根據(jù)對(duì)象的大小分配好空間后返回;同時(shí)程序釋放對(duì)象時(shí),比如c++執(zhí)行delete操作時(shí)也會(huì)觸發(fā)一次系統(tǒng)調(diào)用,通知操作系統(tǒng)對(duì)象所占用的空間可以回收了

jvm對(duì)于內(nèi)存的使用和一般進(jìn)程不同,jvm像操作系統(tǒng)申請(qǐng)一整段內(nèi)存區(qū)域(具體大小可以在jvm參數(shù)調(diào)節(jié))作為Java內(nèi)存的堆(分為新生代和老年代);當(dāng)Java程序申請(qǐng)內(nèi)存空間,比如new操作時(shí),jvm將在這段空間中按所需大小分配給Java程序,并且Java不負(fù)責(zé)通知回收該內(nèi)存空間.

JVM的內(nèi)存管理方式的優(yōu)點(diǎn)是顯而易見(jiàn)的,包括:第一,減少系統(tǒng)調(diào)用的次數(shù),JVM在給Java程序分配內(nèi)存空間時(shí)不需要操作系統(tǒng)干預(yù),僅僅在Java堆大小變化時(shí)需要向操作系統(tǒng)申請(qǐng)內(nèi)存或通知回收,而普通程序每次內(nèi)存空間的分配回收都需要系統(tǒng)調(diào)用參與;第二,減少內(nèi)存泄漏,普通程序沒(méi)有(或者沒(méi)有及時(shí))通知操作系統(tǒng)內(nèi)存空間的釋放是內(nèi)存泄漏的重要原因之一,而由JVM統(tǒng)一管理,可以避免程序員帶來(lái)的內(nèi)存泄漏問(wèn)題。

最后是未使用區(qū),未使用區(qū)是分配新內(nèi)存空間的預(yù)備區(qū)域。對(duì)于普通進(jìn)程來(lái)說(shuō),這個(gè)區(qū)域被可用于堆和棧空間的申請(qǐng)及釋放,每次堆內(nèi)存分配都會(huì)使用這個(gè)區(qū)域,因此大小變動(dòng)頻繁;對(duì)于JVM進(jìn)程來(lái)說(shuō),調(diào)整堆大小及線程棧時(shí)會(huì)使用該區(qū)域,而堆大小一般較少調(diào)整,因此大小相對(duì)穩(wěn)定。操作系統(tǒng)會(huì)動(dòng)態(tài)調(diào)整這個(gè)區(qū)域的大小,并且這個(gè)區(qū)域通常并沒(méi)有被分配實(shí)際的物理內(nèi)存,只是允許進(jìn)程在這個(gè)區(qū)域申請(qǐng)堆或棧空間。

2.內(nèi)核內(nèi)存

應(yīng)用程序通常不直接和內(nèi)核內(nèi)存打交道,內(nèi)核內(nèi)存由操作系統(tǒng)進(jìn)行管理和使用;不過(guò)隨著linux對(duì)性能的關(guān)注及改進(jìn),一些新的特性使得應(yīng)用程序可以使內(nèi)核內(nèi)存或者映射到內(nèi)核空間.javaNIO正是在這種背景下誕生的,其充分利用了linux系統(tǒng)的新特性,提升了Java程序的IO性能

上圖給出了NIO使用的內(nèi)核內(nèi)存在linux系統(tǒng)中的分布情況,NIObuffer主要包括:NIO使用各種channel時(shí)所使用的ByteBuffer,Java程序主動(dòng)使用ByteBuffer,allocationDirector申請(qǐng)分配的Buffer.而在PageCache里面,NIO使用的內(nèi)存主要包括FileChannel.map方式打開(kāi)文件占用mapped,FileChanneltransferTo和FileChannel.transferFRrom

Linux和JavaNIO在內(nèi)核內(nèi)存上開(kāi)辟空間給程序使用,主要是減少不必要的復(fù)制,減少I(mǎi)O操作系統(tǒng)調(diào)用的開(kāi)銷(xiāo).例如將磁盤(pán)文件數(shù)據(jù)發(fā)送到網(wǎng)卡,使用普通方法和NIO時(shí),數(shù)據(jù)流動(dòng)比較

將數(shù)據(jù)在內(nèi)核內(nèi)存和用戶內(nèi)存之間拷貝是比較消耗資源和時(shí)間的事情,而從上圖我們可以看到,通過(guò)NIO的方式減少了2次內(nèi)核內(nèi)存和用戶內(nèi)存之間的數(shù)據(jù)拷貝。這是Java NIO高性能的重要機(jī)制之一(另一個(gè)是異步非阻塞)。

從上面可以看出,內(nèi)核內(nèi)存對(duì)于Java程序性能也非常重要,因此,在劃分系統(tǒng)內(nèi)存使用時(shí)候,一定要給內(nèi)核留出一定可用空間。

https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554698&idx=1&sn=7f08e278c1f6a7c0db0ba5418c442fa4&chksm=f3f833dcc48fbacaede8af14925b983f871e834e58ba079c3cb41557bd5fa5596817fcab1543#rd

總結(jié)

以上是生活随笔為你收集整理的linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。