java相关内置命令
终端命令工具
- 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参数
内存模型
自java 1.8后方法区移动至元数据区,为堆外内存。
堆模型
- 新生代: 分eden、survivor1、survivor2
- 老生代
- 元数据区: 包含方法区,存储类信息、常量、静态变量、常量池
垃圾回收
回收原理
- 引用技术法
- 根搜索法--可达性分析
java中可作为GC Root的对象有
1.虚拟机栈中引用的对象(本地变量表)
2.方法区中静态属性引用的对象
3. 方法区中常量引用的对象
4.本地方法栈中引用的对象(Native对象)
回收触发机制
- 新生代满或定时触发 Minor GC
- 老生代满后触发 Full GC
回收算法
- 标记复制:eden区到s区
- 标记清除:s区到老年代
- 标记整理:老年代
回收器类型
Reference: jvm_cnblogs、gc_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、
性能优化
性能分析数据记录
-XX:+HeapDumpOnOutOfMemoryError //错误时转存堆内存问题
性能分析工具
- jmap + hprof
- jmap + jhat
- VisualVM: Idea有插件,运行时分析