java virtual machine. sandbox
本地方法棧 java
程序計數器linux
棧區:push/pop web
堆區:爲線程共享,內放對象和數組, windows
方法區:爲線程共享數組
線程:是進程內併發執行的代碼段, 一個線程就是一棧,棧內壓入的方法幀併發
綠色的共享的jvm
dynamic link library,動態連接庫 函數庫 + 資源.
shared object,共享對象
*.java ---> *.class --> ClassLoadermaven
//類類,類的描述符 Class clazz = Person.class ;函數
new Person();工具
Outof memory,內存溢出.
www.StackOverflow.com //解決問題的網址,多去瀏覽
1.Method area 方法區. 存放類描述符. Class只需加載一次。 擴容. maven 共享。 Class.forName(""); 2.heap 堆區. 存放對象和數組的地方。 在全部線程間共享 3.java stack 每一個線程對應一個棧。 每一個進程至少有個一個線程(主線程). method frame(stack frame). 4.native method stack native方法。 5.program conter register
略.
java內存由堆和非堆合成
heap : 存放對象和數組 一、(yong generation):年輕代 eden:伊甸區:對象建立所在,垃圾回收先去該區回收; survivor-1(倖存1區):同一時刻和倖存2區只有一個是空的 survivor-2(倖存2區): 二、(old generation):年老代 non-heap: 非堆 (metaspace+code cache+compressed class space),方法區屬於該部分 off-heap: 離堆:jvm以外的內存(unsafe)
可經過jvisualvm來查看這些分區
1.cmd>jvisualvm 2.安裝visualgc的插件 工具菜單 --> 插件 -> visual gc ->安裝.
1.查看堆信息 jmap -heap 19524 2.查看永久區 jmap -permstat 19524 3.查看類加載信息 jmap -clstats 19524
-Xms //堆初始值 1/64( < 1G) -Xmx //堆最大值 1/4 ( < 1G) -Xmn //年輕代(eden + s0 + s1),-Xmn150M -XX:NewSize //for 1.3/1.4/1.8,設置年輕帶大小 //-XX:NewSize=150m //優先級 > NewRatio. -XX:MaxNewSize //for 1.3/1.4/1.8,設置年輕帶大小最大值 -XX:PermSize //設置永久代值,1.8移除了該屬性 //-XX:PermSize=150m -XX:MaxPermSize //設置永久代值最大值 //-XX:MaxPermSize=150m -XX:MetaspaceSize=2048m -XX:MaxMetaspaceSize=2048m -XX:CompressedClassSpaceSize=2048m //***** 設置1.8的meta區 ***** -Xss //棧空間 -XX:NewRatio //年輕代和年老代的比例,-XX:NewRation=n, //表明 年輕代 : 年老代 = 1 : n //-XX:NewRatio=2 //-XX:NewRatio=0.5,錯誤的,不能指定小數。 -XX:SurvivorRatio //設置,單個倖存區 : 伊甸區 = 1 : n //-XX:SurvivorRatio=2,
堆設置
-Xms :初始堆大小
-Xmx :最大堆大小
-XX:NewSize=n :設置年輕代大小
-XX:NewRatio=n: 設置年輕代和年老代的比值。如:爲3,表示年輕代與年老代比值爲1:3,年輕代佔整個年輕代年老代和的1/4
-XX:SurvivorRatio=n :年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區佔整個年輕代的1/5
-XX:MaxPermSize=n :設置持久代大小
收集器設置
-XX:+UseSerialGC :設置串行收集器
-XX:+UseParallelGC :設置並行收集器
-XX:+UseParalledlOldGC :設置並行年老代收集器
-XX:+UseConcMarkSweepGC :設置併發收集器
垃圾回收統計信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
並行收集器設置
-XX:ParallelGCThreads=n :設置並行收集器收集時使用的CPU數。並行收集線程數。
-XX:MaxGCPauseMillis=n :設置並行收集最大暫停時間
-XX:GCTimeRatio=n :設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)
併發收集器設置
-XX:+CMSIncrementalMode :設置爲增量模式。適用於單CPU狀況。
-XX:ParallelGCThreads=n :設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數。
old : 133.5M young : 8 + 8 + 50.5 = 66.5M young : old = 1 : 2 // eden : survivor = 3 : 1 //
1.轉換類名到location,定位class文件。 2.類加載方法:經過-cp拿到路徑,經過解析出的類映射到層次結構,找到字節碼文件,加載進去
3.
x instanceof Person ; //模糊判斷. getClass() == Person.class ; //精準判斷
動態訪問對象的屬性和方法。 Person p = new Person(); p.setName("xxx"); p.getName(); 1.Class 類的描述符. 描述類的特徵。 Person.class ; Class clazz = Class.forName(); Class clazz = Xxx.class() Class clazz = obj.getClass(); //經過Class動態建立對象 Class clazz=Class.forName("xxxx"); Object obj=clazz.new Instance(); 2.Method 方法. 方法描述符。 //獲得類中聲明的方法(private + public + protected) Method m = clazz.getDeclaredMethod("name",String.class); //獲得所可用的方法(繼承的方法)· Method m = clazz.getMethod("name",...); //把私有方法定義爲可用 m.setAccessible(true); 3.Field 字段。 字段描述符. Field f = clazz.getField("name"); Field f = clazz.getDeclaredField("name"); f.setAccessible(); 4.Constructor 構造函數描述符. clazz.getConstructor(Class...)