springboot不會運行gc_SpringBoot 和JVM 調優(深度好文,建議收藏)

點擊上方[全棧開發者社區]右上角[...][設為星標?]

be9e0b597a01496f5bcabbe836009c9d.gif

項目調優

作為一名工程師,項目調優這事,是必須得熟練掌握的事情。


在SpringBoot項目中,調優主要通過配置文件和配置JVM的參數的方式進行。

一、修改配置文件

關于修改配置文件 application.properties。


SpringBoot項目詳細的配置文件修改文檔

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#common-application-properties

其中比較重要的有:

server.tomcat.max-connections=0# Maximum number of connections that the server accepts and processes at any given time.

server.tomcat.max-http-header-size=0# Maximum size, in bytes, of the HTTP message header.

server.tomcat.max-http-post-size=0# Maximum size, in bytes, of the HTTP post content.

server.tomcat.max-threads=0# Maximum number of worker threads.

server.tomcat.min-spare-threads=0# Minimum number of worker threads.

二、Jvm調優

關于Jvm調優Oracle官網有一份指導說明:

Oracle官網對Jvm調優的說明

https://docs.oracle.com/middleware/11119/wls/PERFM/jvm_tuning.htm#i1146060

有興趣大家可以去看看。

三、Jvm調優實戰

1、未設置JVM參數的情況

我現在有一個項目,默認情況下,沒有設置任何Jvm參數。


下面我來啟動看一下。

e9100a7205740ede4325d03e7002d35c.png

看一下堆棧分配:


很明顯默認的最大堆內存分配了8個G。很明顯的不合理嘛。

2fe0e9deaa6519e43336ba1fbde4571e.png

2、下面我們來設置下Jvm參數

例如要配置JVM這么一大段參數:

-XX:MetaspaceSize=128m

-XX:MaxMetaspaceSize=128m

-Xms1024m

-Xmx1024m

-Xmn256m

-Xss256k

-XX:SurvivorRatio=8

-XX:+UseConcMarkSweepGC

方式一:


如果你用的是IDEA等開發工具,來啟動運行項目,那么要調試JDK就方便太多了。


只需要將參數值設置到 VM options中即可。

9874202e5207ffa26dbbd2d8d28bf6af.png

設置成功,我的GC日志和堆棧分配都已經OK了。

GC日志:

016827085908e80efbf68b9f0c58218a.png

堆棧分配:

77ad7659c803c887e4291a0d0acdd632.png

方式二:


適用于在項目部署后,在啟動的時候,采用腳本或者命令行運行的時候設置。

先在項目路徑下,給項目打包:


清理就項目

mvn clean

b9eda03b3e3db6c4833bf949dc675d15.png

打包新項目:

mvn package-Dmaven.test.skip=true

打包完成后進入可運行Jar包的路徑下:

59760439f0fd01d5a655ee5c0a2b4a9d.png

執行啟動設置Jvm參數的操作。

$ java -jar

-XX:MetaspaceSize=128m

-XX:MaxMetaspaceSize=128m

-Xms1024m

-Xmx1024m

-Xmn256m

-Xss256k

-XX:SurvivorRatio=8

-XX:+UseConcMarkSweepGC

newframe-1.0.0.jar

這個時候,你再看監控,你就會發現,已經是Ok的了。


堆棧都是按照啟動時候,設置的Jvm參數啟動的。

709f3b4d1fe6cd798e3fde23495beaa9.png

關于這些設置的JVM參數是什么意思,請參考第二步中的oracle官方給出的調優文檔。

我在這邊簡單說一下:

-XX:MetaspaceSize=128m(元空間默認大小)

-XX:MaxMetaspaceSize=128m(元空間最大大小)

-Xms1024m(堆最大大小)

-Xmx1024m(堆默認大小)

-Xmn256m(新生代大小)

-Xss256k(棧最大深度大小)

-XX:SurvivorRatio=8(新生代分區比例 8:2)

-XX:+UseConcMarkSweepGC(指定使用的垃圾收集器,這里使用CMS收集器)

-XX:+PrintGCDetails(打印詳細的GC日志)

知識點:

JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是

-XX:MetaspaceSize=128m(元空間默認大小)

-XX:MaxMetaspaceSize=128m(元空間最大大小)

JDK 8開始把類的元數據放到本地化的堆內存(native heap)中,這一塊區域就叫Metaspace,中文名叫元空間。


使用本地化的內存有什么好處呢?最直接的表現就是java.lang.OutOfMemoryError: PermGen 空間問題將不復存在,因為默認的類的元數據分配只受本地內存大小的限制,也就是說本地內存剩余多少,理論上Metaspace就可以有多大(貌似容量還與操作系統的虛擬內存有關?這里不太清楚),這解決了空間不足的問題。

不過,讓Metaspace變得無限大顯然是不現實的,因此我們也要限制Metaspace的大小:

使用-XX:MaxMetaspaceSize參數來指定Metaspace區域的大小。

JVM默認在運行時根據需要動態地設置MaxMetaspaceSize的大小。

好啦,祝大家學習和工作順利啦!

作者:星朝

cnblogs.com/jpfss/p/9753215.html

---END---

覺得本文對你有幫助?請分享給更多人

關注「全棧開發者社區」加星標,提升全棧技能

本公眾號會不定期給大家發福利,包括送書、學習資源等,敬請期待吧!

如果感覺推送內容不錯,不妨右下角點個在看轉發朋友圈或收藏,感謝支持。

好文章,我在看??

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

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

相關文章

移動端原生js,css3實現輪播圖

一、功能需求 1、自動播放2、滑動切換3、點擊切換 二、思路分析 html代碼&#xff1a; <div class"container">   <ul class"list clearfix">   <li class"item fl item5">圖5</li>   <li class"item fl …

關于換行這個動作,win 和 mac 的實現

‘\r是回車&#xff0c;前者使光標到行首&#xff0c;&#xff08;carriage return&#xff09;\n是換行&#xff0c;后者使光標下移一格&#xff0c;&#xff08;line feed&#xff09;\r 是回車&#xff0c;return\n 是換行&#xff0c;newline對于換行這個動作&#xff1a;u…

你好駱駝:自動文件傳輸

Apache Camel在其主頁上 &#xff08;以及Camel用戶指南中 &#xff09;將其描述為“基于已知企業集成模式的通用開源集成框架”。 Camel框架基于《 企業集成模式 》一書&#xff0c;并提供了該書中描述的模式的實現 。 我看一下這篇文章中使用Camel的“ Hello World”類型示例…

Linux 常用命令二 pwd cd

一、pwd命令 顯示整個路徑名&#xff1a; wangwang:~$ pwd /home/wang 二、cd命令 切換到其他路徑&#xff08;相對路徑方式&#xff09;&#xff1a; wangwang:~$ cd workpalce/ wangwang:~/workpalce$ pwd /home/wang/workpalce 切換到其他路徑&#xff08;絕對路徑方式&…

3dobject用什么打開_第一次用開塞露是什么感覺?網友:像打開了新世界的大門

第一次用開塞露是什么感覺&#xff1f;網友:像打開了新世界的大門我媽說我小時候便秘去醫院&#xff0c;醫生給開了支開塞露&#xff0c;然后在醫院的公廁里使用的&#xff0c;我媽的描述是:“要不是我手挪走的快點&#xff0c;就直接噴我手了”。。。。。。。。。。。。。。。…

linux root郵箱地址,linux – 如何將root的電子郵件轉發到外部電子郵件地址?

我家里有一臺小型服務器(Ubuntu 10.04),我想將root的電子郵件轉發到我的gmail托管域,以獲取安全通知,什么不是.我把所有東西都撕掉了,然后從頭開始跑到other issues.我現在有sendmail工作,我可以發郵件到someexternal.com并收到郵件.但是,向/root/.forward添加地址實際上并不轉…

RHEL6.4 xclock安裝小記

http://blog.sina.com.cn/s/blog_623630d50101tc67.html轉載于:https://www.cnblogs.com/Baronboy/p/7077911.html

Java 7中對String.substring的更改

眾所周知&#xff0c;在您生成相同源字符串的許多子字符串的情況下&#xff0c;Java會優化子字符串操作。 它通過使用(value, offset, count)存儲信息的方式來做到這一點。 請參閱以下示例&#xff1a; 在上圖中&#xff0c;您會看到字符串“ Hello”和“ World&#xff01;”…

原生js創建模態框

1.效果圖如下&#xff1a; 2.代碼如下&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Test</title><style>#pageMask {visibility: hidden; position: absolute;left: 0px; top: 0px;width:…

python查詢oracle數據庫_python針對Oracle常見查詢操作實例分析

本文實例講述了python針對Oracle常見查詢操作。分享給大家供大家參考&#xff0c;具體如下&#xff1a;1.子查詢(難)&#xff1a;當進行查詢的時候&#xff0c;發現需要的數據信息不明確&#xff0c;需要先通過另一個查詢得到&#xff0c;此查詢稱為子查詢&#xff1b;執行順序…

按鈕事件處理(3)

在進行gui編程時&#xff0c;我們最常使用的控件時按鈕&#xff0c;在java中JButton類代表了按鈕。它的類層次結構圖是&#xff1a; java.lang.Object|_ java.awt.Component|_java.awt.Container|_javax.swing.JComponent|_javax.swing.AbstractButton|_javax.swing.JButton我們…

linux下I2C驅動發送IO時序,Linux I2C 驅動閱讀的碰到的一些網上沒有提到的東西

# re: Linux I2C 驅動閱讀的碰到的一些網上沒有提到的東西 回復 更多評論2009-04-11 13:39 by 初學都樓主&#xff0c;你好。我看了你那篇《Linux I2C核心、總線與設備驅動[轉]》&#xff0c;讓我明白了不少&#xff0c;不過我還是有些不明白的地方&#xff0c;想請教一下。我…

Java內存模型和優化

總覽 許多多線程代碼開發人員都熟悉這樣的想法&#xff0c;即不同的線程可以對持有的值有不同的看法&#xff0c;這不是唯一的原因&#xff0c;即如果線程不安全&#xff0c;它可能不會看到更改。 JIT本身可以發揮作用。 為什么不同的線程看到不同的值&#xff1f; 當您有多個…

C_數組詳解

數組&#xff1a; 一 一維數組 1.1 一維數組的定義: 類型符 數組名[常量表達式]; int a[10]; 說明: 1.數組的命名規則遵循標識符命名規則。 2.定義時需要指定元素的個數。方括號里的常量表達式表示元素的個數。 3.常量表達式中不能包含變量&#xff1b;如&#xff1a;int a[n];…

CSS節選——選擇器

CSS&#xff0c;cascading style sheet&#xff0c;層疊樣式表&#xff0c;請留意層疊概念。 css3為了區分偽類和偽元素&#xff0c;偽元素采用雙冒號寫法。 常見偽類——:hover,:link,:active,:target,:not(),:focus。 常見偽元素——::first-letter,::first-line,::before…

python游戲循環設置_Pygame:游戲循環前的初始菜單

我正在制作一個this game的版本&#xff0c;并嘗試將起始菜單設置為&#xff1a;我的計劃是先做surface.fill(overlaycolor)&#xff0c;然后將這個圖像blitting到屏幕上。在一個while循環中。之后&#xff0c;在用戶想玩(另一個問題除外)之后&#xff0c;我們將進入另一個whil…

vue.js基礎知識篇(7):表單校驗詳解

目錄 網盤 第12章:表單校驗 1.npm安裝vue-validator $ npm install vue-validator 代碼示例: var Vuerequire("vue"); var VueValidatorrequire("vue-validator"); Vue.use(VueValidator); 2.直接使用script標簽引入vue.js 要下載vue-validator&#xff0c…

修改linux綁定的域名,手工修改linux系統下DA面板綁定的域名

舉例說明手工修改DA面板下虛擬主機ryan綁定的域名&#xff0c;只需要 vi /usr/local/directadmin/data/users/ryan/httpd.conf代碼如下&#xff1a;# Auto generated apache config file by DirectAdmin version 1.46.3# Modifying this file is not recommended as any change…

在JUnit測試中使用Builder模式

這并不是要成為技術含量很高的職位。 這篇文章的目的是為您提供一些指導&#xff0c;以使您的JUnit測試生活更加輕松&#xff0c;使您能夠在幾分鐘內編寫復雜的測試場景&#xff0c;并具有易于閱讀的測試優勢。 單元測試中有兩個主要部分&#xff0c;需要編寫許多引導程序代碼&…

SQL數據庫中臨時表、臨時變量和WITH AS關鍵詞創建“臨時表”的區別

原文鏈接&#xff1a;https://www.cnblogs.com/zhaowei303/articles/4204805.html SQL數據庫中數據處理時&#xff0c;有時候需要建立臨時表&#xff0c;將查詢后的結果集放到臨時表中&#xff0c;然后在針對這個數據進行操作。 創建“臨時表”&#xff08;邏輯上的臨時表&…