jvm_虚拟机参数讲解(一)
生活随笔
收集整理的這篇文章主要介紹了
jvm_虚拟机参数讲解(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
其實在JAVA中,虛擬機參數主要起到的作用,在虛擬機運行的時候,在程序運行的時候,這個虛擬機的調配,參數會對應用系統的運行的良好,性能等等都會產生直接的關系,比如說我們有兩個方面堆參數的分配大多數的參數都是為堆去服務的,為內存memorgy去服務的,這是很關鍵的一個點,首先我們看看有這個幾個參數在JAVA虛擬機里面都叫-XX來打印一下配置信息,-XX打頭的基本上來講都是配置虛擬機的一些應用程序上的,或者打印一些log日志級別的東西我們來看一看有一個pringGC,如果你使用了這個參數了-XX:PrintGC 如果你使用了這個參數了,在你虛擬機啟動之后,只要遇到GC就會打印日志,-XX:+UseSerialGC 這個-XX就表示對于系統級別的,JVM層次的一些配置,比如說配置一些日志信息,剛剛都看到了,只要經歷一次GC,它經歷垃圾回收之后就會打印日志,你配置什么樣的垃圾回收器,JVM使用什么樣的垃圾回收器都是可以去配置的,就是建立在系統級別的,非-XX 基本上都是對 應用層面上的配置,都是對運行在虛擬機之上的,應用系統,APP應用程序,給他設置一些內存的大小,方法區棧的大小,是這種級別的配置,這是兩塊不同的點.你在學之前都要了解,這里的配置有一個加號+,加號表示啟用的意思,減號-表示禁用,對于參數的一些配置無非-XX:+PrintGC 是配置在虛擬機級別的,只要經歷過GC的話,我虛擬機遇到GC就會打印日志.-XX:+UseSerialGC 配置垃圾回收器,SerialGC這是一種非常古老的串行收集器,以后我們會學習一些其它的垃圾回收機制,比如G1,比如CMS,還有并行的垃圾回收器,這些會隨著垃圾回收機制的不同,它會大大的影響你的JVM,你的性能,這個影響是很大的-XX:+PrintGCDetail 打印詳細信息,包括各個區的情況,各個區指的是什么區啊,新生代老年代,然后永久區,然后再詳細一點,新生代分eden區,s0區,s1區,老年代,永久區,就是detail會打印很詳細的信息非-XX,只是針對你的應用層的-Xms 指的是初始化,應用層初始化的大小,其實你熟悉了就知道了,500M內存,-XmX 表示這個應用程序能夠獲得的最大堆內存大小,最大上限Max-XX:PrintCommandLineFlags 可以將隱式或者顯示的傳給虛擬機的參數輸出比如 java -jar -XX..... 配置了一堆東西,你加上-XX:PringCommandLineFlags這么一句話,它就會把運行你配置的一些配置項,都能打印出來,就是你配置的一些內容能夠打印,輸出一下,這幾點你了解明白了之后我直接依賴eclipse做一些命令Run As ----> Run Configration---->去配置一些參數
arguments,第一個參數是傳到main方法里面了,我們一般很少去配置第一塊 Program arguments
下面的這塊指的是VM arguments,你跑這個程序JAVA虛擬機會給你怎么去調配-XX:+PrintGC -Xms5m -Xmx20m -XX:+UseSerialGC -XX:+PrintGCDetails串行的垃圾回收器,然后打印一些詳細的信息配置的時候一定要選中Test01
你寫一行配置是最好的了
程序剛進入主函數的時候,我們先看看,首先max memory,free memory,total memory就是最大的,空閑的,總共的內存我們看執行的結果
上面有一行-XX:InitialHeapSize 15M, -XX:MaxHeapSize 20M, -XX:PrintCommandLineFlags 你看到這些和我們剛剛在arguments里面配置是一樣嗎,因為你加了-XX:PrintCommandLineFlags這個參數了,如果你把這個參數去掉的話,控制臺第一行就沒有了,max memory 是20M, 就是最大的20M,然后呢是 free memory,這是空閑的,但是并不是那么準確,主函數啟動肯定也會占用一定的內存,操作系統級別的原因,影響你的free memory肯定不會那么準確,total memory當前我們的系統,正在使用的內存,正常我們初始化的時候我們分配了5M內存,但是由于各個系統不確定的原因,可能我在跑主函數的時候,消耗了一定的內存,我在JVM運行的時候,由于硬件的原因,不是那么特別好,也是那么適當的去吃了一點點內存,這就不是那么準確的,所以我們發現我們的free memory,真正空閑的memory, 有分配的給你5M,空閑的才4M多,也就是少了那么0.幾兆,這個是和你自己本身的機器,你可能機器的越好,吃內存的情況就越少,這個沒法確定,但是有一點我們可以確定,你的total memory,5M沒問題,因為系統初始化的時候我們就分配了5M,第一次打印你就可以理解為系統初始化了,就是total memory,以后可能有其他情況,以后 total memory 可能會有變化的,所以這是一個經驗的積累,為什么不準確的呢,你有沒有發現linux操作系統也是一樣,比如我分配了兩個G的內存過去,然后我們 free -m,或者我們free看一下,就是少了那么0.1,大家不知道你仔細看了沒有,如果你玩linux敲這個命令,你用了VMare分配了1G的內存,一定是1024這個數嗎,我估計它是900多,或者800多,
這是1024bit*1的話是1k,1k*1024是1M,也就是我這個代碼先分配了1M內存,相當于我運行這段程序的時候,使用了1M的內存,只要分配一兆內存以后就會分配一次GC
658K回收到了127K,回收了將近0.5M,經歷過一次GC之后,前面這個數字回收之前的,后面這個數字GC之后的,然后呢再往下看
max memory是恒定的,20M不用管,原先我們的有4M空閑的內存,然后分配了1M,是不是剩3M多,JVM你看了結果之后一般都是大約,相似度是百分之90左右,不可能是非常非常的精確,內存這個數是操作系統管的,那么我們會發現一個很明顯的下降,就是這個值差了1M,就是這段你分配是起了作用了,然后你的total memory還是不變的,你還是你初始化的5M, 初始化內存和最大內存到底什么時候才會有變化呢,比如我們下面這塊,一下子使用了4M,剩余的空閑的是3M多,肯定不夠了,那整個應用程序還會像我們JVM配置的max參數去申請內存,如果達到上限就可能報內存溢出了,如果沒到上限就會源源不斷的JVM去申請你小于的等于MAX這個上限的,我們使用4M內存的時候,這個時候又使用了一次GC,之前的已經回收了,經過很多次GC,老年代Tenured,前面的表示新生代的一個情況,然后Tenured表示老年代的一個回收情況,Perm永久區回收的一個情況,然后就是用戶的,系統的,真實的時常,走完這段代碼,真正的時間我分配了4M之后
所以就看max的上限,那就會去向我的JVM發出申請,上限給我定的是20M,剛才這個來了4M,現在空閑只剩下3M多不夠了,你再給我點內存吧,那4M內存都會從MAX中申請,所以原先total memory 有5M加了4M變成了9M,然后 free 基本不變上面都是一些粗略的信息,然后打印兩次GC,由于你配置了-XX:PrintGCDetail,我直接配置的是detail,所以他就會把明細給我打出來,就是你堆變化的明細
eden區,from區,to區,或者叫s0區,s1區,老年代,永久區,它是怎樣看使用情況的呢,我們的新生代used 5%,老年代tenured使用了73%,因為很多數據并沒有GC回收掉,永久區也會占用一些,我們主要是去看后面的一個東西,新生代一共使用了77K,老年代使用了5587K,永久區使用了2581K
?
總結
以上是生活随笔為你收集整理的jvm_虚拟机参数讲解(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm_堆栈永久区详细讲解
- 下一篇: jvm_虚拟机参数讲解(二)