面试官问你关于JVM性能调优那些事儿,你要怎样优雅回答?

对于工作3年左右的Java程序员来说,在面试大厂的过程中,面试官可能不会太关注你做了多少个项目、你的CRUD水平如何。更多的是关注你对某项技术点的理解深度,所以说,工作3年左右的小伙伴一定要把自己的重心放到技术的深度上来。

今天,我们先一起聊聊关于JVM性能调优的话题,本文的主要结构如下所示。

常见面试题

关于JVM,一道常见的面试题就是:Java中创建的对象是存储在JVM中的哪个区域的?

例如,这里,我们简单的列举一行代码,如下所示。

User user = new User();

关于上面的代码,不少小伙伴都知道,创建出来的User对象是放在JVM中的堆区域的,而User对象的引用是放在栈中的。但如果你只是了解到这种程度,那面试官就会认为你了解的太浅显了,可能就会达不到他们的要求。其实面试官想要了解你是否对JVM有一个更深入的认识。

站在面试官的角度来看这个问题时,回答创建出来的User对象是放在JVM的堆区,也并没有错。但是JVM的堆内存区域又会分为年轻代和老年代,而年轻代又会分为Eden区和Survivor区。JVM堆空间的逻辑结构如下图所示。

而面试官更想了解的是你能不能说出来创建的对象具体是存放在JVM堆空间的哪个区域。

在JVM内部,会将整个堆空间划分成年轻代和老年代,年轻代默认会占整个堆内存空间的1/3,老年代默认会占整个堆内存空间的2/3。年轻代又会划分为Eden区和两个Survivor区,它们之间的默认比例是Eden:Survivor1:Survivor2 = 8:1:1。

如果你能回答出 新创建的User对象是存放在JVM堆空间中年轻代的Eden区,那面试官就会对你刮目相看了。当然,这里没有考虑JVM的逃逸分析情况,关于JVM的逃逸分析,大家可以参考《逃逸分析》一文。

JVM体系结构

JVM主要由三个子系统构成,分别为:类加载器子系统、运行时数据区(内存结构)和字节码执行引擎

关于JVM的体系结构全貌,我们先来看一张图。

当我们开发Java程序时,首先会编写.java文件,之后,会将.java文件编译成.class文件。

JVM中,会通过类装载子系统将.class文件的内容装载到JVM的运行时数据区,而JVM的运行时数据区又会分为:方法区、堆、栈、本地方法栈和程序计数器 几个部分。

在装载class文件的内容时,会将class文件的内容拆分为几个部分,分别装载到JVM运行时数据区的几个部分。其中,值得注意的是:程序计数器的作用是:记录程序执行的下一条指令的地址。

方法区也叫作元空间,主要包含了:运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应的Class实例的引用等信息。

在JVM中,程序的执行是通过执行引擎进行的,执行引擎会调用本地方法的接口来执行本地方法库,进而完成整个程序逻辑的执行。

我们常说的垃圾收集器是包含在执行引擎中的,在程序的运行过程中,执行引擎会开启垃圾收集器,并在后台运行,垃圾收集器会不断监控程序运行过程中产生的内存垃圾信息,并根据相应的策略对垃圾信息进行清理。

这里,大家需要注意的是:栈、本地方法栈和程序计数器是每个线程运行时独占的,而方法区和堆是所有线程共享的。所以,栈、本地方法栈和程序计数器不会涉及线程安全问题,而方法区和堆会涉及线程安全问题。

方法区(元空间)

很多小伙伴一看到方法区三个字,脑海中的第一印象可能是存储方法的地方吧。

实则不然,方法区的另一个名字叫作元空间,相信不少小伙伴或多或少的听说过元空间。这个区域是JDK1.8中划分出来的。主要包含:运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应的Class实例的引用等信息。方法区中的信息能够被多个线程共享。

例如,在程序中声明的常量、静态变量和有关于类的信息等的引用,都会存放在方法区,而这些引用所指向的具体对象 一般都会在堆中开辟单独的空间进行存储,也可能会在直接内存中进行存储

堆中主要存储的是实际创建的对象,也就是会存储通过new关键字创建的对象,堆中的对象能够被多个线程共享。堆中的数据不需要事先明确生存期,可以动态的分配内存,不再使用的数据和对象由JVM中的GC机制自动回收。对JVM的性能调优一般就是对堆内存的调优

Java中基本类型的包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character类型的数据是存储在堆中的。

堆一般会被分成年轻代和老年代。而年轻代又会被进一步分为1个Eden区和2个Survivor区。在内存分配上,如果保持默认配置的话,年轻代和老年代的内存大小比例为1 : 2,年轻代中的1个Eden区和2个Survivor区的内存大小比例为:8 : 1 : 1。

栈一般又叫作线程栈或虚拟机栈,一般存储的是局部变量。在Java中,每个线程都会有一个单独的栈区,每个栈中的元素都是私有的,不会被其他的栈所访问。栈中的数据大小和生存期都是确定的,存取速度比较快。

在Java中,所有的基本数据类型(byte、short、int、long、float、double、boolean、char)和引用变量(对象引用)都是在栈中的。一般情况下,线程退出或者方法退出时,栈中的数据会被自动清除

程序在执行过程中,会在栈中为不同的方法创建不同的栈帧,在栈帧中又包含了:局部变量表、操作数栈、动态链接和方法出口。

关于局部变量表、操作数栈、动态链接和方法出口的具体作用,会在《架构师进阶系列》中的后续文章中详细阐述。

栈中一般会存储对象的引用,这些引用所指向的具体对象一般都会在堆中开辟单独的地址空间进行存储,也有可能存储在直接内存中。

注意:这里说的是这些引用所指向的具体对象一般都会在堆中开辟单独的地址空间进行存储,也有可能存储在直接内存中。

因为在JVM中,如果开启了逃逸分析和标量替换,则可能不会再在堆上创建对象,可能会将对象直接分配到栈上,也可能不再创建对象,而是进一步分解对象中的成员变量,将其直接在栈上分配空间并赋值。

本地方法栈

本地方法栈相对来说比较简单,就是保存native方法进入区域的地址。

例如,在Java中创建线程,调用Thread对象的start()方法时,会通过本地方法start0()调用操作系统创建线程的方法。此时,本地方法栈就会保存start0()方法进入区域的内存地址。

程序计数器

程序计数器也叫作PC计数器,只要存储的是下一条将要执行的命令的地址。

双亲委派机制

何为双亲委派?

JVM中是通过类的双亲委派机制来加载的,那什么是双亲委派机制呢?我们先来看一张图。

当JVM加载某个类的时候,不会直接使用当前类的加载器加载该类,会先委托父加载器寻找要加载的目标类,找不到再委托上层的父加载器进行加载,直到引导类加载器同样找不到要加载的目标类,就会在自己的类加载路径中查找并加载目标类。

简单来说:双亲委派机制就是:先使用父加载器加载,如果父加载器找不到要加载的目标类,就使用子加载器自己加载。

为何使用双亲委派机制?

这里,小伙伴们有没有想过这样一个问题:JVM为何要使用双亲委派机制呢?

为了更好的说明问题,我们自己创建一个java.lang包,并在java.lang包下,创建一个String类,如下所示。

package java.lang;

/**
 * @author binghe
 * @version 1.0.0
 * @description 测试时双亲委派机制
 */
public class String {
    public static void main(String[] args){
        System.out.println("自定义的String类");
    }
}

这里,我们自己创建一个java.lang.String类,而JDK中也存在一个java.lang.String类,如果运行我们自己创建的java.lang.String会发生什么呢?会输出如下错误信息。

错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

那JVM为何要使用双亲委派机制呢?试想,如果我们自己写的类能够随随便便覆盖JDK中的类的话,那JDK中的代码是不是就没有任何安全性可言了?没错,JVM为了代码的安全性,也即是沙箱安全机制,使用了双亲委派机制。

另外,使用双亲委派机制,也能防止JVM内存中出现多份相同的字节码。例如,两个类A和B,都需要加载System类。如果JVM没有提供双亲委派机制,那么A和B两个类就会分别加载一份System的字节码,这样JVM内存中就会出现这份System字节码。

相反,JVM提供了双亲委派机制的话,在加载System类的过程中,会递归的向父加载器查找并加载,整个过程会优先选用BootStrapClassLoader加载器,也就是我们通常说的引导类加载器。如果找不到就逐级向下使用子加载器进行加载。

而System类可以在BootStrapClassLoader中进行加载,如果System类已经通过A类的引用加载过,此时B类也要加载System类,也会从BootStrapClassLoader开始加载System类,此时,BootStrapClassLoader发现已经加载过System类了,就会直接返回内存中的System,不再重新加载。

这样,在JVM内存中,就只会存在一份System类的字节码。

类加载器的父子关系

如何确认类加载器的父子关系呢?这里,我们再来看一个示例代码,如下所示。

/**
 * @author binghe 
 * @version 1.0.0
 * @description 类的双亲委派机制
 */
public class User {
    public static void main(String[] args){
        User user = new User();
        System.out.println(user.getClass().getClassLoader());
        System.out.println(user.getClass().getClassLoader().getParent());
        System.out.println(user.getClass().getClassLoader().getParent().getParent());
    }
}

这段代码也比较简单,创建了一个User对象,打印User对象的类加载器,父类加载和上层父加载器。在IDEA中运行上述代码,会输出如下信息。

sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@135fbaa4
null

可以看到,User对象的类加载器是AppClassLoader,父加载器是ExtClassLoader。而输出的null其实是BootStrapClassLoader,而BootStrapClassLoader也就是上层父加载器。

这样,类加载器的父子关系就出来了:AppClassLoader的父加载器是ExtClassLoader,ExtClassLoader的父加载器是BootStrapClassLoader。

这里,需要注意的是:父加载器并不是父类。

类加载器加载的类

  • 引导类加载器(BootStrapClassLoader):负责加载%JAVA_HOME%/jre/lib目录下的所有jar包,或者是-Xbootclasspath参数指定的路径;
  • 扩展类加载器(ExtClassLoader):负责加载%JAVA_HOME%/jre/lib/ext目录下的所有jar包,或者是java.ext.dirs参数指定的路径;
  • 应用类加载器(AppClassLoader):负责加载用户类路径上所指定的类库。

注意:引导类加载器和扩展类加载器加载的类都是预先加载好的,而应用类加载器用来加载应用工程的classes以及lib下的类库,仅仅声明,并不会提前载入JVM内存,等到使用的时候才会加载到JVM内存中。

类的加载过程

一个类在JVM中的加载过程大致经历了加载、验证、准备、解析和初始化。

  • 加载: 主要是在计算机磁盘上通过IO流读取字节码文件(.class文件),当程序需要使用某个类时,才会对这个类进行加载操作,比如,在程序中调用某个类的静态方法,使用new关键字创建某个类的对象等。在加载阶段,往往会在JVM的堆内存中生成一个代表这个类的Class对象,这个对象作为存放在JVM方法区中这个类的各种数据的访问入口,也可以叫做访问句柄。
  • 验证:主要的作用就是校验字节码的正确性,是否符合JVM规范。
  • 准备:为类的静态变量分配相应的内存,并赋予默认值。
  • 解析:将程序中的符号引用替换为直接引用,这里的符号引用包括:静态方法等。此阶段就是将一些静态方法等符号引用替换成指向数据所在内存地址的指针,这些指针就是直接引用。如果是在类加载过程中完成的符号引用到直接引用的替换,这个替换的过程就叫作静态链接过程。如果是在运行期间完成的符号引用到直接引用的替换,这个替换的过程就叫作动态链接过程。
  • 初始化:对类的静态变量进行初始化,为其赋予程序中指定的值,并执行静态代码块中的代码。

注意:在准备阶段和初始化阶段都会为类的静态变量赋值,不同之处就是在准备阶段为类的静态变量赋予的是默认值,而在初始化阶段为类的静态变量赋予的是真正要赋予的值。

例如,在程序中有如下静态变量。

public static int count = 100;

在准备阶段会为count赋予一个默认值0,而在初始化阶段才会真正将count赋值为100。

JVM调优参数

在JVM中,主要是对堆(新生代)、方法区和栈进行性能调优。各个区域的调优参数如下所示。

  • 堆:-Xms、-Xmx
  • 新生代:-Xmn
  • 方法区(元空间):-XX:MetaspaceSize、-XX:MaxMetaspaceSize
  • 栈(线程):-Xss

为了更加直观的表述,我们可以将JVM的内存区域和对应的调优参数总结成下图所示。

在设置JVM启动参数时,需要特别注意方法区(元空间)的参数设置。

关于方法区(元空间)的JVM参数主要有两个:-XX:MetaspaceSize和-XX:MaxMetaspaceSize。

-XX:MetaspaceSize: 指的是方法区(元空间)触发Full GC的初始内存大小(方法区没有固定的初始内存大小),以字节为单位,默认为21M。达到设置的值时,会触发Full GC,同时垃圾收集器会对这个值进行修改。

如果在发生Full GC时,回收了大量内存空间,则垃圾收集器会适当降低此值的大小;如果在发生Full GC时,释放的空间比较少,则在不超过设置的-XX:MetaspaceSize值或者在没设置-XX:MetaspaceSize的值时不超过21M,适当提高此值。

-XX:MaxMetaspaceSize: 指的是方法区(元空间)的最大值,默认值为-1,不受堆内存大小限制,此时,只会受限于本地内存大小。

最后需要注意的是: 调整方法区(元空间)的大小会发生Full GC,这种操作的代价是非常昂贵的。如果发现应用在启动的时候发生了Full GC,则很有可能是方法区(元空间)的大小被动态调整了。

所以,为了尽量不让JVM动态调整方法区(元空间)的大小造成频繁的Full GC,一般将-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置成一样的值。例如,物理内存8G,可以将这两个值设置为256M

最后,我们一起看下在物理内存8G的情况下,启动应用程序时,可以设置的JVM参数。当然,我这里给出的是一些经验值,实际部署到生产环境时,需要经过压测找到最佳的参数值。

  • 启动SpringBoot
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar xxx.jar
  • 启动Tomcat(Linux)

在Tomcat bin目录下catalina.sh文件里配置。

‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M
  • 启动Tomcat(Windows)

在Tomcat bin目录下catalina.bat文件里配置。

‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M

总结

本文以面试为背景,探讨了有关JVM的常见面试问题。文章开头以一个常见的面试题举例,说明了JVM在互联网大厂面试中的重要性。接下里,介绍了JVM的体系结构,包含:方法区(元空间)、堆、栈、本地方法栈和程序计数器。

随后,介绍了JVM中的双亲委派机制,说明了何为双亲委派,为何使用双亲委派机制,类加载器的父子关系。需要注意的是:这里说的类加载器的父子关系并不是父类和子类的关系。随后,介绍了各个类加载器要加载哪些类。

接下来,介绍了类的加载过程,主要包含:加载、验证、准备、解析和初始化等步骤,同时,说明了各个步骤的主要作用。

最后,介绍了JVM中常用的调优参数,涵盖堆、新生代、方法区(元空间)和栈(线程)常用的调优参数。并以Tomcat调优为例,详细说明了如何使用这些调优参数。

说了这么多你都掌握了吗?

Java爱好狂.
关注 关注
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2024年java面试题-jvm性能调优面试题第一部分
04-21
核心内容就在于介绍jvm方面的调优方案以及策略吧,包括 jvm 的内存模型,新生代、老年代、持久代、oom、对应的参数设置以及为啥要这样设置等等,这份资料都有所介绍,当然啦,一份是介绍不完的,感性的大伙儿可以看下我的第二份资料:也是关于jvm性能调优的!!!
面试经常被 JVM 如何调优?这个题该怎么回答?没有实际调优经验怎么办?
公众号:该用户快成仙了
04-04 259
前不久有朋友面试了阿里,面试官到:关于Dalvik虚拟机能不能执行class文件他当时的回答是:不能,但是它执行的是class转换的dex文件。当面试官继续:为什么不能执行class文件?他的回答只有:Dalvik虚拟机内部的优化原因,没能给出正确回答具体的原因。
阿里的 JVM 性能优化面试题到底有多难?这四大题你能答出多少
rfhntn的博客
04-13 806
面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-VHJTsmoe-1713007724398)]
面试官:你有没有线上JVM 调优经验
重燃小窗
05-12 404
文章出处 面试官:在工作中做过 JVM 调优吗?讲讲做过哪些 JVM 调优? 我相信这种题大部分在参加面试的时候都会碰到,但是我们今天讨论一下 JVM 经过这么多年的发展和验证,整体是非常健壮的,个人认为99%的情况下,基本用不到 JVM 调优. 通常情况下我们的jvm参数调优都会遵循官方的建议: XX:NewRatio=2 XX:SurvivorRatio=8 堆内存设置为物理内存的3/4左右 … JVM 参数的默认(推荐)值都是经过 JVM 团队的反复测试和前人的充分验证得出的比较合理的值,因此通
面试官:你这JVM调优回答的很有题呀!!
m0_71777195的博客
01-05 298
前段时间一位读者面了阿里,在二面中被到 GC 日志分析,感觉回答的不是很好,过来找我复盘,大致听了他的回答,虽然回答出了部分,但是没抓到重点。GC 日志分析算是 JVM 调优中比较难的部分,今天这篇文章就来聊聊如何利用 JDK 现有的命令并且借助可视化工具如何去分析 GC 日志。
JVM 内存设置大小(Xms Xmx PermSize MaxPermSize 区别)
m0_54853503的博客
08-18 713
其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。...
JVM理论篇一:JVM调优常见面试
luckywuxn的博客
07-29 650
JIT 编译器的优势在于它可以根据实际的运行时情况进行动态优化,使得 Java 程序在运行过程中逐渐达到接近原生代码的性能。通过减少解释执行的开销和对热点代码的优化,JIT 编译器能够提升 Java 程序的整体性能。堆的特点包括对象的动态分配和释放,以及支持对象的共享和并发访。栈(Stack)是 JVM 内存模型中用于存储方法调用和局部变量的区域。栈的特点包括方法调用的压栈和出栈,以及局部变量的创建和销毁。解释 JVM 的永久代(PermGen)和元空间(Metaspace)的作用和区别。
2024年java面试题-jvm性能调优面试题第二部分
最新发布
04-21
书接上半部分,核心内容就在于介绍jvm方面的调优方案以及策略,这部分主要是介绍了堆内存方面的分区介绍、GC等内容,在应付面试以及平常工作中还是有点作用的!!!
JVM性能调优分析过程
06-19
JVMJava Virtual Machine)性能调优是提升Java应用程序效率的关键环节,主要涉及内存管理和垃圾回收机制的优化。本文将详细解析JVM性能调优分析的过程,并提供常见参数选择配置的建议。 首先,进行JVM参数调优时...
jvm性能调优+内存模型+虚拟机
02-13
jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机 jvm性能调优+内存模型+虚拟机
JVM性能调优总结.docx
04-15
JVM性能调优总结 JVM性能调优Java开发中非常重要的一方面,直接影响到系统的性能和稳定性。本文将总结JVM性能调优的经验和技巧,并提供一些实用的配置参数和建议。 一、堆大小设置 堆大小是JVM性能调优中的一个...
关于JVM的简单论述及调优
weixin_44080187的博客
03-23 617
简单初识JVM: 下面我们讲的都是关于:HotSpot JVM JavaDevelopmentKit(JDK)是一款Java语言的软件开发工具包 Java运行环境(Java Runtime Environment,简称JRE),JRE的内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的函数库lib(Class Library)。 如何发现内存OOM题:可以在IDEA安装插件JProfiler插件,同时安装客户端; JDK1.8 JVM主要分为.
JVM(一)——架构基础
qq_43409401的博客
01-14 811
类加载器ClassLoader、Native Interface、PC程序计数器、方法区Method Area、栈、堆
jvm 调优 2020.09.07
XT_985的博客
09-07 884
基本概念: JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数。 2.导致Full GC的原因 1)年老代
jvm调优面试题_Java面试
weixin_43784341的博客
02-10 1818
1、JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。 jconsole:用于对 JVM 中的内存、线程和类等进行监控; jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。 2、常用的 jvm 调优的参数都有哪些? -Xms2g:初始化推大小为 2g; -Xmx2g:堆最大内存为 2g; -XX:NewRatio=4:设置年轻的和老年代的内存比例为
JVM面试题目与答案
Firstlucky77的博客
06-02 2582
JVMJava运行基础,面试时一定会遇到JVM的有关题,内容相对集中,但对只是深度要求较高。其中内存模型,类加载机制,GC是重点方面。性能调优部分更偏向应用,重点突出实践能力。编译器优化和执行模式部分偏向于理论基础,重点掌握知识点。需了解内存模型各部分作用,保存哪些数据。类加载双亲委派加载机制,常用加载器分别加载哪种类型的类。GC分代回收的思想和依据以及不同垃圾回收算法的回收思路和适合场景。性能调优常有JVM优化参数作用,参数调优的依据,常用的JVM分析工具能分析哪些题以及使用方法。执行模式解释/编译
比较经典的一些jvm调优策略面试
sincegc的博客
03-31 308
JVM性能调优是一个很大的话题,很多中小企业的业务规模受限,没有迫切的性能调优需求,但是如果不知道JVM相关的理论知识,写出来的代码或者配置的JVM参数不合理时,就会出现很严重的性能题,到时候开发就会像热锅上的蚂蚁,等待各方的炙烤。这个错误的原因是,JVMGC时间占据了整个运行时间的98%,但是回收只得到了2%可用的内存,至少出现5次,就会报这个异常。内存泄露:不该留存在进程中的内存数据,虽然很小,但是在经过多次长期的积累后,会导致内存溢出。了解什么样的代码会导致内存溢出,防止写出这样的代码。
3.Java垃圾回收机制面试
wangyifeng9709的博客
07-21 2611
java垃圾回收
java慢场景_jvm调优的几种场景
weixin_32892145的博客
02-27 477
假定你已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器。一、cpu占用过高cpu占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束后cpu占用率就下降了,如果是这种情况其实可以不用太关心,因为请求越多,需要处理的线程数越多,这是正常的现象。话说回来,如果你的服务器配置本身就差,cpu也只有一个核心,这种情况,稍微多一点流量就真的能够...
面试官有没有jvm调优
07-28
回答: 在面试中,面试官可能会你是否有JVM调优的经验。JVM调优是指通过调整JVM的参数和配置来优化Java应用程序的性能和稳定性。要回答这个题,你可以提到以下几点。首先,你可以提到你对JVM的体系结构有深入的了解,包括方法区、堆、栈、本地方法栈和程序计数器等组成部分。\[1\]其次,你可以提到你了解如何观察JVM的运行参数,比如使用jps、jstack、jhat等JVM自带的工具命令,以及Java自带的JMC图形界面工具,来监控Java进程的线程状态、CPU和内存占用情况,以及GC状态等。\[3\]最后,你可以提到你有经验调整JVM的参数和配置,以优化Java应用程序的性能和稳定性。这包括调整堆大小、垃圾回收器的选择和配置、线程池的大小等。通过这些调优措施,可以提高应用程序的响应速度、减少内存占用和避免OOM等题。 #### 引用[.reference_title] - *1* *2* [面试官你关于JVM性能调优那些事儿,你要怎样优雅回答?](https://blog.csdn.net/wdj_yyds/article/details/124759534)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [面试经常被 JVM 如何调优?这个题该怎么回答?没有实际调优经验怎么办?](https://blog.csdn.net/weixin_60707895/article/details/129950623)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Jenkins 是什么?手把手教会你 Jenkins 22794
  • 学会这10种定时任务,我有点飘了 17662
  • MybatisPlus多表连接查询 15568
  • 2023最新的Java八股文合集来了,彻底解决一线大厂面试难题 14080
  • 全网最硬核解析!Maven进阶学习全解 10127

分类专栏

  • Java 1篇
  • MySQL 1篇

最新评论

  • 灵魂一问:MySQL可重复读如何解决幻读问题?

    邓某某1987: 很棒,对幻读理解很深刻。

  • 巅峰之作!谷歌出品527 页文档详解 SpringCloud 微服务和分布式系统实战笔记

    endlesswater: 可以的,我看的另一个SpringCloud项目视频,从零开发,五天学会了SpringCloud项目实战:https://knife.blog.csdn.net/article/details/134659054

  • 一次性讲清Java23种设计模式

    敲键盘的小夜猫: 作者的写作风格简洁明了,逻辑清晰,让复杂的技术内容变得易于理解。 【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 一篇搞懂Java 动态编译在项目中的实践

    qq_45304446: 您好 您的获取依赖的方式 打成jar包后在linux部署也生效吗?

  • 4K字详解:【MyBatis】saveBatch 性能调优

    HKDXiaoFan: 你的文章被别人剽窃了https://andyoung.blog.csdn.net/article/details/136687649?spm=1001.2014.3001.5502

大家在看

  • [C++][设计模式][工厂方法]详细讲解 363

最新文章

  • 金九银十如何抱佛脚?2023最新大厂 Java 面试真题合集(附完整答案解析)
  • 万字解析!Java - ThreadPoolExecutor源码
  • 万字超详细解析!Spring之基于注解的声明式事务
2023年449篇
2022年474篇
2021年51篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司广州建设网站坪地网站建设南山至尊标王横岗seo网站推广横岗网站优化排名石岩阿里店铺托管南联SEO按天计费木棉湾网站推广工具坪山网站seo优化双龙网站优化软件东莞网络广告推广双龙模板制作同乐阿里店铺托管南联优秀网站设计大浪企业网站改版同乐网站制作罗湖网站改版丹竹头网站优化按天扣费龙华模板制作布吉百度竞价包年推广永湖阿里店铺托管龙岗网站建设广州网站搭建福田标王木棉湾英文网站建设大运网站建设设计南联模板推广荷坳网站优化按天计费民治网站搭建吉祥企业网站制作歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化