回覆列表
  • 1 # Java實戰技術

    首先,直接答覆一次題主的問題,一般專案肯定是不需要進行JVM調優的,因為JVM 本身就是為這種低延時、高併發、大吞吐的服務設計和最佳化的,我們很少需要去改變什麼。所以,我們往往更偏重於應用服務本身的調優。

    在一些應用中,比如大資料計算引擎,是一種非常極端的JVM應用,對延時的要求並不高,但對吞吐量要求很高,會有大量的短生命週期物件產生,同時也有大量的物件生存時間非常久,我們就需要對特定的一些 JVM 引數進行修改,不斷調整,做到最優。

    再比如生產環境中出現記憶體溢位,我們需要判斷是由於大峰值下沒有限流,瞬間建立大量物件而導致的記憶體溢位,還是是由於記憶體洩漏而導致的記憶體溢位。對於記憶體洩漏導致的,這種問題就是程式的 Bug,我們需要及時找到問題程式碼進行修改,而不是調整 JVM。

    如果要調優,需要有參考指標,不要為了調優而調優,要有一個目標參考值,最終要達到什麼樣的調優結果,沒有指標的調優都是瞎指揮!以下列出幾個衡量系統性能的常用指標:

    響應時間:響應時間是衡量系統性能的重要指標之一,響應時間越短,效能越好,一般一個介面的響應時間是在毫秒級。響應時間還包括資料庫響應時間、服務端響應時間、網路響應時間、客戶端響應時間。TPS:指系統介面的 TPS(每秒事務處理量),因為 TPS 體現了介面的效能,TPS 越大,效能越好。在系統中,吞吐量分為兩種:磁碟吞吐量和網路吞吐量。計算機資源分配使用率:通常由 CPU 佔用率、記憶體使用率、磁碟 I/O、網路 I/O 來表示資源使用率。這幾個引數好比一個木桶,如果其中任何一塊木板出現短板,任何一項分配不合理,對整個系統性能的影響都是毀滅性的。

    對於JVM調優來說,主要關注以下兩方面:JVM記憶體空間分配引數設定和垃圾回收器的選擇。

    記憶體空間的分配設定:JVM 記憶體分配不合理帶來的效能表現並不會像記憶體溢位問題這麼突出,最直接的表現就是頻繁的 GC,這會導致上下文切換等效能問題,從而降低系統的吞吐量、增加系統的響應時間。具體的實現包括調整堆記憶體空間減少 Full GC、調整年輕代減少 MinorGC、設定合理的 Eden 和 Survivor 區的比例。選擇合適的垃圾回收器:垃圾回收主要是指堆和方法區的回收,堆中的回收主要是物件的回收,方法區的回收主要是廢棄常量和無用的類的回收。垃圾收集器的種類很多,不同的場景有不同的選擇。對於每次操作的響應時間要求比較高的,我們可以選擇響應速度較快的 GC回收器,比如 CMS 回收器和 G1 回收器;而對系統吞吐量有較高要求時,就可以選擇 Parallel Scavenge 回收器來提高系統的吞吐量。

  • 2 # 網路圈

    Java因其開源、高效、跨平臺、生態好的特性使得它成為當前主流的程式設計開發語言,即使之前使用其它技術棧的公司現在也慢慢向Java平臺遷移。相信很多Java同學在面試時都會被問到JVM調優之類的問題,但似乎感覺日常工作中又很少進行JVM調優,那對於一般的Java專案到底要不要進行JVM調優呢?

    什麼是JVM調優?

    在說JVM調優前,我們得先說說JVM。什麼是JVM呢?JVM其實是Java虛擬機器(Java Virtual Machine)的簡稱,Java之所以能跨平臺,其實靠的就是JVM。

    JVM它是一個虛擬機器,雖然JVM本身上是一個計算機程式,但它也有自己的一整套軟硬體環境。

    就好比你新買來了一臺電腦,裝好了系統後,你能正常使用電腦了。但很多使用者是需要對電腦進行一些定製化設定的,比如桌面背景等。同樣,JVM在安裝後,即使不進行任何額外設定也能正常工作,但在某些場景下同樣需要對JVM進行一些調優,而調優的手段就是更改JVM引數。

    JVM調優的目的及調優項

    1、JVM調優的目的

    JVM調優的目的就是:儘可能使用較小的記憶體和CPU來讓Java程式獲得更高的吞吐量及較低的延遲。

    2、JVM常見調優項

    JVM最為常見的調優就是更改JVM預設的引數,比如:

    初始堆大小:-Xms

    最大堆大小:-Xmx

    新生代大小:-Xmn

    永生代最小值:-XX:PermSize

    永生代最大值:-XX:MaxPermSize

    一般專案到底要不要進行JVM調優?

    其實JVM預設的設定是能滿足常規專案需要的,看上去JVM調優只要改改引數什麼的很簡單,其實並非我們所想的那麼簡單。

    JVM調優如果調整得不好反而會影響整個專案的穩定,正常情況下不建議大家對JVM進行調優,除非你的Java專案記憶體佔用過高而你的伺服器記憶體過低時。

  • 3 # 草莓愛旅行

    F:\soft\Java\jdk1.8\bin>jcmd -hUsage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>or: jcmd -lor: jcmd -hcommand must be a valid jcmd command for the selected jvm.Use the command "help" to see which commands are available.If the pid is 0, commands will be sent to all Java processes.The main class argument will be used to match (either partiallyor fully) the class used to start Java.If no options are given, lists Java processes (same as -p).PerfCounter.print display the counters exposed by this process-f read and execute commands from the file-l list JVM processes on the local machine-h this help ------------- 如果我回答對你有幫助,請關注我一下。或有其他問題也可以關注我,給我發私信

  • 中秋節和大豐收的關聯?
  • tomcat與nginx,apache的區別是什麼?