初识JVM

222 阅读4分钟

java相关内置命令

终端命令工具

Screenshot 2021-08-02 at 12.01.40 PM.png

  • javap:可以用来检查编译后文件时是否包含某部分
  • jstat:堆内内存大小和gc分析,jstat-csdn
  • jcmd: 堆分析、堆外内存分析, jcmd-cnblog
  • jinfo: 查看修改 Java进程的信息,如系统参数,jvm参数. jinfo -flag [+|-]flag_name pid 如: jinfo -opts
  • jmap: 查看堆内情况 如:jmap -histo pid
  • jhsdb(>=java9):分析与崩溃的JVM相关的核心信息
  • jhat:html页面显示堆内存情况分析结果
  • jps:查看java进程
  • jstack:分析进程栈数据

jvm参数命令

-xmx   // -xmx5g, 最大内存
-xms   //最小内存
-xmn   //新生代内存大小,默认推荐新/老比例:3/8, 等同MaxNewSize = NewSize
-XX:MaxNewSize=715653120
-XX:NewSize=89128960
-XX:InitialHeapSize=268435456
-XX:MaxHeapSize=2147483648

-XX:OldSize=179306496
-xss   //线程堆栈大小, 操作系统对一个进程内的线程数还是有限制的,经验值在3000~5000左右(来源网络)
-XX:NewRatio=4.                   // 新生代/老生代=1/4
-XX:SurvivorRatio=4               // eden/survivor=1/4
-XX:MaxTenuringThreshold=0        // 进入老生代需经历gc的次数


-XX:CICompilerCount=3
-XX:MinHeapDeltaBytes=524288

-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops

并行回收器回收参数
-XX:+UseParallelGC  //表示新生代使用 parallel scavenge, 老生代 parallel old
-XX:ParallelGCThreads=20

-XX:+UseParallelOldGC
-XX:+UseParNew


并发回收器参数
-XX:+UseConcMarkSweepGC  //针对老生带
-XX:+UseParNewGC         //针对新生代

通过 + 或者 - 在运行不停机状态下修改相关jvm参数

内存模型

20180711221632221.jpeg

自java 1.8后方法区移动至元数据区,为堆外内存。

20180711224752470.png

堆模型

  • 新生代: 分eden、survivor1、survivor2
  • 老生代
  • 元数据区: 包含方法区,存储类信息、常量、静态变量、常量池

垃圾回收

回收原理

  • 引用技术法
  • 根搜索法--可达性分析
java中可作为GC Root的对象有

  1.虚拟机栈中引用的对象(本地变量表)

  2.方法区中静态属性引用的对象

  3. 方法区中常量引用的对象

  4.本地方法栈中引用的对象(Native对象)

回收触发机制

  • 新生代满或定时触发 Minor GC
  • 老生代满后触发 Full GC

回收算法

  • 标记复制:eden区到s区
  • 标记清除:s区到老年代
  • 标记整理:老年代

回收器类型

Reference: jvm_cnblogsgc_csdn

  • 串行收集器:SerOld, SerNew
  • 并行收集器: 优先吞吐量, 如:ParallelGC, ParNew
  • 并发收集器:优先响应时间, 如:CMS

1. Serial收集器(复制算法)

    新生代单线程收集器,标记和清理都是单线程,优点是简单高效。

2. Serial Old收集器(标记-整理算法

    老年代单线程收集器,Serial收集器的老年代版本。

3. ParNew收集器(停止-复制算法)

    新生代收集器,可以认为是Serial收集器的多线程版本,
        在多核CPU环境下有着比Serial更好的表现。

4. Parallel Scavenge收集器(停止-复制算法)

    新生代并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/
        (用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。

5. Parallel Old收集器(停止-复制算法)

      Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先

6. CMS(Concurrent Mark Sweep)收集器(标记-清理算法)

    老年代垃圾收集器,大部分并发MS,无整理,利用freelist记录被回收地址;
    默认新生代为ParNew,STW标记复制. 高并发、低停顿,追求最短GC回收停顿时间cpu占用比较高,
       响应时间快,停顿时间短,多核cpu 追求高响应时间的选择
  
7. G1
    相比cms,提供内存整理功能,减少内存碎片。注重高吞吐量,gc回收时间可控。
    G1提供了两种GC模式,Young GC和Mixed GC,两种都是完全Stop The World的

8. ZGC
    jdk11推出,适用大内存、低延迟的java应用。支持8M~4T.

参考: cnblog-cms美团-g1美团-zgc

性能优化

参考 程序新视界-jvm性能调优

性能分析数据记录

    -XX:+HeapDumpOnOutOfMemoryError //错误时转存堆内存问题

性能分析工具

  • jmap + hprof
  • jmap + jhat
  • VisualVM: Idea有插件,运行时分析