熟练掌握
1、垃圾回收算法
标记-清除(产生碎片),复制-清除(浪费空间),标记-整理
2、垃圾回收器
吞吐量PS+PO、互联网B/S后端服务PN+CMS、G1、(ZGC目前较少)
新生代收集器
Serial (复制)单线程
ParNew(复制) 多线程
Parallel Scavenge(复制)多线程
老年代收集器
Serial Old (标记-整理) 单线程
Parallel Old(标记-整理)多线程 -jdk1.6开始
CMS(标记-清除)适用于互联网站或B/S系统的服务端,算法--三色标记(黑白灰)
CMS存在问题
1,浮动垃圾(可通过配置启动阈值,JDK1.5默认68%,JDK1.6默认92%)最后可能触发Serial Old
2,产生碎片,触发Full GC
G1收集器(整体基于:标记-整理,局部:复制) 算法--三色标记(黑白灰)
3、根可达算法
根包含:
(1). 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
(2). 方法区中的类静态属性引用的对象。
(3). 方法区中常量引用的对象。
(4). 本地方法栈中JNI(Native方法)引用的对象。
4、如何解决CPU100%
1,查看占用CPU最高的进程
# 1、查看占用CPU最高的进程pid
top
# 2、查看最高进程下的线程
top -Hp pid
# 3、将线程转换成16进制,得到16进制线程ID
printf "0x%xn\" 线程ID
# 4、查看堆栈信息
jstack <pid> |grep -A 10 <16进制线程ID>
# 5、通过堆栈信息找到代码位置
5、类的加载机制
双亲委派机制,为什么使用双亲委派,为了安全考虑
CMS配置例子
nohup $JAVA_HOME/bin/java $exec_command > $log 2>&1 < /dev/null &
-server
-Xmx16g
-Xms4g
-Xss512k
-XX:+DisableExplicitGC // 禁止代码中手动调用GC,会导致 fullGC
-XX:+UseConcMarkSweepGC // 使用 CMS 收集器
-XX:+CMSParallelRemarkEnabled // 开启了降低标记停顿
-XX:LargePageSizeInBytes=128m // 使用大的内存分页
-XX:+UseFastAccessorMethods // 原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly // 使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 // 当老年代达到70%时,触发CMS垃圾回收
-classpath xxxx:xxxx
$CLASS
有那些方法查看JVM使用的回收器?
jinfo
日志的格式
-Xmn -Xms -Xmx -Xss
年轻代,最小堆,最大堆,栈空间
把xmx和xms设置一致可以让JVM在启动时就直接向OS申请xmx的commited内存,好处是:
1. 避免JVM在运行过程中向OS申请内存
2. 延后启动后首次GC的发生时机
3. 减少启动初期的GC次数
4. 尽可能避免使用swap space