java虛擬機參數優化_JAVA虛擬機JVM參數優化(2):垃圾收集算法選擇

JAVA虛擬機JVM優化重要性,昨天JAVA虛擬機JVM參數優化(1)文章中已經描述,今天我們來討論JAVA虛擬機在不同性能要求下如何選擇三種垃圾收集算法。

JVM內部結構如下圖所示:

7eb97b7428683cb7af50aa84193b2c51.png

串行收集用于單個線程執行垃圾收集的情況,在這種情況下相對它是有效的,因為它不需要和其他線程進行通訊。它適用于單個處理器機器,或者在多處理器情況下數據量小于100MB。串行收集通過參數?-XX:+UseSerialGC聲明工作。

并行收集通過并行較小的收集來降低整個垃圾收集周期。中等或者大型數據量的應用運行在多處理和多線程建議采用并行收集,它通過參數-XX:+UseParallelGC聲明工作。并行壓縮是允許并行收集器并行執行主要集合的功能。如果不進行并行壓縮,則使用單個線程執行主要集合,這會顯著限制可伸縮性。如果指定了-xx:+useParallelGC選項,則默認情況下啟用并行壓縮。關閉它的選項是-xx:-UseParallelOldGC。

大多數并發收集器同時執行其大部分工作(例如,當應用程序仍在運行時),以縮短垃圾收集暫停時間。它是為具有中型到大型數據集的應用程序設計的,在這些數據集中,響應時間比總吞吐量更重要,通過用于最小化暫停的技術會降低應用程序性能。Java熱點VM提供了兩個主要并行收集器之間的選擇;參見大多數并發收集器。使用選項-xx:+UseConcMarkSweepGC啟用CMS收集器或-xx:+UseG1GC啟用g1收集器。

選擇收集器

除非應用程序有相當嚴格的暫停時間要求,否則首先運行應用程序并允許VM選擇一個收集器。如有必要,請調整堆大小以提高性能。如果性能仍然不符合您的目標,那么使用以下準則作為選擇收集器的起點。

如果應用程序有一個小的數據集(高達大約100 MB),則

使用選項-xx:+UseSerialGC選擇串行收集器。

如果應用程序將在單個處理器上運行,并且沒有暫停時間要求,那么讓虛擬機選擇收集器,或者使用選項-xx:+UseSerialGC選擇串行收集器。

如果(a)應用程序性能峰值是第一優先級,并且(b)沒有暫停時間要求,或者可以接受1秒或更長的暫停,那么讓虛擬機選擇收集器,或者使用-xx:+useParallelGC選擇并行收集器。

如果響應時間比總吞吐量更重要,并且垃圾收集暫停時間必須保持短于約1秒,則使用-xx:+useConcMarkSweepgc或-xx:+UseG1GC選擇并發收集器。

這些準則僅為選擇收集器提供了一個起點,因為性能取決于堆的大小、應用程序維護的活動數據量以及可用處理器的數量和速度。暫停時間對這些因素特別敏感,因此前面提到的1秒閾值只是近似值:在許多數據大小和硬件組合上,并行收集器將經歷超過1秒的暫停時間;相反,在某些組合上,并發收集器可能無法保持低于1秒的暫停時間。

如果推薦的收集器沒有達到所需的性能,請首先嘗試調整堆和生成大小以滿足所需的目標。如果性能仍然不足,請嘗試其他收集器:使用并發收集器減少暫停時間,并使用并行收集器增加多處理器硬件上的總吞吐量。

SPEC JBB2015MULTI測試結果分析

選取SPEC JBB2015MULTI測試結果中Java HotSpot 64-bit Server VM,version 1.8.0_131,廠商報告Cisco思科、DELL戴爾、H3C華三、HP、Inspur浪潮、Levovo聯想、Quanta臺灣廣達。

0f1863daf4f375ba8b11a95ab58d3049.png

我們選取每個廠商中得分最高的測試結果,并且按使用堆內存數量大小升序排,如下所示。

Inspur Corporation Inspur NF5280M4 256GB/29GB 39635

-server -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:+UseLargePages -XX:+UseParallelOldGC -Xms29g -Xmx29g -Xmn27g -XX:SurvivorRatio=28 -XX:TargetSurvivorRatio=95 -XX:ParallelGCThreads=22 -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

Quanta Computer Inc. QuantaGrid D52B-2U 384GB/30GB 40874

-showversion -server -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:+UseParallelOldGC -XX:SurvivorRatio=28 -XX:TargetSurvivorRatio=95 -XX:MaxTenuringThreshold=15 -Xms30g -Xmx30g -Xmn27g -XX:ParallelGCThreads=28

PowerEdge R640 786GB/180GB 69059

-showversion -server -XX:+AlwaysPreTouch -XX:+UseParallelOldGC -XX:-UseAdaptiveSizePolicy -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution -XX:-UseBiasedLocking -XX:+AggressiveOpts -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -XX:SurvivorRatio=26 -XX:TargetSurvivorRatio=95 -Xms180g -Xmx180g -Xmn178g -XX:ParallelGCThreads=28 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

Lenovo Global Technology ThinkSystem SR650 768GB/350GB 114309

-server -Xms350g -Xmx350g -Xmn340g -XX:SurvivorRatio=40 -XX:MaxTenuringThreshold=15 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -XX:+UseParallelOldGC -Xnoclassgc -XX:+AggressiveOpts -XX:+AlwaysPreTouch -XX:-UseAdaptiveSizePolicy -XX:-UsePerfData -XX:TargetSurvivorRatio=98 -XX:ParallelGCThreads=56 -XX:-UseBiasedLocking -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps

H3C UniServer R4900 G3 1536GB/710GB 120287

-XX:+UseParallelOldGC -Xms710g -Xmx710g -Xmn690g -XX:-UsePerfData -server -XX:AllocatePrefetchInstr=2 -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseLargePages -XX:SurvivorRatio=48 -XX:TargetSurvivorRatio=90 -XX:ParallelGCThreads=56 -XX:MaxTenuringThreshold=15

Hewlett Packard Enterprise ProLiant DL380 Gen10 1536GB/735GB 117090

-XX:-UsePerfData -server -XX:AllocatePrefetchInstr=2 -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseLargePages -XX:+UseParallelOldGC -Xms735g -Xmx735g -Xmn681g -XX:SurvivorRatio=68 -XX:TargetSurvivorRatio=48 -XX:ParallelGCThreads=56 -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseRTMLocking -XX:InlineSmallCode=10k -XX:MaxGCPauseMillis=300

Cisco UCS C240 M5 1536GB/710GB jOPS:118551

-XX:+UseParallelOldGC -Xms710g -Xmx710g -Xmn690g -XX:-UsePerfData -server -XX:AllocatePrefetchInstr=2 -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseLargePages -XX:SurvivorRatio=48 -XX:TargetSurvivorRatio=90 -XX:ParallelGCThreads=56 -XX:MaxTenuringThreshold=15

從上面數據可以得知SPEC JBB2015都是為了達到吞吐量最大化,再優化響應時間性能,因此所有廠商都不約而同選擇了-server 默認并行收集,同時關閉默認并行壓縮算法,開啟-XX:+UseParallelOldGC;垃圾收集并行線程數-XX:ParallelGCThreads 設置為服務器總核數 56 28,加快并行收集效率

在堆劃分-XX:-UseAdaptiveSizePolicy 采用系統自動適應策略;-XX:SurvivorRatio=28 48 ,盡可能把堆留給年輕對象;-XX:MaxTenuringThreshold=15對象被計數15次才會分配到老年;-XX:TargetSurvivorRatio=95

測試機器都普遍內存多,因此都使用了XX:+UseLargePages -XX:LargePageSizeInBytes=2m 優化大內存

另外-XX:+AggressiveOpts -XX:+AlwaysPreTouch -XX:-UseBiasedLocking這3個指令所有廠商也都不約而同使用

HP惠普還使用-XX:MaxGCPauseMillis=300參數,限制最大一次垃圾收集停頓時間。

總結:JVM調優中最重要還是堆內存的準確預估,可以通過JVM監控來掌握,選擇并行垃圾收集普通情況下優于其他串行和并發收集。通過SPEC測試分析可以了解JVM并行收集影響性能最重要的參數,大部分廠商使用的參數基本相同。

文章參考:

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

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

相關文章

Dubbo與Zookeeper、SpringMVC整合和使用(負載均衡、容錯)

2019獨角獸企業重金招聘Python工程師標準>>> 互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分布式服務架構以及流動計算架構勢在必行,Dubbo是一個分布式服務框架,在這種情況下誕生的…

java clicked_關于java:JComponents在調用mouseClicked()之后消失

我正在用Swing編寫Java GUI程序。該界面如下所示:當用戶單擊右側的圖片之一時,我希望它的一個小的預覽顯示在左上角的橙色區域中。我通過SwingWorker線程從計算機上的目錄中提取所有圖像文件。在SwingWorker的done()方法中,我向每個對象添加了…

vim簡單命令教程-firstblood

你想以最快的速度學習人類史上最好的文本編輯器VIM嗎?你先得懂得如何在VIM幸存下來,然后一點一點地學習各種戲法。 Vim the Six Billion Dollar editor Better, Stronger, Faster. 學習 vim 并且其會成為你最后一個使用的文本編輯器。沒有比這個更好的文…

第三課、Qt的誕生和本質------------------狄泰軟件學院

一、GUI用戶界面元素 (1)、GUI應用程序是由固定的窗口元素所構成 (2)、操作系統提供了創建用戶界面元素所需要的函數 (3)、各自功能不同的函數依次調用,從而創建出界面元素 (4&#…

java mapstring_ object 遍歷_ListMapString,Object使用Java代碼遍歷以獲取String,Object的值...

List>的結果集怎么使用Java代碼遍歷以獲取String,Object的值?package excel;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class List1{public static void main(String[] args){Map map…

Linux tar命令高級用法——備份數據

Linux tar命令高級用法——備份數據 2015-12-31 Linux學習Linux上有功能強大的tar命令,tar最初是為了制作磁帶備份(tape archive)而設計的,它的作用是把文件和目錄備份到磁帶中,然后從磁帶中提取或恢復文件。現在我們可…

iOS uiviewcontroller 添加另外一個controller的View

需要 添加 [self addChildViewController:vc]; [_mainScrollView addSubview:vc.view];轉載于:https://www.cnblogs.com/foolish-guo/p/6385288.html

mysql 即學a又學b_MySQL學習第一天

一、 數據庫:*學習重點:創建數據庫/向表添加記錄/查詢記錄數據庫概念:文件系統(存儲和管理)數據庫軟件介紹:Oracle/MySQL/SQL server…分類:關系型數據庫:關系模型組織數據非關系型數據庫:鍵值對關系存儲二、 mysql數據的存儲方式:一臺數據庫服務器中會創建很多個數據庫(一個項…

Intellij IDEA 快捷鍵(Mac)

編輯 格式化代碼 AltCommandL 大小寫切換 ShiftCommandU 包圍 AltCommandT 選中代碼抽取方法 AltCommandM 調試/運行查看 類關系視圖 CommandAltU 查看所有的 TODO Command6 查詢方法調用處 AltF7 搜索其它 隱藏 Intellij IDEA CommandH 自動提醒 Alt/(這是我自己設置的)…

Spark RDD算子介紹

Spark學習筆記總結 01. Spark基礎 1. 介紹 Spark可以用于批處理、交互式查詢(Spark SQL)、實時流處理(Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。 Spark是MapReduc…

java 寫tb級文件_三管齊下!TB 級文件的上傳性能瞬間被優化 100 倍!

作者 | 中華石杉責編 | 伍杏玲本文經授權轉載石杉的架構筆記(ID:shishan100)這篇文章我們來看看,世界上最優秀的分布式文件系統HDFS,是如何對超大文件的上傳做性能優化的?首先,我們還是通過一張圖來看一下文件上傳的大…

CentOS7下安裝Redis — 單節點

2019獨角獸企業重金招聘Python工程師標準>>> 1. 環境準備 安裝編譯所需要的包: yum install gcc tcl 2. 下載redis http://download.redis.io/releases/redis-3.2.7.tar.gz 3. 安裝redis ## 創建redis的安裝目錄 mkdir /usr/local/redis## 解壓redis tar…

筆記本中美化代碼的方法

這里向大家推薦一個很好用的記筆記軟件,微軟的OneNote,這個筆記軟件,支持分區和分區組的創建,而且入門簡單,界面簡潔,很適合從word過渡過來的人來記筆記! 不過如果直接記筆記,對于程序員來說,可能希望代碼在筆記本上更好看一些,那么應該怎么辦呢?下面提供了在OneNote中,讓代碼…

工具使用——印象(匯總)

作者:桂。 時間:2017-02-09 23:11:30 鏈接:http://www.cnblogs.com/xingshansi/articles/6384097.html 說明:轉載請注明出處,謝謝。 前言 本文僅僅介紹印象筆記的使用,至于挖掘機哪家強,本文不…

java final修飾屬性_Java final關鍵字用來修飾類、方法、屬性

1.final修飾類:這個類不能被繼承。如:String類、StringBuffer類、System類。2.final修飾方法:不能被重寫。如:Object類的getClass()方法。3.final修飾屬性:此屬性就是一個常量,一旦初始化就不可再被賦值。習…

SQL SERVER 數據導出JSON

執行下面的存儲過程: SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE[dbo].[SerializeJSON](ParameterSQL AS VARCHAR(MAX))ASBEGINDECLARE SQL NVARCHAR(MAX)DECLARE XMLString VARCHAR(MAX)DECLARE XML XMLDECLARE Paramlist NVARCHAR(1000)SET …

JSP+Javabean+Servlet實現用戶注冊

在entity包下新建javabean 也就是實體類User 注意id用 Integer 而不用 int, 因為 int 自動初始化為0 public class User { private Integer id; private String username; private String password; 后面是set和get方法... 在Servlet包下創建servlet 右擊Servlet…

main的方法是Java_Java中的main()方法

在Java中,main()方法是Java應用程序的入口方法,也就是說,程序在運行的時候,第一個執行的方法就是main()方法,這個方法和其他的方法有很大的不同,比如方法的名字必須是main,方法必須是public sta…

深入理解Python的logging模塊:從基礎到高級

在Python編程中,日志記錄是一種重要的調試和錯誤追蹤工具。Python的logging模塊提供了一種靈活的框架,用于發出日志消息,這些消息可以被發送到各種輸出源,如控制臺、文件、HTTP GET/POST位置等。本文將深入探討Python的logging模塊…

http請求連接

1、在Info.plist中添加NSAppTransportSecurity類型Dictionary。2、在NSAppTransportSecurity下添加NSAllowsArbitraryLoads類型Boolean,值設為YES轉載于:https://www.cnblogs.com/liuting-1204/p/5919233.html