系统性能调优
jvm 基础概念及其工具
类加载机制
类生命周期:
类加载器
可以通过Java.Lang.Class.getClassLoad查看对应的类加载器,查看sun.misc.Launcher.AppClassloader读取Java.class.path配置,指定去加载哪些类资源
类不会重复加载
类卸载 该类的所有实例对象都被gc,加载该类的classloader实例被gc 可以通过verbose:class,来查看加载和卸载的日志
双亲委派模型 为了避免重复加载问题,由上到下逐级查找,由下到上逐级委托,首先不会自己去加载,交给父加载器去加载,若父加载器无法完成加载,子加载器才回去自己尝试加载
垃圾回收机制
自动垃圾收集 查看堆内存,识别正在使用的对象,那些对象未被删除,那些对象被删除但未被使用,c语言是手动释放和分配内存,Java中是由垃圾收集器自动处理
确定需要回收的对象 标记正在使用的对象
- 对象回收 引用计数
- 对象回收 可达性分析
- 方法区回收 类卸载
引用类型和可达性级别
垃圾收集的算法
分代收集
垃圾收集器
- 串行收集器(serial) client 模式下 serial gc serial old
- 并行收集器
- 并发收集器
- 并行收集器
- 并发收集器
jdk内置命令工具
-
javap 用于根据Java字节码文件反编译为源文件
-
jps 查看当前Java进程pid
-
jstat 监视Java虚拟机监控信息
-
jcmd 可以用于替代jps命令
-
jinfo 可以查看运行的jvm全部参数信息,还可以设置部分参数
-
jhat 查看堆信息,以html形式展示,支持对象查询语言qql
-
jmap
-
jstack 堆栈跟踪工具
可视化工具 -
jconsole
-
jvisualvm 支持插件工具
实际环境使用
cpu使用率 100%问题
- 个别线程占用资源过多
top 查看cpu 占用率 (查看汇总信息不是单个进程占用)
top - p pid 查看个别进程
H 查看线程cpu使用率 一般情况都是循环比较大
输出的日志十进制id转换为16进制去查找对应的代码
如果整体服务器资源不足,需要切断系统访问,再去执行上诉步骤
- 死锁(活锁)
响应时间很慢,设定一个间隔时间(与服务器运行情况有关系,假如说运行不会超过4秒,就按4秒时间)
jstack pid > tmp1.log sleep 4s jstack pid > tmp2.log echo “完毕“
两个文件进行比对,找出交集
comm result-1.log result-2.log -1 -2