5分鐘掌握JVM常用選項及相關知識,工作面試夠用了

2020-08-17 Java編程技術

原創聲明

本公眾號所有文章均原創,未經許可不得轉載(已與維權騎士籤約)。文章以圖解為主、代碼為輔。關注我,無限收穫Offer!

:吳瀟/Java高級工程師


本文截取java後端服務最常用的jvm選項,逐一解釋它們的作用及JVM內存、GC、類加載等相關知識,建議收藏。為避免篇幅太長,本次介紹最小堆大小(-Xmsize)、最大堆大小(-Xmxsize),以及新生代大小(-Xmnsize)的設置。

相信很多java工程師在工作中都會接觸到jvm,在面試中也會被問到跟java虛擬機有關的問題。我們為了把工作做好、把項目維護好、在系統出現fullgc等問題的時候,能夠像老司機一樣準確定位問題,很有必要把java虛擬機知識學習一遍。

然而,Java虛擬機的知識量很大,買一本書回來慢慢學習會比較消耗時間(例如《深入理解Java虛擬機》,其實這本書也只算&34;)。況且jvm優質學習資源較少,只有官方文檔較好,但是官方文檔內容又太多了,不適合作為學習教材,而且還是英文的。

即使你下定決心,準備把Java虛擬機的所有知識徹底學一遍,也很有可能遇到這些問題:1)看到後面忘記前面;2)看的時候,沒有練習機會,導致在實際要用的時候,又不知道怎麼辦;3)看完之後,當時雖然記得,但是過了一段時間之後,又都忘掉了。

針對上面這些問題,我們應該從實踐出發,帶著目的學習。這樣不但記得牢、而且一開始就面向實踐,理解得也要比單純的看資料深入。在這篇文章中,就以我們公司的某個後端服務的java啟動選項為例,介紹這些jvm選項,逐個解釋這些選項的作用,及相關的JVM內存管理、GC或類加載等知識。

我們公司某一個大流量的後端服務配置了這些jvm選項(這些選項也是目前國內網際網路公司經常用到的),如下圖所示。

1) -Xms4G解釋

這個配置項對應的JVM選項是 -Xms<size>,其中,4G是參數值。

我們知道java命令是用來啟動java虛擬機執行java代碼的。java命令支持很多選項,在這些選項當中,以&34;開頭的,都是Java虛擬機選項;不以&34;開頭的選項,不是傳給Java虛擬機的,例如&34;中的&34;不是傳給JVM的。

所以,-Xms4G中的-X代表這是一個jvm選項,m代表memory,對於jvm而言memory就是堆;s是smallest,最小的意思。-Xms4G代表把JVM的堆的最小值設為4G。

jvm堆隨著java程序的運行不斷增大,因此,這裡的堆最小值也是jvm初始堆大小。當jvm運行一段時間後,堆大小超過初始值,這裡配置的值其實沒什麼用了。

所以,最小堆大小或初始堆大小隻影響JVM啟動階段,對後續jvm運行沒什麼影響

那麼,在實際運用中,-Xms<size>應該配置成多少呢?假如伺服器是8核16G,先設置成10G,即物理內存的一半再多加一些(建議跟最大堆大小設置成相同值,這樣可以減少剛部署階段的fullgc次數),然後運行一段時間再看容器的監控,看容器還剩多少內存。如果還剩很多,再調大一些,例如設置成12G,直到充分利用容器物理內存為止。

2) -Xmx4G解釋

對應的JVM選項是 -Xmx<size>,它跟前面-Xms<size>類似,配置方法完全一樣。

-Xmx4G中,m代表memory,x是maximum,最大的意思。-Xmx4G就是把JVM的堆的最大值設為4G。

前面說過,隨著java程序運行,堆會從初始值開始穩步增長,當達到最大值以後就不再增長,以後主要靠GC來回收內存。所以,堆最大值的設置要比最小值謹慎,配置小了,程序內存不夠用,頻繁GC;配置得太大,每次GC時間比較長,程序有停頓現象(也跟垃圾回收器的選擇有關)。對後端服務而言,堆最大值一般與堆最小值配置成一樣的即可。

實際工作中,-Xmx<size>的值怎麼選?按照前面-Xms<size>的配置方法操作即可。如果每次GC時間較長,說明堆配置值的大了,適當減小堆最大值。

3) -Xmn1G解釋

這項配置對應的jvm選項是-Xmn<size>,即把young generation(新生代)設置為1G。

-Xmn<size>中,m代表memory(如前所述),字母n代表什麼呢?它代表nursery(託兒所,存放新出生的嬰兒,即新創建的對象)。-Xmn1G就是把新生代固定設置成1G。另外,新生代也可以像前面一樣,最大、最小值分開設置,用-XX:NewSize來設置新生代的初始大小(最小值),用-XX:MaxNewSize設置新生代的最大值,這裡-Xmn<size>相當於同時指定-XX:NewSize和-XX:MaxNewSize。

jvm運行一段時間以後,新生代的初始大小,即-XX:NewSize其實沒什麼作用了,起作用的僅僅是-XX:MaxNewSize,所以我們往往把兩者設置成一樣的值,而且用-Xmn<size>這種合併的寫法,這樣比較方便。

JVM內存知識:我們知道,java中新創建的對象都是放在新生代(young generation)中的,尤其是剛創建出來的對象,更是放在了新生代中的eden區。經歷過少數幾次GC的新對象往往都是放在survivor區。對於java這樣的&34;的語言來說,程序運行一旦運行起來,就不斷有大量的對象被新建和釋放(java一開始甚至因為運行得太慢,差點被淘汰)。因此,新生代的GC非常活躍,如果你們公司有實時監控新生代內存的系統,就可以看到,新生代幾乎一直在GC。新生代的GC雖然頻繁,但是所產生的停頓非常非常小,幾乎可以忽略不計,不會產生多少服務延遲。新生代GC也就是我們所說的Young GC。

那麼,-Xmn<size>怎麼設置呢?假如設置得太小,那麼Yong GC就會發生得更加頻繁,所產生的的效果就是,它會比較多的消耗CPU資源;而如果設置的太大,那麼新對象存活的時間就會比較長,導致它們被不恰當的放入老年代(old generation),從而導致產生太多full gc,而full gc就對服務有明顯影響了。Oracle官方文檔建議我們把新生代的大小設置為堆的總大小的1/2到1/4之間。但是,Oracle不了解我們的業務特點,我們還是需要根據業務監控,來看新生代具體要設置為多大。

那具體要怎麼調整?就是前面說的,如果Yong GC太多了或GC導致的CPU計算量太高,就調大新生代;而如果業務服務出現了full gc,那考慮調大新生代。不過,據我多年經驗總結,full gc很少是由JVM參數配置不當造成的,它往往是業務代碼寫得不合理導致的。如果你的某一個業務服務平時運行得很好,突然有一天full gc,就看看最近上線改了什麼。另外,如果full gc是因為服務連續、長時間運行導致,那就看你代碼裡面有沒有不當使用內存,有沒有內存洩漏,長期引用不需要的對象。

到這裡才發現,還有這些JVM參數沒有講呢。下一篇文章繼續分析,感興趣的朋友請關注哦。

-XX:+AlwaysPreTouch -XX:PermSize=256M -XX:MaxPermSize=256M

-XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction=80

-Dlog4j.configurationFile=/data/webapps/dealservice_bizer/current/conf/log4j2.xml

希望本文對您有幫助,如果您對網際網路、前/後/客戶端、架構/分布式/高可用/高並發/高實時、電商、Redis、MySQL、Zookeeper、Spring、Android、瀏覽器插件、Java、Java虛擬機、C/C++、Linux、個性化推薦、社區發現、機器學習、數據挖掘等感興趣,歡迎關注。

相關焦點

  • Java面試總結之JVM
    對於Java程式設計師來說,JVM是面試過程中必備考題之一,只要我們掌握了其核心知識點,萬變不離其中,無論怎麼考你,都能應對自如。這篇文章我會根據在實際面試過程中遇到的考題,然後結合理論知識點,總結一下JVM的實戰考點。
  • JVM、GC 大串講,面試夠用了
    來源於「深入理解java虛擬機」3-5圖中,如果倆個虛擬機之間有連線,說明它們可以搭配使用。沒有最好的垃圾回收器,只有最適合自己的垃圾回收器。JDK1.8默認垃圾回收Parallel Scavenge + ParallelOldSerial單線程執行,只會使用一個CPU或一條收集線程區完成垃圾收集工作。它執行垃圾回收的時候,必須暫停其他工作線程,直到收集結束。
  • 阿里P8專家用5個小時讓你精通JVM調優,共計3.7G
    前言做java開發的幾乎都知道jvm這個名詞,但是由於jvm對實際的簡單開發的來說關聯的還是不多,一般工作個一兩年(當然不包括愛學習的及專門做性能優化的什麼的),很少有人能很好地去學習及理解什麼是jvm,以及弄清楚jvm
  • 阿里P8專家用5個小時讓你精通JVM調優,共計3.7G
    前言做java開發的幾乎都知道jvm這個名詞,但是由於jvm對實際的簡單開發的來說關聯的還是不多,一般工作個一兩年(當然不包括愛學習的及專門做性能優化的什麼的),很少有人能很好地去學習及理解什麼是jvm,以及弄清楚jvm的工作原理,個人認為這塊還是非常有必要去認真了解及學習的,特別是剛入門或入門不久的java開發來說,這是java
  • 面試必問億級流量優化策略之JVM調優,文檔視頻面試,還不收藏
    合理的優化能夠極大的提高工作效率。下面是很多開發者經常會遇到的問題:網上看過調優相關知識點,但沒有實操過,看完就忘;工作時 Redis、Kafka 等都是直接調用,一出問題就束手無措;徹底掌握JVM最底層原理,應對大廠面試從容不迫2. 具備分析、定位與解決大型系統生產環境JVM問題的能力3. 徹底掌握Mysql底層優化原理,橫掃一切關於Mysql優化的面試題4.
  • 字節大神教你如何從三大模塊熟知Jvm,讓你不再擔心面試官的懟問
    現在各大平臺上關於jvm的文章有很多,不過寫的有些偏基礎,並不是很全面。而作為一名Java使用者,掌握JVM的體系結構也是很有必要的,那麼如何才能更好的掌握jvm呢?下面我們一起來看看字節大神對jvm的見解吧!
  • 三大步驟,一周啃透了JVM,順利拿下字節跳動研發崗Offer
    不管是工作還是面試中,JVM都是必考題。如果不懂JVM的話,薪酬會非常吃虧。而作為一名Java使用者,掌握JVM的體系結構也是很有必要的,那麼如何才能結合以上內容更好的掌握jvm呢?今天我們就來一起談談吧。下面介紹我學習JVM的三個步驟,一周就吃透了JVM,讓我順順利利拿下了字節研發崗的offer。
  • 三大步驟,一周啃透了JVM,淡定拿下字節跳動研發崗Offer
    不管是工作還是面試中,JVM都是必考題。如果不懂JVM的話,薪酬會非常吃虧。而作為一名Java使用者,掌握JVM的體系結構也是很有必要的,那麼如何才能結合以上內容更好的掌握jvm呢?今天我們就來一起談談吧。下面介紹我學習JVM的三個步驟,一周就吃透了JVM,讓我順順利利拿下了字節研發崗的offer。
  • Github上都在瘋找的京東內部「JVM調優筆記」終於來了
    了解 GC 的基礎常用術語知識。了解 NM 的基礎知識,包括堆、楠、方法區等。jvm與性能優化知識點 JVM & GC基礎知識JVM是Java語言可以跨平臺、保持高發展的根本,沒有了JVM,Java語言將失去運行環境。
  • 阿里面試官告訴我的「面試通過要點」,讓我成功面進阿里
    過程心得:這段時間很痛苦,很多基礎知識需要複習掌握,知識點很細,讓同學難以掌握。但這些知識在大廠面試中佔比(80%左右),能不能過一面也正是這些基礎知識理論。而在這過程中,難點主要是,java,並發知識,jvm原理,http,tcp協議,網絡協議架構和它各個層的功能,作業系統的基礎理論。
  • 好的Java開發工作肉少狼多,黃金9月,大家還不行動一波?
    下面說一下具體面試情況1面還是java基礎先問問,然後分布式那些,然後問下你的業務,然後出些實戰問題,一面結束,1小時左右1. 線程池用過哪些,線程池有哪些參數,然後問我幾個常用線程池的用法和實際場景問題。2.
  • JAVA面試必備筆記:必須掌握的核心技能點
    資料介紹,面試題超350題+這套面試題豐富全面,從 java常用命令到 java常用操作,再到jvm編程、主流服務、性能優化、自動化運維、面試技巧等幾乎覆蓋了所有 java 面試題,被同事稱為 java界 面試活字典,跟java相關的面試題,都會能夠得到找得到,部分有挑戰的題會附帶答案,所有文字可直接複製
  • 面試筆記之必掌握的java核心技能點
    資料介紹,面試題超350題+這套面試題豐富全面,從 java常用命令到 java常用操作,再到jvm編程、主流服務、性能優化、自動化運維、面試技巧等幾乎覆蓋了所有 java 面試題,被同事稱為 java界 面試活字典,跟java相關的面試題,都會能夠得到找得到,部分有挑戰的題會附帶答案
  • 阿里當了7年技術面試官:掌握這些Java知識點,大廠offer拿到手軟
    java基礎知識Jvm的底層原理計算機網絡作業系統數據結構和基礎算法資料庫知識理論 過程心得:這段時間很痛苦,很多基礎知識需要複習掌握,知識點很細,讓同學難以掌握。但這些知識在大廠面試中佔比(80%左右),能不能過一面也正是這些基礎知識理論。而在這過程中,難點主要是,java,並發知識,jvm原理,http,tcp協議,網絡協議架構和它各個層的功能,作業系統的基礎理論。
  • JVM面試題之你能說說JVM有哪些內存區域嗎
    面試題你能說說JVM內存模型嗎?面試題分析面試官問這樣的問題,主要考察你對JVM內存模型是否了解。只有了解了內存模型,才能去搞明白GC原理,這個問題是網際網路公司面試最常問的了。jvm內存區域劃分總結了解jvm內存模型,是java程式設計師的必能技能,因此大家應該熟記於心。當然,面試官肯定不會只問一個這麼簡單的問題了,後面還會有一大堆連環炮問題等著你呢。比如面試官會問你有沒有生產JVM調優經驗?你是如何進行JVM調優的?系統出現頻繁Full GC怎麼優化?系統出現OOM怎麼解決?
  • 大廠面試系列(一)::JVM基礎
    JVM面試題字節碼相關知道字節碼嗎?字節碼都有哪些?JMM內存模型說說JVM的主要組成部分以及作用?手寫一下類加載Demo Classloader作用講一講類加載器工作機制?你知道強引用、弱引用和軟引用嗎?為什麼要有這些東西?他們有什麼作用?你在項目中用過嗎?說一下java類加載器的工作機制?類加載在那個區域進行的?你自己定義的類能被最頂級的類加載器加載嗎?為什麼? 自定義的類會被什麼類加載器加載?
  • Java性能調優:JVM性能監控常用方法
    一、前言本小節會介紹JVM性能監控,掌握幾種常用的監控工具輔助我們更好的了解JVM的性能狀態。生產環境中監控JVM性能,分析監控數據,可以知道何時需要JVM調優,可見監控是非常重要的。JVM的監控範圍包括垃圾收集、JIT編譯以及類加載。那其中具體都包含哪些?如何監控呢?
  • 500+篇Java乾貨技術文章整理|資源|書單|工具|面試...
    程式設計師不止需要閱讀技術書籍,更需要閱讀更多其他領域的書籍,比如如何思考,如何閱讀,如何管理時間和提供工作效率的書籍,在程式設計師不斷精進的路上,需要更多書籍的陪伴。不管你是剛入門,在求職面試或者已經在工作,相信本公眾號推薦的一些書籍都會幫助到你!公眾號裡會不定期分享電子書、技術資料、源碼等乾貨,同時也會經常進行送書活動,回饋一直支持本號的粉絲!
  • 面試技巧:5分鐘拿下工作機會
    然後,你還得留意下面的5個注意事項,以便更好地找到理想的職業。   1. 5 Minutes to make a good first impression.   1. 「5分鐘好印象」法則。   最近有一個調查發現,有半數參與採訪的僱主表示,他們會在面試的前5分鐘就衡量出這位求職者的就業資格,這也就決定了他們會否為求職者提供職位的機會。   That doesn’t give you, the prospective employee, much of a window. So make sure everything is on point.
  • 京東最詳細面試總結!幫你提高80%的Java面試成功率
    前言面試,是找到好工作的過程中,最最重要的一環。在作者6年的職業生涯中,親自面試的人應該不下500人了。投簡歷還要更多,尤其是微軟上海早期擴張的時候。2.集合框架的知識,hashmap,ArrayList,LinkedList源碼相關知識,基本整個介紹了 一遍,與hastable,concurrenthashmap相互的關聯和區別