JVM

內存結構

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。

垃圾收集器

  1. Serial Collector(串行垃圾回收器)
    1. 單線程
    2. -XX:+UseSerialGC
  2. Parallel Collector(并行垃圾回收器)
    1. 多線程,并發量大,不過每次垃圾收集,jvm要暫停
    2. -XX:UseParallelGC
  3. CMS Collector(并發垃圾回收器)
    1. XX:+USeParNewGC
    2. 多線程,并發量大,GC線程和應用線程都在運行
  4. G1(垃圾回收器)
    1. 不僅停頓短,同時并發量大
    2. –XX:+UseG1GC

jvm參數

1、-:標準參數,所有jvm都應該支持
2、-X:非標準,每個jvm實現都不同
3、-XX:不穩定參數,下一個版本可能會取消

java對象的分配

  1. 棧上分配
    1. 線程私有小對象
    2. 無逃逸
    3. 支持標量替換
    4. 無需調整
  2. 線程本地分配TLAB(Thread Local Allcation Buffer)
    1. 占用eden、默認1%
    2. 多線程的時候不用競爭eden就可以申請空間,提高效率
    3. 小對象
    4. 無需調整
  3. 老年代
    1. 大對象
  4. eden

jvm調優

  1. 線程大小(棧內存大小)
    設置:Xss:128
    棧內存越大,棧幀數量就越多,方法調用就越深,但線程并發量就少
    棧內存越小,棧幀數量就越少,方法調用就越淺,但線程并發量就多

持久加壓,測峰值

jmx

使用工具

visualvm:java內存監控;
jvisualvm.exe:java自動工具,bin目錄下。

apache-jmeter:請求模擬工具。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.一些概念 1.1.數據類型 Java虛擬機中,數據類型可以分為兩類:基本類型和引用類型。基本類型的變量保存原始...
    落落落落大大方方閱讀 4,576評論 4 86
  • Java 虛擬機有自己完善的硬件架構, 如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,706評論 0 10
  • JVM架構 當一個程序啟動之前,它的class會被類裝載器裝入方法區(Permanent區),執行引擎讀取方法區的...
    cocohaifang閱讀 1,700評論 0 7
  • 轉載blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile閱讀 5,402評論 1 56
  • 原文閱讀 前言 這段時間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊,這博客我...
    碼農戲碼閱讀 6,020評論 2 31