內存結構
jvm內存結構
方法區(Method Area):
虛擬機棧(VM Stack):
一個線程一個棧,一個方法一個棧幀。
本地方法(Native Method Stack):
堆(Heap):
程序計算器(Program Counter Register):
堆內存
堆內存結構
堆內存包括新生代(new)和老年代(old)
新生代分一個eden和兩個survivor(幸存者)
老年代分tenured
垃圾對象
什么是垃圾對象?
如何確定垃圾對象?
引用計數:存在有循環引用的問題。
正向可達:從roots對象計算可以到達的對象。
垃圾收集算法
Mark-Sweep標記清除
標記清除
問題:碎片化
Copying復制
Copying復制
問題:浪費內存
新生代應該比較多。survivor兩個之間相互copy
Mark-Compact標記壓縮
Mark-Compact標記壓縮
問題:效率比copy略低
老年代應用比較多。
新生代(new):存活對象少,使用copying算法,占用內存空間也不大,效率高。
老年代(old):垃圾少,一般使用mark-copact。
垃圾收集器
- Serial Collector(串行垃圾回收器)
- 單線程
- -XX:+UseSerialGC
- Parallel Collector(并行垃圾回收器)
- 多線程,并發量大,不過每次垃圾收集,jvm要暫停
- -XX:UseParallelGC
- CMS Collector(并發垃圾回收器)
- XX:+USeParNewGC
- 多線程,并發量大,GC線程和應用線程都在運行
- G1(垃圾回收器)
- 不僅停頓短,同時并發量大
- –XX:+UseG1GC
jvm參數
1、-:標準參數,所有jvm都應該支持
2、-X:非標準,每個jvm實現都不同
3、-XX:不穩定參數,下一個版本可能會取消
java對象的分配
- 棧上分配
- 線程私有小對象
- 無逃逸
- 支持標量替換
- 無需調整
- 線程本地分配TLAB(Thread Local Allcation Buffer)
- 占用eden、默認1%
- 多線程的時候不用競爭eden就可以申請空間,提高效率
- 小對象
- 無需調整
- 老年代
- 大對象
- eden
jvm調優
- 線程大小(棧內存大小)
設置:Xss:128
棧內存越大,棧幀數量就越多,方法調用就越深,但線程并發量就少
棧內存越小,棧幀數量就越少,方法調用就越淺,但線程并發量就多
持久加壓,測峰值
jmx
使用工具
visualvm:java內存監控;
jvisualvm.exe:java自動工具,bin目錄下。
apache-jmeter:請求模擬工具。