Java Jvm 的分配參數概述

2020-09-04 早起的年輕人


在前幾篇中有基本概述如下



1 java 應用程式設置最大堆內存與最小堆內存

1.1 最大堆內存

java應用程式可以使用最大堆內存可以用-Xmx參數指定,最大堆內存指的是新生代和老年代的大小之和的最大值,是java應用程式的堆上限
在java程序運行時可以通過 Runtime.getRuntime().maxMemory()取得系統的可用的最大堆內存

1.2 最小堆空間

使用 -Xms可用於設置系統的最小堆空間,也就是jvm啟動時所佔據的作業系統的內存大小,java應用程式在運行時,首先會被分配-Xms指定的內存大小,並儘可能的在這個空間段內存中運行程序,當這個值無法滿足應用程式時,jvm才會向作業系統中申請更多的內存,直到內存值達到-Xmx指定的大小,若超過-Xmx指定的大小時,則拋出 OutOfMemoryError異常

如果 -Xms的數值較小,那麼JVM為了保證系統儘可能的在指定內存範圍中運行,就會更加頻繁地進行GC操作,以釋放內存空間
因此 把-Xms的值設置為-Xmx時,可以在系統運行初期時減少CG的次數和耗時




2 java 應用程式設置新生代內存與持久代內存

2.1 新生代內存

參數-Xmn用於設置新生代的大小,設置一個較大的新生代會減少老年代的大小,對系統性能以及GC有很大的影響,新生代的大小一般設置為整個堆空間的1/4到 1/3左右

在Hot Spot虛擬機中,-XX:NewSize用於設置新生代的初始大小,-XX:MaxNewSize設置新生代的最大值,通常情況下,設置-Xmn的效果等同於設置了想用 的-XX:NewSize 和-XX:MaxNewSize,若設置不用的XX:NewSize 和-XX:MaxNewSize,可能會導致內存震蕩,從而產生不必要的系統開銷

2.1 持久代內存(方法區)

參數 -XX:MaxPermSize可以設置持久代的最大值,-XX:PermSize可以設置持久代的初始大小
系統所支持的最大類數量,與MaxPermSize成正比,一般設置為64M可以滿足絕大部分程序的正常工作,如果不夠可以設置為 128M,這是兩個比較常用的永久區取值




3 java 應用程式設置線程棧內存

參數 -Xss 參數用來設置線程棧(針對每一個線程)的大小
在線程進行局部變量分配,函數調用時,都需要在棧中開闢空間,如果棧的空間開闢太小,那麼線程在運行時,就可能沒有足夠的空間分配局部變量或者達不到足夠的函數調用深度,導致程序異常退出,如果棧的空間開闢太大,那麼開設線程所需的內存成本就會上升,系統所支持的線程數就會下降

從堆內存角度來考慮,堆也是向作業系統申請內存空間的,因此堆空間過大,就會導致作業系統可用於線程棧的內存減少,從而間接減少程序所能支持的線程數量

下面是若干次測試


Java堆內存以 900M的大小遞增,當棧大小為1M時,最大線程數量以200遞減。
當系統的內存空間不足而無法創建新的線程時,會拋出 java.lang.OutOfMemoryError:unable to create new native thread

相關焦點

  • JAVA HEAP SPACE解決方法和JVM參數設置
    ,jvm將會按照這些參數順序輸出gc概要信息,詳細信息,gc時間信息,gc造成 的應用暫停時間。要監控本地應用,執行jconsole pid,pid就是運行的java進程id,如果不帶上pid參數,則執行jconsole命令後,會看到一個對話框彈出,上面列出了本地的java進 程,可以選擇一個進行監控。
  • Java Jvm虛擬機的內存模型概述
    對於64位的 long 和 double 變量而言,虛擬機會為其分配兩個連續的 Slot 空間。虛擬機通過索引定位的方式使用局部變量表。之前我們知道,局部變量表存放的是方法參數和局部變量。當調用方法是非static 方法時,局部變量表中第0位索引的 Slot 默認是用於傳遞方法所屬對象實例的引用,即 「this」 關鍵字指向的對象。分配完方法參數後,便會依次分配方法內部定義的局部變量。
  • 概述:JVM內存模型、線程隔離數據區、線程共享數據區
    一、概述我們知道java代碼先編譯為.class文件,然後再將.class文件交由jvm執行。當一個java方法要調用的的時候,會將java棧幀入虛擬機棧,而當非java方法要調用的時候就會入本地方法棧。
  • Java面試總結之JVM
    二、類的加載機制類的加載過程是指將java編譯之後的class文件讀入到內存中,然後在堆區創建一個java.lang.Class對象,用於封裝類在方法區內的數據結構。類加載的最終目的是封裝類在方法區的數據結構,並向java程式設計師提供訪問方法區數據的接口。
  • JVM內幕:Java虛擬機詳解
    當線程本地存儲、緩衝區分配、同步對象、棧、程序計數器等準備好以後,就會創建一個作業系統原生線程。Java 線程結束,原生線程隨之被回收。作業系統負責調度所有線程,並把它們分配到任何可用的 CPU 上。當原生線程初始化完畢,就會調用 Java 線程的 run() 方法。run() 返回時,被處理未捕獲異常,原生線程將確認由於它的結束是否要終止 JVM 進程(比如這個線程是最後一個非守護線程)。
  • 把玩JVM內存模型系列-JVM內存模型概述以及程序計數器
    把玩JVM內存模型系列-JVM內存模型概述以及程序計數器我們都知道在Java的世界裡,創建一個對象new一個就行了,不用像C、C++那樣寫一段釋放對象內存的代碼,因為java虛擬機幫我們做了這事,可是一旦這樣做,也相當於把控制內存區域的權利交給了
  • JVM的基礎知識點Java的內存模型
    其實從內存分配的角度來看,線程共享的Java堆可能其實是多個線程私有的分配緩衝區,不同的線程將各自的對象實例放在看似共享的Java堆的各自的緩衝區上,這樣劃分可以更好的回收內存,也可以更好點分配內存。;java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)     at java.util.ArrayList.add(ArrayList.java:458)     at com.intelligentler.jvm
  • jvm系列一:我們的java程序如何跑起來
    平時我們做項目的流程,無非編寫一些java代碼,然後打包成war包或者jar包,通過tomcat部署或者java -jar命令,然後就跑起來了。class文件,然後通過java -jar啟動一個jvm進程,將這些class字節碼加載到我們的jvm內存中,然後就運行起來了。
  • JVM之java程序運行原理分析
    原文連結:https://juejin.im/post/6864191363643260936概述本文是JVM入門教程的第一篇。在這篇博客中,將介紹JVM的基本結構和相關的概念,並通過一個簡單的示例,演示java程序的運行過程。
  • jdk1.8 jvm的內存分配
    可見也不是無限制的,需要配置參數。在本機上該參數的默認值為4294967295B(大約4096MB)。在本機上該參數的默認值為5452592B(大約為5MB)。在本機上該參數的默認值為340784B(大約330KB為)。
  • Java性能調優:JVM性能監控常用方法
    首先分析資源概況中各個參數的含義,再來分析下進程信息中各個參數含義。當未指定hostid時,默認查看本機jvm進程,否者查看指定的hostid機器上的jvm進程,此時hostid所指機器必須開啟jstatd服務。
  • 程式設計師:深入理解JVM,從JVM層面來講Java多態
    由此可見,可變參數方法的重載優先級是最低的。這時候參數『a』被當做數組,還可以選擇int類型、Character、Object類型等的可變參數重載來重新演示。我們使用javap -c DynamicDispatch.class 命令輸出這段代碼的字節碼:Compiled from "DynamicDispatch.java"public class jvm.DynamicDispatch {public jvm.DynamicDispatch
  • Java堆和棧的區別和介紹以及JVM的堆和棧
    由JVM動態分配內存空間。一個jvm只有一個堆內存,線程是可以共享數據的。棧:主要用於儲存局部變量和對象的引用變量,每個線程都有有一個獨立的棧空間,所以線程之間不共享數據的。在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧空間中分配。
  • JVM:可視化 JVM 故障處理工具
    ) at java.base/java.lang.Runtime.load0(Runtime.java:767) at java.base/java.lang.System.load(System.java:1831) at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.
  • 《深入理解Java虛擬機》:垃圾收集器與內存分配策略
    判斷「無用的類」,一般需要同時滿足以下3個條件:該類所有的實例都已經被回收,也就是java堆內存不存在該類的任何實例;加載該類的ClassLoader已經被回收;該類對應的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。
  • k8s pod自動重啟原因(jvm內存設置)
    由於製作的鏡像未對JVM的內存進行配置,那麼 JVM 會默認設置堆棧的大小,這個大小是根據物理機的內存進行分配的。 那麼物理機的內存越大,默認分配的內存就越大(最大堆棧=1/4 * 物理機內存,初始堆棧=1/64 * 物理機內存)。JVM 是不知道自己在Docker容器中運行的,jvm識別的是物理主機的內存,而不是k8s給pod分配的內存或docker容器的內存。
  • JVM中十種內存溢出的解決方法
    導言:對於java程式設計師來說,在虛擬機自動內存管理機制的幫助下,不需要自己實現釋放內存,不容易出現內存洩漏和內存溢出的問題,由虛擬機管理內存這一切看起來非常美好,但是一旦出現內存溢出或者內存洩漏的問題,對於不熟悉jvm虛擬機是怎麼使用內存的話,那麼排查錯誤將會是一項非常艱巨的任務。所以在了解內存溢出之前先要搞明白JVM的內存模型。
  • JVM概述與字節碼
    JVM指令集JVM的指令集目前的官網文檔在:https://docs.oracle.com/javase/specs/jvms/se12/html/jvms-6.htmlJAVA 指令集目前有2百條左右指令(8bit,總數不會超過255個),如果按物理的CPU指令劃分,也算是複雜指令集了。
  • jvm參數 -Xms -Xmx -Xmn -Xss調優,及具體實戰垃圾回收機制的配置
    jvm參數 -Xms -Xmx -Xmn -Xss調優01java自帶分析工具通過java自帶分析工具如果live子參數加上後,只統計活的對象數量。-permstat 列印classload和jvm heap長久層的信息,包含每個classloader的名字、活潑性、地址、父classloader和加載的class數量。另外,內部String的數量和佔用內存數也會列印出來。-F 強迫。在pid沒有相應的時候,使用-dump或者-histo參數。在這個模式下,live子參數無效。
  • 大廠面試系列(一)::JVM基礎
    jvm內存模型,內存屏障對象一定分配在堆棧對象不一定分配在堆上,JIT可以實現棧上分配Java線程模型和jvm線程模型區分Java堆的內存結構? 在什麼地方會發生OOM? 如何分析OOM發生的原因?survivor區作用jvm中一次完整的GC流程(從ygc到fgc)是怎樣的,重點講講對象如何晉升到老年代,幾種主要的jvm參數等 你知道哪幾種垃圾收集器,各自的優缺點,重點講下CMS 新生代垃圾收集是否會停頓 ,cms是否會停頓,在什麼時候停頓講講 GC,清除,整理,交換(survivor 區域),CMS 執行的過程