2024年后跳槽必备JVM超神之路知识点,都给你整理好了

最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

三、GC垃圾回收

========

1、GC是什么?为什么要GC

2、你能保证GC执行吗?

3、对象的引用类型有哪几种,分别介绍下

4、垃圾收集算法有哪些

5、为什么要分代

6、分代垃圾回收是怎么工作的

7、垃圾回收器有哪些

8、详细介绍一下 CMS 垃圾回收器?

9、详细介绍一下 G1 垃圾回收器?

10、GC日志分析

11、Minor GC与Full GC分别在什么时候发生

12、新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?

13、栈上分配是什么意思

14、简述下对象的分配规则

四、实战调优

======

1、你在项目中都使用了哪些参数打印GC?

2、常用的调优工具有哪些?

3、如果有一个系统,内存一直消耗不超过10%,但是观察GC日志,发现FGC总是频繁产生,会是什么引起的?

4、线上一个系统跑一段时间就栈溢出了,怎么办 ?

5、系统CPU经常100%,如何调优?

6、系统内存飙高,如何查找问题?

7、大型项目如何进行性能瓶颈调优

8、你实际遇到调优的场景

GC常用参数

Parallel常用参数

CMS常用参数

G1常用参数

JVM超神之路:年后跳槽需要的JVM知识点,都给你整理好了

四、实战调优

======

1、你在项目中都使用了哪些参数打印GC?

====================

具体的参数名称记不清楚了,但是我一般在项目中输出详细的 GC 日志,并加上可读性强的 GC 日志的时间戳。特别情况下我还会追加一些反映对象晋升情况和堆详细信息的日志,这些会单独打到gc.log文件中用来排查问题。另外,OOM 时自动 Dump 堆栈,我一般也会进行配置。

2、常用的调优工具有哪些?

=============

JDK内置的命令行:jps(查看jvm进程信息)、jstat(监视jvm运行状态的,比如gc情况、jvm内存情况、类加载情况等)、jinfo(查看jvm参数的,也可动态调整)、jmap(生成dump文件的,在dump的时候会影响线上服务)、jhat(分析dump的,但是一般都将dump导出放到mat上分析)、jstack(查看线程的)。

JDK内置的可视化界面:JConsole、VisualVM,这两个在QA环境压测的时候很有用。

阿里巴巴开源的arthas:神器,线上调优很方便,安装和显示效果都很友好。

3、如果有一个系统,内存一直消耗不超过10%,但是观察GC日志,发现FGC总是频繁产生,会是什么引起的?

====================================================

检查下系统是否存在System.gc() ;

4、线上一个系统跑一段时间就栈溢出了,怎么办 ?

========================

1.首先检查下是否有死归这种无限递归的程序或者递归方法太多

2.可以看下栈大小,若太小则可以指定-Xss参数设置栈大小

5、系统CPU经常100%,如何调优?

===================

CPU100%,那肯定是有线程一直在占用着系统资源,所以具体方法如下:

  1. 找出哪个进程cpu占用高(top命令)

  2. 该进程中的哪个线程cpu占用高(top -Hp $pid命令)

  3. 将十进制的tid转化为十六进制(printf %x $tid命令)

  4. 导出该线程的堆栈 (jstack p i d > pid > pid>pid.log命令)

  5. 查找哪个方法(栈帧)消耗时间 (less $pid.log)

  6. 可以确认工作线程占比高还是垃圾回收线程占比高

  7. 修改代码

6、系统内存飙高,如何查找问题?

================

  1. 找出哪个进程内存占用高(top命令)

  2. 查看jvm进程号(jps命令)

  3. 导出堆内存 (jmap命令生成dump文件,注意:线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿,所以操作前最好先从负载均衡里摘掉。)

  4. 分析dump文件 (比如mat软件)

7、大型项目如何进行性能瓶颈调优

================

1.数据库与SQL优化:一般dba负责数据库优化,比如集群主从等。研发负责SQL优化,比如索引、分库分表等。

2.集群优化:一般OP负责,让整个集群可以很容易的水平扩容,再比如tomcat/nginx的一些配置优化等。

3.硬件升级:选择最合适的硬件,充分利用资源。

4.代码优化:很多细节,可以参照阿里巴巴规范手册和安装sonar插件这种检测代码质量的工具。也可以适当的运用并行,比如CountDownLatch等工具。

5.jvm优化:内存区域大小设置、对象年龄达到次数晋升老年代参数的调整、选择合适的垃圾收集器以及合适的垃圾收集器参数、打印详细的GC日志和oom的时候自动生成dump。

6.操作系统优化

8、你实际遇到调优的场景

============

我们之前都是采取zipkin做分布式链路追踪,后来换成了skywalking,所以将zipkin相关配置和代码都移除了,但是忘记移除maven坐标了,运行一段时间后导致了频繁full gc ,最后oom了。

因为配置了oom后自动生成dump文件,所以分析dump文件发现大对象是zipkin包里的ConcurrentHashMap$Node,通过观察zipkin的自动配置类ZipkinAutoConfiguration发现即使没有任何zipkin的配置,只要有zipkin的依赖都会创建一个异步报告者,默认的采样率是10%,所以即使不配置相关配置项,也会以默认采样率10%,发送到zipkin,这是默认的地址是http://localhost:9411/,此时发送到localhost:9411显然会连接拒绝。导致度量中的异常实例堆积,从而OOM。

private float probability = 0.1f;

@ConfigurationProperties(“spring.zipkin”)

public class ZipkinProperties {

private String baseUrl = “http://localhost:9411/”;

}

附录

==

GC常用参数

======

  • -Xmn:年轻代

  • -Xms:最小堆

  • -Xmx :最大堆

  • -Xss:栈空间

  • -XX:+UseTLAB:使用TLAB,默认打开

  • -XX:+PrintTLAB:打印TLAB的使用情况

  • -XX:TLABSize:设置TLAB大小

  • -XX:+DisableExplictGC:禁用System.gc()不管用 ,防止FGC

  • -XX:+PrintGC:打印GC日志

  • -XX:+PrintGCDetails:打印GC详细日志信息

  • -XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息

  • -XX:+PrintGCTimeStamps:打印时间戳

  • -XX:+PrintGCApplicationConcurrentTime:打印应用程序时间

  • -XX:+PrintGCApplicationStoppedTime:打印暂停时长

  • -XX:+PrintReferenceGC:记录回收了多少种不同引用类型的引用

  • -verbose:class:类加载详细过程

  • -XX:+PrintVMOptions:jvm参数

  • -XX:+PrintFlagsFinal:-XX:+PrintFlagsInitial 必须会用

  • -Xloggc:opt/log/gc.log:gc日志的路径以及文件名称

  • -XX:MaxTenuringThreshold:升代年龄,最大值15

Parallel常用参数

============

  • -XX:SurvivorRatio:年轻代中eden和from/to的比值。比如设置3就是eden:survivor=3:2,也就是from和to各占1,eden占用3

  • -XX:PreTenureSizeThreshold:大对象到底多大

  • -XX:MaxTenuringThreshold:升代年龄,最大值15

  • -XX:+ParallelGCThreads:并行收集器的线程数,同样适用于CMS,一般设为和CPU核数相同

  • -XX:+UseAdaptiveSizePolicy:自动选择各区大小比例

CMS常用参数

=======

  • -XX:+UseConcMarkSweepGC:设置年老代为并发收集

  • -XX:ParallelCMSThreads:CMS线程数量

  • -XX:CMSInitiatingOccupancyFraction:使用多少比例的老年代后开始CMS收集,默认是68%(近似值),如果频繁发生SerialOld卡顿,应该调小,(频繁CMS回收)

  • -XX:+UseCMSCompactAtFullCollection:在FGC时进行压缩

  • -XX:CMSFullGCsBeforeCompaction:多少次FGC之后进行压缩

  • -XX:+CMSClassUnloadingEnabled:年老代启用CMS,但默认是不会回收永久代(Perm)的。此处对Perm区启用类回收,防止Perm区内存满。

  • -XX:CMSInitiatingPermOccupancyFraction:达到什么比例时进行Perm回收

  • GCTimeRatio:设置GC时间占用程序运行时间的百分比

  • -XX:MaxGCPauseMillis:停顿时间,是一个建议时间,GC会尝试用各种手段达到这个时间,比如减小年轻代

总结

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

大厂面试场景

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

知识点总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

[外链图片转存中…(img-YU7ZEkOd-1715773667676)]

大厂面试场景

[外链图片转存中…(img-GImz2XOW-1715773667677)]

知识点总结

[外链图片转存中…(img-ToOoAecp-1715773667677)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值