真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

深入淺出的JVM

一、jvm的組織結(jié)構(gòu)

  (1)jvm 和系統(tǒng)調(diào)用之間的關(guān)系

深入淺出的JVM
相應(yīng)的名詞解釋
   - 類加載器:在jvm啟動(dòng)或者類運(yùn)行時(shí)將需要的class加載到j(luò)vm內(nèi)存中
   - 執(zhí)行引擎:負(fù)責(zé)執(zhí)行class文件中包含的字節(jié)指令
   - 內(nèi)存區(qū):是在jvm運(yùn)行的時(shí)候操作鎖分配的內(nèi)存區(qū)。運(yùn)行時(shí)內(nèi)存區(qū)分五個(gè)部分:堆、方法區(qū)、棧、本地方法棧、程序計(jì)數(shù)器,
   - 本地方法接口:主要是調(diào)用c或者c++實(shí)現(xiàn)的本地方法及返回結(jié)果。

站在用戶的角度思考問題,與客戶深入溝通,找到汪清網(wǎng)站設(shè)計(jì)與汪清網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋汪清地區(qū)。

  (2)jvm 的內(nèi)存結(jié)構(gòu)

深入淺出的JVM
   jvm內(nèi)存結(jié)構(gòu)主要由三大塊:堆內(nèi)存、方法區(qū)和棧。
   堆內(nèi)存:是jvm中最大的一塊由年輕代和老年代組成,而年輕代內(nèi)存又被分成三個(gè)部分:Eden 空間(對(duì)相關(guān)剛剛被創(chuàng)建時(shí)存放的位置)、From Survivor() 空間、To Survivor(存貨下來的對(duì)象的存放區(qū)域) 空間,默認(rèn)情況下年輕代按照 8:1:1 的比例來分配。
   方法區(qū)(永久代):存儲(chǔ)信息、常量、靜態(tài)變量等數(shù)據(jù),是線程共享的區(qū)域,為與java堆區(qū)分,方法區(qū)還有一個(gè)別名Non-Heap(非堆) jvm各區(qū)域的作用。
   :又分為java虛擬機(jī)棧和本地方法棧和程序計(jì)數(shù)器,主要用于方法的執(zhí)行。

  (3)各個(gè)區(qū)域參數(shù)調(diào)控

深入淺出的JVM
堆內(nèi)存的設(shè)置:

-Xms:設(shè)置堆的最小空間大小
-Xmx:設(shè)置堆的最大空間大小
-XX:NewSize 設(shè)置新生代最小空間大小
-XX:MaxNewSize:設(shè)置新生代最大空間大小
-XX:PermSize 設(shè)置永久代最小空間大小
-XX:MaxPermSize 設(shè)置永久代最大空間大小
-Xss 設(shè)置每個(gè)線程的堆棧大小
沒有直接設(shè)置老年代的參數(shù),但是可以設(shè)置堆空間大小和新生代空間大小兩個(gè)參數(shù)來間接控 制:老年代空間大小=堆空間大小-年輕代大空間大小

二、jvm各內(nèi)存區(qū)域的作用

(1)各個(gè)區(qū)域的概述:

  • 共享區(qū)
    • 方法區(qū)
  • 線程的私有區(qū)域
    • java棧
    • 本地方法棧
    • 程序計(jì)數(shù)器

(2)java 堆(heap):

  對(duì)于大多數(shù)應(yīng)用來說,Java 堆(Java Heap)是 Java 虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java 堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存。
  java堆是垃圾收集器管理的主要區(qū)域,因此很多時(shí)候也被成為GC堆。如果從內(nèi)存回收的角度看,由于現(xiàn)在收集器基本都是采用分代收集算法,所以java堆中還可以劃分:新生代和老年代;在細(xì)一點(diǎn)的劃分:新生代又包括:Eden 空間、From Survivor 空間、To Survivor 空間。
  如果在堆中沒有內(nèi)存完成實(shí)例分配(堆中沒有內(nèi)存裝得下對(duì)象),并且堆也無法再擴(kuò)展時(shí),將會(huì)拋出 OutOfMemoryError 異常。
深入淺出的JVM
補(bǔ)充(新生代到老年的過程):大多數(shù)情況下,對(duì)象在新生代Eden區(qū)中分配。當(dāng)Eden區(qū)沒有足夠空間進(jìn)行分配時(shí),虛擬機(jī)將發(fā)起一次Minor GC,此時(shí)對(duì)象會(huì)進(jìn)入survivor區(qū),當(dāng)對(duì)象滿足一些條件后會(huì)進(jìn)入老年代。
  - 長(zhǎng)期存活的對(duì)象將進(jìn)入老年代:虛擬機(jī)給每個(gè)對(duì)象定義了一個(gè)對(duì)象年齡(Age)計(jì)數(shù)器。如果對(duì)象在Eden出生并經(jīng)過第一次Minor GC后仍然存活,并且能被Survivor容納的話,將被移動(dòng)到Survivor空間中,并且對(duì)象年齡設(shè)為1。對(duì)象在Survivor區(qū)中每“熬過”一次Minor GC,年齡就增加1歲,當(dāng)它的年齡增加到一定程度(默認(rèn)為15歲),就將會(huì)被晉升到老年代中。對(duì)象晉升老年代的年齡閾值,可以通過參數(shù)-XX:MaxTenuringThreshold設(shè)置。
  - 如果在Survivor空間中相同年齡所有對(duì)象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對(duì)象就可以直接進(jìn)入老年代,無須等到MaxTenuringThreshold中要求的年齡。
  - 虛擬機(jī)提供了一個(gè)-XX:PretenureSizeThreshold參數(shù),令大于這個(gè)設(shè)置值的對(duì)象直接在老年代分配。這樣做的目的是避免在Eden區(qū)及兩個(gè)Survivor區(qū)之間發(fā)生大量的內(nèi)存復(fù)制。

(3)方法區(qū)(method area):

   -方法區(qū)與java一樣,是各個(gè)線程的共享的內(nèi)存區(qū)域,它用于存儲(chǔ)被jvm加載的類信息、常量、靜態(tài)變量、及時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
  jvm規(guī)范對(duì)這個(gè)區(qū)域的限制非常寬松,除了和java堆一樣不需要連續(xù)的內(nèi)存和可以選擇固定大小,還可以選擇不實(shí)現(xiàn)垃圾收集。相對(duì)而言,垃圾收集行為在這個(gè)區(qū)域是比較少出現(xiàn)的,到哪并非數(shù)據(jù)進(jìn)入的方法區(qū)就“永遠(yuǎn)”存在了。這個(gè)區(qū)域的內(nèi)存回收目標(biāo)主要是針對(duì)常量池的回收和對(duì)類型的卸載,一般來說這個(gè)區(qū)域的回收 “成績(jī)”比較難以令人滿意,尤其是類型的卸載,條件相當(dāng)苛刻,但是這部分區(qū)域的回收確實(shí)是有必要的。
  根據(jù) Java 虛擬機(jī)規(guī)范的規(guī)定,當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時(shí),將拋出 OutOfMemoryError 異常。

(4)程序計(jì)數(shù)器:

  程序計(jì)數(shù)器時(shí)一小塊的內(nèi)存空間,它的作用可以看做是當(dāng)前程序所執(zhí)行的字節(jié)碼的行號(hào)指示器,字節(jié)碼解釋器工作時(shí)就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器完成。
  由于 Java 虛擬機(jī)的多線程是通過線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來實(shí)現(xiàn)的,在 任何一個(gè)確定的時(shí)刻,一個(gè)處理器(對(duì)于多核處理器來說是一個(gè)內(nèi)核)只會(huì)執(zhí)行一條線程 中的指令。因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各條線程之間的計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ),我們稱這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存。
  如果線程正在執(zhí)行的是一個(gè) Java 方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是 native 方法(調(diào)用時(shí)使用底層的指令),這個(gè)計(jì)數(shù)器值則為空(Undefined)。
  此內(nèi)存區(qū)域是唯一一個(gè)在 Java 虛擬機(jī)規(guī)范中沒有規(guī)定任何 OutOfMemoryError 情況的區(qū)域。

(5)java虛擬機(jī)棧:

  Java 虛擬機(jī)棧(Java Virtual Machine Stacks)也是線程私有的,它的生命周期與線程相同。虛擬機(jī)棧描述的是 Java 方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候 都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法被調(diào)用直至執(zhí)行完成的過程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過程。
深入淺出的JVM
  局部變量表存放了編譯期可知的各種基本數(shù)據(jù)類型,局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在幀中分配多大的局部變量空間是完全確定的,在方法運(yùn)行期間不會(huì)改變局部變量表的大小。
  關(guān)于java虛擬機(jī)棧的異常:1) 如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出 StackOverflowError 異常 2) 如果虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展,當(dāng)擴(kuò)展時(shí)無法申請(qǐng)到足夠的內(nèi)存時(shí)會(huì)拋出 OutOfMemoryError 異常。

(6)本地方法棧:

  使用native修飾的方法,則存儲(chǔ)在本地方法棧中。與虛擬機(jī)棧一樣,本地方法棧 區(qū)域也會(huì)拋出 StackOverflowError 和 OutOfMemoryError 異常。

三、jvm的垃圾回收機(jī)制介紹

(1)jvm 垃圾回收介紹:

  垃圾收集Garbage Collection通常被稱為“GC”,它誕生于1960年MT的Lisp語(yǔ)言。Jvm中,程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧都是隨線程而生隨線程而滅,棧幀隨著方法的 進(jìn)入和退出做入棧和出棧操作,實(shí)現(xiàn)了自動(dòng)的內(nèi)存清理,因此,我們的內(nèi)存垃圾回收主要集中于 Java 堆和方法區(qū)中,在程序運(yùn)行期間,這部分內(nèi)存的分配和使用都是動(dòng)態(tài)的。

(2)垃圾收集器(Garbage Collection)的介紹:

  GC其實(shí)是一種自動(dòng)的內(nèi)存管理工具器行為主要包括2個(gè)步驟:在和Java堆中,為新的創(chuàng)建的對(duì)象分配空間、回收沒有用的對(duì)象的內(nèi)存空間

(3)實(shí)現(xiàn)多種GC的好處:

  Java 平臺(tái)被部署在各種各樣的硬件資源上,其次,在 Java 平臺(tái)上部署和運(yùn)行著各種 各樣的應(yīng)用,并且用戶對(duì)不同的應(yīng)用的性能指標(biāo)(吞吐率和延遲)預(yù)期也不同,為了滿足不同 應(yīng)用的對(duì)內(nèi)存管理的不同需求,JVM 提供了多種 GC 以供選擇。
  GC的性能指標(biāo)主要包括
   - 最大停頓時(shí)長(zhǎng):圾回收導(dǎo)致的應(yīng)用停頓時(shí)間的最大值
   - 吞吐率:垃圾回收停頓時(shí)長(zhǎng)和應(yīng)用運(yùn)行總時(shí)長(zhǎng)的比例
   例:一次應(yīng)用程序運(yùn)行了60s,然后GC的時(shí)長(zhǎng)為2s(進(jìn)行了4次GC:0.5,0.8,0.2,0.5),那么最大的停頓時(shí)長(zhǎng)為:0.8,吞吐率為:(60-2)/60
  GC的種類大概分為
   - 序列化GC:適合占用內(nèi)存少的應(yīng)用
   - 并行GC或者吞吐率GC,適合占用內(nèi)存較多,多 CPU,追求高吞吐率的應(yīng)用。
   - 并發(fā)GC:適合占用內(nèi)存較多,多 CPU 的應(yīng)用,對(duì)延遲有要求的應(yīng)用。
   并行:指多條垃圾收集線程并行工作,但此時(shí)用戶線程仍然處于等待狀態(tài)。
   并發(fā):指用戶線程與垃圾收集線程同時(shí)執(zhí)行(但不一定是并行的,可能會(huì)交 替執(zhí)行)。

(4)對(duì)象存活的判斷:

   - 引用計(jì)數(shù):每個(gè)對(duì)象有一個(gè)引用計(jì)數(shù)屬性,新增一個(gè)引用時(shí)計(jì)數(shù)加 1,引用釋放時(shí)計(jì)數(shù)減 1,計(jì)數(shù)為 0 時(shí)可以回收。此方法簡(jiǎn)單,缺點(diǎn)是無法解決對(duì)象相互循環(huán)引用的問題。
   - 可達(dá)性分析:從 GC Roots 開始向下搜索,搜索所走過的路徑稱為 引用鏈。當(dāng)一個(gè)對(duì)象到 GC Roots 沒有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的不可達(dá)對(duì)象。
深入淺出的JVM
可達(dá)對(duì)象:通過根對(duì)象進(jìn)行引用搜索,最終可以達(dá)到的對(duì)象。
不可達(dá)對(duì)象:通過根對(duì)象進(jìn)行引用搜索,最終沒有被引用到的對(duì)象。
Java 語(yǔ)言中,GC Roots 包括:

  • 虛擬機(jī)棧中引用的對(duì)象
  • 方法區(qū)中類靜態(tài)屬性實(shí)體引用對(duì)象
  • 方法區(qū)中常量
  • 本地方法棧中的對(duì)象

    (5)MinorGC和Full GC:

      新生代GC(Minor GC):指發(fā)生在新生代的垃圾收集動(dòng)作,因?yàn)?Java 對(duì)象大多都具備朝生 夕滅的特性,所以 Minor GC 非常頻繁,一般回收速度也比較快。
      老年代GC(Full GC):是清理整個(gè)堆空間—包括年輕代和老年代或者永久代。。Full GC 的速度一般會(huì)比 Minor GC 慢 10 倍以上。

    四、垃圾回收算法:

    (1)標(biāo)記-清除算法:

    深入淺出的JVM
      “標(biāo)記-清除”(Mark-Sweep)算法,算法分為“標(biāo)記”和“清除”兩個(gè)階段:首先標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對(duì)象。
      缺點(diǎn)
       - 一個(gè)是效率問題,標(biāo)記和清除過程的效率都不高;
       - 一個(gè)是空間問題,標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能 會(huì)導(dǎo)致,當(dāng)程序在以后的運(yùn)行過程中需要分配較大對(duì)象時(shí)無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作。

    (2)復(fù)制算法:

    深入淺出的JVM
      復(fù)制”(Copying)的收集算法,它將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用 其中的一塊。當(dāng)這一塊的內(nèi)存用完了,就將還存活著的對(duì)象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。
      缺點(diǎn):
      - 這種算法的代價(jià) 是將內(nèi)存縮小為原來的一半,持續(xù)復(fù)制長(zhǎng)生存期的對(duì)象則導(dǎo)致效率降低。

    (3)標(biāo)記整理算法:

    深入淺出的JVM
      標(biāo)記-整理”(Mark-Compact)算法,標(biāo)記過程仍 然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所有存活的對(duì)象都向一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。

    (4)分代收集算法:

      分代收集”(Generational Collection)算法,把 Java 堆分為新生代和老年代,這樣就可以 根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴ā?br/>  年輕代(生存周期短,大量對(duì)象都是垃圾對(duì)象) 使用復(fù)制算法。
      年老代(生存周期長(zhǎng),少量對(duì)象時(shí)垃圾對(duì)象) 使用標(biāo)記整理,或者標(biāo)記清除。

    五、垃圾收集器:

      如果說垃圾收集算法是內(nèi)存回收的方法論,那么垃圾收集器就是內(nèi)存回收的具體實(shí)現(xiàn)。不同廠商、不 同版本的虛擬機(jī)實(shí)現(xiàn)差別很大,HotSpot 中包含的收集器如下:
    深入淺出的JVM

    (1)Serial 收集器(單核服務(wù)器,最快,單線程版本):

      串行收集器是最古老,最穩(wěn)定以及效率高的收集器,可能會(huì)產(chǎn)生較長(zhǎng)的停頓,只使用一個(gè)線 程去回收。新生代、老年代使用串行回收;新生代復(fù)制算法、老年代標(biāo)記-壓縮;垃圾收集 的過程中會(huì) Stop The World(服務(wù)暫停)
    深入淺出的JVM
    這種算法的缺點(diǎn)就是:在垃圾回收的時(shí)候,會(huì)停止其他的線程

    (2)ParNew收集器(多線程版本)

      ParNew 收集器其實(shí)就是 Serial 收集器的多線程版本。
      新生代并行,老年代串行;新生代復(fù)制算法、老年代標(biāo)記-整理
    深入淺出的JVM

    (3)Parallel收集器(多線程)

      Parallel Scavenge 收集器類似 ParNew 收集器,Parallel 關(guān)注吞吐量的多線程 ParNew 進(jìn)化版。新生代復(fù)制算法、老年代標(biāo)記-整理算法。
    深入淺出的JVM

    (4)CMS收集器(多線程)

      CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。目 前很大一部分的 Java 應(yīng)用都集中在互聯(lián)網(wǎng)站或 B/S 系統(tǒng)的服務(wù)端上,這類應(yīng)用尤其重視服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時(shí)間最短,以給用戶帶來較好的體驗(yàn)。
    深入淺出的JVM
    優(yōu)點(diǎn):并發(fā)收集、低停頓
    缺點(diǎn):產(chǎn)生大量的空間碎片,并發(fā)節(jié)點(diǎn)吞吐率低。
    參數(shù)配置

    -XX:+UseConcMarkSweepGC 使用 CMS 收集器 
    -XX:+ UseCMSCompactAtFullCollection Full GC 后,進(jìn)行一次碎片整理;整理過程是獨(dú)占的,會(huì)引起停頓時(shí)間變長(zhǎng) 
    -XX:+CMSFullGCsBeforeCompaction 設(shè)置進(jìn)行幾次 Full GC 后,進(jìn)行一次碎片整理 
    -XX:ParallelCMSThreads 設(shè)定 CMS 的線程數(shù)量(一般情況約等于可用 CPU 數(shù)量)

    (5)G1收集器(多線程)

      特點(diǎn):
       - 空間整合:G1 收集器采用標(biāo)記整理算法,不會(huì)產(chǎn)生內(nèi)存空間碎片。分配大對(duì)象時(shí)不會(huì)因?yàn)闊o法找到連續(xù)空間而提前觸發(fā)下一次 GC。
       - 可預(yù)測(cè)的停頓:,降低停頓時(shí)間是 G1 和 CMS 的共同關(guān)注點(diǎn),但 G1 除了追求低停頓外,還能建立可預(yù)測(cè)的停頓時(shí)間模型,能讓使用者明確指定在一個(gè)長(zhǎng)度為 N 毫秒的時(shí)間片段內(nèi),消耗在垃圾收集上的時(shí)間不得超過N毫秒,這幾乎已經(jīng)是實(shí)時(shí)Java(RTSJ) 的垃圾收集器的特征了。
       - G1搜集器,Java 堆的內(nèi)存布局與其他收集器有很大差別,它將整個(gè) Java 堆劃分為多個(gè)大 小相等的獨(dú)立區(qū)域(Region),雖然還保留有新生代和老年代的概念,但新生代和老年代不再是物理隔閡了,它們都是一部分(可以不連續(xù))Region 的集合。
    深入淺出的JVM
      G1 的新生代收集跟 ParNew 類似,當(dāng)新生代占用達(dá)到一定比例的時(shí)候,開始觸發(fā)收集。這樣一來可以做到,當(dāng)達(dá)到一定的比例時(shí),觸發(fā)垃圾回收,那些沒有使用region仍然可以對(duì)外提供使用,就有效的避免了stop the world。
      與CMS的比較:
       - 分代:CMS 中,堆被分為 PermGen,YoungGen,OldGen;而 YoungGen 又分了兩個(gè) survivor 區(qū)域。在 G1 中,堆被平均分成幾個(gè)區(qū)域(region),在每個(gè)區(qū)域中,雖然也保留了新老代的概 念,但是收集器是以整個(gè)區(qū)域?yàn)閱挝皇占摹?br/>   - 算法:相對(duì)于 CMS 的“標(biāo)記—清除”算法,G1 會(huì)使用“標(biāo)記--整理”算法,保證不產(chǎn)生 多余的碎片。
       - 停頓時(shí)間可控制:了縮短停頓時(shí)間,G1 建立可預(yù)存停頓模型,這樣在用戶設(shè)置的停頓時(shí) 間范圍內(nèi),G1 會(huì)選擇適當(dāng)?shù)膮^(qū)域進(jìn)行收集,確保停頓時(shí)間不超過用戶指定時(shí)間。

    六、jvm參數(shù)配置以及常用的分析工具:

    (1)jvm的參數(shù)列表:

    各個(gè)內(nèi)存大小分配

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
    -Xmx3550m:最大堆內(nèi)存為 3550M
    -Xms3550m:初始堆內(nèi)存為 3550m
    一般情況:-Xmx與-Xms值設(shè)置為相同的,以避免每次垃圾回收完成后 JVM 重新分配內(nèi)存。
    -Xmn2g:設(shè)置年輕代大小為 2G
    -Xss1m:設(shè)置每個(gè)線程的堆棧大小
    -XX:NewRatio=4:設(shè)置年輕代(包括 Eden 和兩個(gè) Survivor 區(qū))與年老代的比值(除去持久 代)。設(shè)置為 4,則年輕代與年老代所占比值為 4:1,年輕代占整個(gè)堆棧的 4/5
    -XX:SurvivorRatio=4:設(shè)置年輕代中 Eden 區(qū)與 Survivor 區(qū)的大小比值。
    -XX:MaxPermSize=16m:設(shè)置持久代大小為 16m。
    -XX:MaxTenuringThreshold=15:設(shè)置垃圾最大年齡。

    收集器設(shè)置

    -XX:+UseSerialGC 設(shè)置串行收集器 
    -XX:+UseParallelGC 設(shè)置并行收集器 
    -XX:+UseParalledlOldGC 設(shè)置并行年老代收集器 
    -XX:+UseConcMarkSweepGC 設(shè)置并發(fā)收集器

    垃圾回收統(tǒng)計(jì)信息

    -XX:+PrintGC
    –XX:+PrintGCDetails 
    -XX:+PrintGCTimeStamps 
    -Xloggc:filename

    并行收集器設(shè)置

    -XX:ParallelGCThreads=n 設(shè)置并行收集器收集時(shí)使用的 CPU 數(shù)。并行收集線程數(shù)
    -XX:MaxGCPauseMillis=n 設(shè)置并行收集最大暫停時(shí)間
    -XX:GCTimeRatio=n 設(shè)置垃圾回收時(shí)間占程序運(yùn)行時(shí)間的百分比。公式為 1/(1+n)

    并發(fā)收集器設(shè)置

    -XX:+CMSIncrementalMode 設(shè)置為增量模式。適用于單 CPU 情況
    -XX:ParallelGCThreads=n 設(shè)置并發(fā)收集器年輕代收集方式為并行收集時(shí),使用的 CPU 數(shù)并行收集線程數(shù)

    (2)jvm分析工具:

    jps:查看java進(jìn)程

    -q 只顯示pid,不顯示class名稱,jar文件名和傳遞給main 方法的參數(shù)
    -m 輸出傳遞給main 方法的參數(shù),在嵌入式j(luò)vm上可能是null
    -l 輸出應(yīng)用程序main class的完整package名 或者 應(yīng)用程序的jar文件完整路徑名
    -v 輸出傳遞給JVM的參數(shù)
    jps host 查看host的jps情況(前提:host提供jstatd服務(wù))

    jstatd:?jiǎn)?dòng)jvm監(jiān)控服務(wù)。它是一個(gè)基于rmi(遠(yuǎn)程接口調(diào)用)的應(yīng)用,向遠(yuǎn)程機(jī)器提供本機(jī)jvm應(yīng)用程序的信息。默認(rèn)端口1099。-p指定端口。
    jmap1:觀察運(yùn)行中的jvm物理內(nèi)存的占用情況

    -heap:打印jvm heap的情況(垃圾收集器類型)
    -histo:打印jvm heap的直方圖。其輸出信息包括類名,對(duì)象數(shù)量,對(duì)象占用大小。
    -histo:live :同上,但是只打印存活對(duì)象的情況
    -permstat:打印permanent generation heap(方法區(qū))情況
    -finalizerinfo:打印正等候回收的對(duì)象信息

    jmap2:用jmap把進(jìn)程內(nèi)存使用情況dump到文件中,再用jhat分析查看。

    jmap -dump:format=b,file=dumpFileName pid
    jmap -dump:format=b,file=4574.heap20151215  4574

    jinfo:打印命令行參數(shù)和系統(tǒng)屬性

    -flags  打印命令行參數(shù)
    -sysprops  打印系統(tǒng)屬性

    jstack1:能得到運(yùn)行java程序的java stack和native stack的信息??梢暂p松得知當(dāng)前線程的運(yùn)行情況

    -l長(zhǎng)列表. 打印關(guān)于鎖的附加信息,例如屬于java.util.concurrent的ownable synchronizers列表
    -m打印java和native c/c++框架的所有棧信息

    jstat

    Options — 選項(xiàng),我們一般使用 -gcutil /-gc 查看gc情況
    pid      — VM的進(jìn)程號(hào),即當(dāng)前運(yùn)行的java進(jìn)程號(hào)
    interval[s|ms]  ——  間隔時(shí)間,單位為秒或者毫秒,默認(rèn)為ms。必須是正整型
    count     — 打印次數(shù),如果缺省則打印無數(shù)次
    例:jstat -gc 4645 500 10  表示查看進(jìn)程為4645的gc每個(gè) 500ms打印一次,一共打印10次

新聞名稱:深入淺出的JVM
當(dāng)前網(wǎng)址:http://weahome.cn/article/pjjjeo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部