百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

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

off999 2025-03-07 22:59 24 浏览 0 评论

一、ClassLoader类加载器

1、类加载过程

2、类加载器种类以及加载范围

3、双亲委派是什么

4、为啥要有双亲委派

5、为什么需要破坏双亲委派模型

6、如何破坏双亲委派模型

7、如何自定义一个类加载器

8、热部署原理

9、常见笔试题

二、Java内存区域

1、Java内存结构

2、对象创建时堆内存分配算法

3、对象在内存中的存储布局

4、对象怎么定位

5、判断对象是否能被回收的算法

6、如何判断对象是否能被回收

7、Java堆内存组成部分

8、什么时候抛出StackOverflowError

9、Java中会存在内存泄漏吗,请简单描述。

10、栈帧是什么?包含哪些东西

11、简述一个方法的执行流程

12、方法区会被回收吗

13、一个对象包含多少个字节

14、为什么把堆栈分成两个

15、栈的起始点是哪

16、为什么基本类型不放在堆里

17、Java参数传递是值传递还是引用传递

18、为什么不推荐递归

19、为什么参数大于2个要放到对象里

20、常见笔试题

三、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常用参数

四、实战调优

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 $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会尝试用各种手段达到这个时间,比如减小年轻代

G1常用参数

  • -XX:+UseG1GC:开启G1
  • -XX:MaxGCPauseMillis:建议值,G1会尝试调整Young区的块数来达到这个值
  • -XX:GCPauseIntervalMillis:GC的间隔时间
  • -XX:+G1HeapRegionSize:分区大小,建议逐渐增大该值,1 2 4 8 16 32。随着size增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长 ZGC做了改进(动态区块大小)
  • G1NewSizePercent:新生代最小比例,默认为5%
  • G1MaxNewSizePercent:新生代最大比例,默认为60%
  • GCTimeRatio:GC时间建议比例,G1会根据这个值调整堆空间
  • ConcGCThreads:线程数量
  • InitiatingHeapOccupancyPercent:启动G1的堆空间占用比例

文末福利:

2021最新完整面试题及答案(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等, 需要获取这些内容的朋友私信我: Java 即可。

相关推荐

win7右键没有个性化(win7系统右键没有个性化)
win7右键没有个性化(win7系统右键没有个性化)

如果电脑右键没有出现个性化和属性选项,可能是系统出现了错误或者个人设置问题。解决方法如下:首先检查计算机中是否安装有系统文件,如果文件丢失或被删除,则需要重新安装系统文件;其次,可以尝试恢复系统默认配置,去掉不必要的自定义设置;最后,如果上...

2025-12-25 08:03 off999

ie11官方下载(ie11官方免费下载)

1/9点击左下窗户小图标。2/9点击齿轮设置图标。3/9点击【应用】。4/9点击【应用和功能】。5/9点击【程序和功能】6/9点击【启动或关闭windows功能】。7/9ie11没有勾选。8/9点击勾...

东芝笔记本怎么进入bios(东芝笔记本怎么进入语言界面)

以下是一些通用的方法:1.重启或开机时,按下F2键进入BIOS设置界面。在某些笔记本上,您需要按住Fn键才能按F2键。2.重启或开机时,同时按下Ctrl+Alt+Del键,然后立即按F2键...

window10家庭版下载(window10家庭版下载地址)

家庭版用户可通过以下步骤下载AutoCAD2020:访问Autodesk官方网站(autodesk.com)并创建或登录您的Autodesk帐户。导航到AutoCAD2020...

超级吞噬系统txt(超级吞噬系统txt完整版下载)

男主从未推倒柳儿,一直把柳儿当妹妹,出去历练升级从未带着她,后面男主把她安置好后,作者就再没写过她。两人一直分开。吞噬星空的九大超级势力有六大巅峰种族,人族,虫族,机械族,妖族,晶族,狱族,还有另外三...

dos如何格式化硬盘并分区(怎么在dos下格式化分区工具)

1、方式一:在“开始”搜索框汇总输入“cmd”并回车,2、方式二:单击“开始”——所有程序——附件——命令提示符,3、查看分区数:在DOS界面下输入“wmicdiskdrivegetpartit...

vivo系统升级最新版本(vivo系统升级到什么版本了)

您可以按照以下步骤来更新vivoY5s的操作系统:1.进入设置-系统更新。2.点击“检查更新”,确保您的手机已经连接上WiFi并检测到有可用的更新。3.如果有可用的更新,请按照提示下载并安...

电脑做系统软件排行榜(做电脑系统的软件)

1、360安全卫士是一款由奇虎360公司推出的功能强、效果好、受用户欢迎的安全杀毒软件。360安全卫士拥有查杀木马、清理插件、修复漏洞、电脑体检、电脑救援、保护隐私,电脑专家,清理垃圾,清理痕迹多种功...

win7热点(win7热点无ip分配)

1、点击桌面左下角的开始按钮,在搜索栏输入cmd,右击上方出现的cmd.exe,在弹出菜单中选择以管理员身份运行。2、然后在“命令提示符”里输入“netshwlansethostednetwor...

centos下载安装(centos安装软件教程)

首先要知道您需要下载linux哪个发行版,目前比较流行的是ubuntu,所以以ubuntu为例说明:1、访问ubuntu官方网站www.ubuntu.com2、点击右上角的DownLoad(下载),...

360老版本卫士2014版(360卫士8.7.0)

先打开360官网,下载360软件管家,再从360软件管家里下载360卫士这是明显的中毒表现:1、关闭系统还原;2、重启,按F8,进入安全模式。3、在安全模式里,打开360杀毒。4、全盘查杀。要耐心等待...

iso文件是什么格式(iso是啥格式)

pic是一种图片格式的文件,不过以pic为后缀的图片文件并不多见,所以有很多人都不知道pic是什么以及pic文件应该用什么打开。可以将pic文件修改为jpg文件格式,打开方式如下:1、第一步,首先在电...

8t硬盘安装win7系统(8t硬盘用什么分区)

7-8吨。t就是吨的英文缩写。吨是音译专用字,用于重量单位或船只容积单位。繁体字“吨”由“口”和“顿”字构成,“口”字表示它是音译外来语用字,“顿”字近似地表示其读音。◎质量单位,公制一吨等于100...

cdr格式怎么转换成psd(cdr格式怎么转换成ezd)

CDR文件是CorelDRAW的原始文件格式,而PSD文件是AdobePhotoshop的原始文件格式。因此,要将CDR文件转换为PSD格式,您可以使用以下两种方法:1.打开CorelDRAW并打...

免费p图软件(电脑免费p图软件)
免费p图软件(电脑免费p图软件)

分享几款免费看vip电影电视剧的app,只要在各大播放器上映的电影,在这几款app都可以看到。1、火星影视2、新电影天堂3、呲哩呲哩4、鲨鱼影视这些软件直接可以百度下载,爱奇艺,腾讯视频电脑上有哪些画画的软件好用,要免费的,windows自...

2025-12-25 01:03 off999

取消回复欢迎 发表评论: