最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM性能調優(yōu)實現原理及配置

 更新時間:2020年12月08日 14:55:34   作者:北方有魚  
這篇文章主要介紹了JVM性能調優(yōu)實現原理及配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1、JVM內存模型

總結:可以發(fā)現最明顯的一個變化是元空間從虛擬機轉移到了本地內存。默認情況下,元數據空間大小僅受限于本地內存, 這意味著以后不會因為永久代大小不夠而拋出OOM異常了。 jdk1.8以前,HotSpot VM將class和類的jar包數據存儲在PermGen里, PermGen大小是固定的,而且項目之間無法公用公有的class,所以很容易碰到OOM異常。改成MateSpace后, 各個項目會共享同樣的class空間。比如多個項目都引用了apache-common包, 在MateSpace中只會存儲一份的apache-common的class,提高了內存的利用率,垃圾回收更有效。

2、JVM堆內存常用參數

參數 描述
-Xms 堆內存初始大小,單位m、g
-Xmx(MaxHeapSize) 堆內存最大允許大小,一般不要大于物理內存的80%
-XX:PermSize 非堆內存初始大小,一般應用設置初始化200m,最大1024m就夠了
-XX:MaxPermSize 非堆內存最大允許大小
-XX:NewSize(-Xns) 年輕代內存初始大小
-XX:MaxNewSize(-Xmn) 年輕代內存最大允許大小,也可以縮寫
-XX:SurvivorRatio=8 年輕代中Eden區(qū)與Survivor區(qū)的容量比例值,默認為8,即8:1
-Xss 堆棧內存大小

3、GC(Garbage Collection)算法

這里的GC具體指的是新生代的復制算法

首先貼一張網上盜來的大圖,用它來說明一下GC的過程


內存分配策略:

大多數情況下,對象在新生代的Eden中分配。當Eden區(qū)沒有足夠的空間進行分配時,虛擬機將發(fā)起一次Minor GC,而大對象(需要大量連續(xù)內存空間的Java對象,類似長字符串和數組)將通過分配擔保機制直接進入老年代。

Minor GC——復制算法具體過程:

將Eden和S0中還存活著的對象一次性的復制到S1中,并且清理掉Eden與S0的空間。如果S1放不下還存活著的對象,那這些對象將通過分配擔保機制進入老年代。【原理上隨時保持S0和S1有一個是空的,用來存下一次的對象】

Eden區(qū)快滿的時候,會進行上一步類似操作,將Eden和S1區(qū)的年紀大的對象放到S0區(qū)【此時S1區(qū)就是空的】
直到Eden區(qū)快滿,S0或者S1也快滿的時候,這時候就把這兩個區(qū)的年紀大的對象放到Old區(qū)。

依次循環(huán),直到Old區(qū)也快滿的時候,Eden區(qū)也快滿的時候,會對整個這一塊內存區(qū)域進行一次大清洗(FullGC),騰出內存,為之后的對象創(chuàng)建,程序運行騰地方。

新生代GC(Minor GC):指發(fā)生在新生代的垃圾回收動作,因為java對象大多具備朝生夕滅的特征,所以Minor GC發(fā)生的特別頻繁,

一般回收速度也很快。

老年代GC(Major GC/Full GC):指發(fā)生在老年代的GC,出現了Major GC,至少會伴隨一次的MinorGC(但非絕對,
在Parallel Scavenge收集器的收集策略里就有直接進行Minor GC的策略選擇過程)。Major GC的速度一般比Minor GC慢10倍以上。

4、JVM參數配置

在jdk1.8以前,生產環(huán)境一般有如下配置

-XX:PermSize=512M -XX:MaxPermSize=1024M

表示在JVM里存儲Java類信息,常量池和靜態(tài)變量的永久代區(qū)域初始大小為512M,最大為1024M。在項目啟動后,這個值是固定的,如果項目class過多,很可能遇到OutOfMemoryError: PermGen異常。

升級JDK1.8之后,上面的perm配置已經變成

-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M

MetaspaceSize如果不做配置,通過jinfo查看默認MetaspaceSize大?。s21M),MaxMetaspaceSize很大很大,前面說過MetaSpace只受本地內存大小限制。

jinfo -flag MetaspaceSize 1234 #結果為:-XX:MetaspaceSize=21807104
jinfo -flag MaxMetaspaceSize 1234 #結果為:-XX:MaxMetaspaceSize=18446744073709547520

干貨:MetaspaceSize為觸發(fā)FullGC的閾值,默認約為21M,如做了配置,最小閾值為自定義配置大小??臻g使用達到閾值,觸發(fā)FullGC,同時對該值擴大。當然如果元空間實際使用小于閾值,在GC的時候也會對該值縮小。
MaxMetaspaceSize為元空間的最大值,如果設置太小,可能會導致頻繁FullGC,甚至OOM。

5. JVM參數配置指南

前面三個部分對JVM進行了整體的了解,接下來是本文的重點。

-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -Xms256m -Xmx256m

文章看下來上面這段配置的意思很簡單,設置元空間的初始值和最大值,設置堆空間的初始值和最大值。

為什么MetaspaceSize要設置為128M?為什么堆內存初始值Xms設置為256M而不是512M?

按照Java官方的指導

  • Java堆大小設置,Xms 和 Xmx設置為老年代存活對象的3-4倍,即FullGC之后的老年代內存占用的3-4倍
  • MaxPermSize(元空間)設置為老年代存活對象的1.2-1.5倍。
  • 年輕代Xmn的設置為老年代存活對象的1-1.5倍。
  • 老年代的內存大小設置為老年代存活對象的2-3倍。

5. JVM監(jiān)控jstat

可以讓系統(tǒng)運行一段時間后查看系統(tǒng)的各個指標,然后在進行配置。如下用jstat工具查看jvm的情況

jstat -gc 12345
###
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
13824.0 22528.0 13377.0 0.0 548864.0 535257.2 113152.0 46189.3 73984.0 71119.8 9728.0 9196.2 14 0.259 3 0.287 0.546

OU表示老年代所占用的內存為 46189.3 K(大約45M);那么jvm相應的配置參數應該做如下修改

-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -Xms180m -Xmx180m

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Mybatis實現插入數據后返回主鍵過程解析

    Mybatis實現插入數據后返回主鍵過程解析

    這篇文章主要介紹了Mybatis實現插入數據后返回主鍵過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Java負載均衡算法實現之輪詢和加權輪詢

    Java負載均衡算法實現之輪詢和加權輪詢

    網上找了不少負載均衡算法的資源,都不夠全面,后來自己結合了網上的一些算法實現,下面這篇文章主要給大家介紹了關于Java負載均衡算法實現之輪詢和加權輪詢的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • SpringApplicationRunListener監(jiān)聽器源碼詳解

    SpringApplicationRunListener監(jiān)聽器源碼詳解

    這篇文章主要介紹了SpringApplicationRunListener監(jiān)聽器源碼詳解,springboot提供了兩個類SpringApplicationRunListeners、SpringApplicationRunListener(EventPublishingRunListener),spring框架還提供了一個ApplicationListener接口,需要的朋友可以參考下
    2023-11-11
  • HttpClient實現調用外部項目接口工具類的示例

    HttpClient實現調用外部項目接口工具類的示例

    下面小編就為大家?guī)硪黄狧ttpClient實現調用外部項目接口工具類的示例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java使用Condition控制線程通信的方法實例詳解

    Java使用Condition控制線程通信的方法實例詳解

    這篇文章主要介紹了Java使用Condition控制線程通信的方法,結合實例形式分析了使用Condition類同步檢測控制線程通信的相關操作技巧,需要的朋友可以參考下
    2019-09-09
  • IDEA2020.1啟動SpringBoot項目出現java程序包:xxx不存在

    IDEA2020.1啟動SpringBoot項目出現java程序包:xxx不存在

    這篇文章主要介紹了IDEA2020.1啟動SpringBoot項目出現java程序包:xxx不存在,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 詳解Java的Hibernate框架中的緩存與原生SQL語句的使用

    詳解Java的Hibernate框架中的緩存與原生SQL語句的使用

    這篇文章主要介紹了Java的Hibernate框架中的緩存與原生SQL語句的使用,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • springboot自定義攔截器的方法

    springboot自定義攔截器的方法

    這篇文章主要為大家詳細介紹了springboot自定義攔截器的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java實現哈夫曼壓縮的實例

    java實現哈夫曼壓縮的實例

    這篇文章主要介紹了java實現哈夫曼壓縮的實例的相關資料,需要的朋友可以參考下
    2017-07-07
  • 基于spring mvc請求controller訪問方式

    基于spring mvc請求controller訪問方式

    這篇文章主要介紹了spring mvc請求controller訪問方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

桐柏县| 潜山县| 霸州市| 盐源县| 泾源县| 巨鹿县| 西盟| 六安市| 嘉禾县| 安仁县| 唐河县| 宜兴市| 博客| 陈巴尔虎旗| 武邑县| 科技| 桃园县| 阿克苏市| 正定县| 高州市| 磐石市| 虎林市| 紫云| 开阳县| 左贡县| 云龙县| 台山市| 德清县| 明溪县| 巫山县| 桃园市| 昭平县| 柏乡县| 郎溪县| 都江堰市| 龙江县| 石渠县| 崇礼县| 嵊州市| 南川市| 镇巴县|