面试实战题-JVM调优

JVM

可达性分析

在Java中,可作为GC Root的对象包括以下几种:

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

● 方法区中类静态属性引用的对象

● 方法区中常量引用的对象

● 本地方法栈中JNI(即一般说的Native方法)引用的对象

可达性算法、Java引用 详解 - 简书

内存模型,程序计数器的作用

1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。

程序计数器的作用:

1、字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。

2、在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。 

JVM学习笔记-JVM内存模型

MetaSpace介绍

在永久代移除后,字符串常量池也不再放在永久代了,但是也没有放到新的方法区---元空间里,而是留在了堆里(为了方便回收)。运行时常量池随着搬家到了元空间里,毕竟它是装类的重要等信息的,有它的地方才称得上是方法区。

https://segmentfault.com/a/1190000012577387

https://www.cnblogs.com/shen-qian/p/11277085.html 

类加载机制和过程

加载 链 接(验证准备解析) 初始化

某个特定的类加载器接收到类加载的请求时,会将加载任务委托给自己的父类,直到最高级父类引导类加载器(bootstrap class loader),如果父类能够加载就加载,不能加载则返回到子类进行加载。如果都不能加载则报错。ClassNotFoundException

【Java基础】类加载过程 - 简书

怎么判断一个类应该被哪个类加载器加载

TODO

https://www.cnblogs.com/KingIceMou/p/7208336.html

垃圾回收

回收死亡对象的内存共有三种方式,分别为:会造成内存碎片的清除、性能开销较大的压缩、以及堆使用效率较低的复制。

JVM | 垃圾回收(上)

https://mp.weixin.qq.com/s?__biz=MzU0NTczODMwMw==&mid=2247484164&idx=3&sn=911113846115de7c8d01222896adb259&chksm=fb691854cc1e914298648d08d8ab5fa6754c8f2716eea3a0b9b7ec7be6769d856feec5bc339e&token=1282690993&lang=zh_CN#rd

垃圾收集器

G1的内存模型

G1垃圾收集器没有新生代和老年代的概念了,而是将堆划分为一块块独立的Region。当要进行垃圾收集时,首先估计每个Region中的垃圾数量,每次都从垃圾回收价值最大的Region开始回收,因此可以获得最大的回收效率。

ParNew收集器追求降低用户线程的停顿时间,因此适合交互式应用;而Parallel Scavenge追求CPU吞吐量,能够在较短的时间内完成指定任务,因此适合没有交互的后台计算。

Serial收集器适合所需内存较小的客户端应用。

Serial Old收集器是Serial的老年代版本,它们都是单线程收集器,也就是垃圾收集时只启动一条GC线程,因此都适合客户端应用。

Parallel Old收集器是Parallel Scavenge的老年代版本,一般它们搭配使用,追求CPU吞吐量。 

CMS收集器是一款追求停顿时间的老年代收集器,它在垃圾收集时使得用户线程和GC线程并行执行,因此在垃圾收集过程中用户也不会感受到明显的卡顿。但用户线程和GC线程之间不停地切换会有额外的开销,因此垃圾回收总时间就会被延长。

https://mp.weixin.qq.com/s?__biz=MzU0NTczODMwMw==&mid=2247483746&idx=1&sn=bd7878044b2b711646837265b9919988&chksm=fb691a32cc1e9324407653084ca8327f3ced3a74293c5fdbcdd62901b4c4122b99df8b4fe2ff&token=1282690993&lang=zh_CN#rd 

对象在堆里存储的结构

对象头、实际数据、对齐填充

https://www.cnblogs.com/james111/p/7273953.html

性能调优

服务器响应变慢排查步骤

线上服务运行时间长变慢问题的分析定位_服务时间长-CSDN博客

CPU飙升排查步骤

cpu占用过高排查思路

2. top 查看占用cpu的进程 pid

4. top -Hp pid 查看进程中占用cpu过高的线程id  tid

6. printf '%x/n' tid 转化为十六进制

8. jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位

jvm old区占用过高排查思路

2. top查看占用cpu高的进程

4. jstat -gcutil pid 时间间隔 查看gc状况

6. jmap -dump:format=b,file=name.dump pid  导出dump文件

8. 用visualVM分析dump文件

https://mp.weixin.qq.com/s?__biz=MzU1MzUzODM2NQ%3D%3D&mid=2247483824&idx=1&sn=25718af824474cf19ded821463a351bf&scene=45#wechat_redirect 

https://mp.weixin.qq.com/s?__biz=MzA5NDg3MjAwMQ%3D%3D&mid=2457102720&idx=1&sn=c89686c389d3372c044278143405e6ef&scene=45#wechat_redirect 

垃圾回收调优

垃圾收集器的种类很多,我们可以将其分成两种类型,一种是响应速度快,一种是吞吐量高。通常情况下,CMS 和 G1 回收器的响应速度快,Parallel Scavenge 回收器的吞吐量高。

23 | 如何优化垃圾回收机制?-Java性能调优实战-极客时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值