JVM面试题整理-----

本文详细探讨了JVM垃圾回收的原理,包括可达性分析和GC Roots的概念。讲解了如何通过JVM工具如jps、jinfo进行系统默认值查看,并介绍了常用的JVM配置参数。还讨论了强引用、软引用、弱引用和虚引用的区别,以及对OOM错误的理解。此外,文章深入讲解了GC算法与收集器的关系,重点介绍了G1垃圾收集器的特性和优势,并分享了面对服务器性能问题的诊断思路。
摘要由CSDN通过智能技术生成

1. JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots

1. 1什么是垃圾?

  • 内存中已经不再使用到的空间就是垃圾

1.2 要进行垃圾回收,如何判断一个对象是否可以被回收

  • 引用计数法:java中,引用和对象是由关联的。如果要操作对象则必须用引用进行。

因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收,简单说,给对象中添加一个引用计数器,每当有一个地方引用它,计数器加1,每当有一个引用失效时,计数器减1,任何时刻计数器数值为零的对象就是不可能再被使用的,那么这个对象就是可回收对象
但是为什么主流的java虚拟机都没有选用这种对象呢?
(最主要的原因)但是它很难解决对象之间相互循环引用的问题 JVM一般不采用这种实现方式。
在这里插入图片描述

  • 枚举根节点做可达性分析(根搜索路径)

    • 为了解决引用计数法的循环引用问题,java使用了可达性分析的方法。
      在这里插入图片描述
  • 所谓GC ROOT或者说Tracing GC的“根集合就是一组必须活跃的引用

  • 基本思路:就是通过一系列“GC Roots”的对象作为起始点,从这个被称为GC Roots 的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即:给定一个**集合(说明有多个)**的引用作为根出发,通过引用关系遍历对象图,能被便利到的对象就被判定为存活没有被便利到的就被判定为死亡 必须要从GCRoots开始

  • GC Roots对象作为起点出发,能够遍历到达,才是引用可达,不能被回收

  • 引用不可达,就会被回收

  • (1)哪些对象可以作为GC Roots对象

    • 虚拟机栈(栈帧中的局部变量区,也叫局部变量表)中应用的对象。
    • 方法区中的类静态属性引用的对象
    • 方法区中常量引用的对象
    • 本地方法栈中JNI(native方法)引用的对象
      在这里插入图片描述

2. 做过JVM调优和参数配置,如何盘点查看JVM系统默认值

2.1 如何查看运行中程序的JVM信息

  • jps查看进程信息
  • jinfo -flag 配置项 进程号
  • jinfo -flags 进程号 查看所有配置

(1)JVM参数类型

  • 标配参数(各个版本之间稳定,很少有很大的变化)
    -version 
    -help
    java -showversion
    

在这里插入图片描述

  • x参数(了解)
-Xint -Xcomp -Xmixed

-Xint :解释执行
-Xcomp:第一次使用就编译成本地代码
-Xmixed:混合模式 先编译再执行

在这里插入图片描述

  • xx参数

    • Boolean类型

      • 公式:-XX:+ 或者 - 某个属性值
        • +表示开启,-表示关闭
      • 如何查看一个正在运行中的Java程序,它的某个jvm参数是否开启,具体值是多少?
        在这里插入图片描述
      D:\IdeaProjects\JavaFacetime\demo01>jps -l
      18864 jdk.jcmd/sun.tools.jps.Jps
      19424 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
      6632
      16700 com.amd.sh.jvm.HelloGC
      3148 org.jetbrains.jps.cmdline.Launcher
      
      D:\IdeaProjects\JavaFacetime\demo01>jinfo -flag PrintGCDetails 1
      6700
      -XX:+PrintGCDetails
      
        - jps查看进程信息
        	- `jps -l`
        	- id例如13632
        - jinfo -flag 配置项 进程号
        	- `jinfo -flag PrintGCDetails 13632`
        - jinfo -flags 进程号 查看所有配置
      
      • 使用了:+ 未使用:-

      • 是否打印GC收集细节

        • -XX:+PrintGCDetails 开启
        • -XX:-PrintGCDetails 关闭
      • 是否使用串行垃圾回收器

        • -XX:-UseSerialGC:关闭
        • -XX:+UseSerialGC:开启
    • KV设值类型

      • 公式:-XX:属性key=属性值value

      • case:

from...初始默认值...to...自我期望值
-XX:MetaspaceSize=128m
			
-XX:MaxTenuringThreshold=15  

-Xms----> -XX:InitialHeapSize

-Xmx----> -XX:MaxHeapSize
  • jinfo举例,如何查看当前运行程序的配置
    • 公式:jinfo -flag 配置项 进程编号
    • 3个案例

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  • 两个经典参数:-Xms 和 -Xmx
    • Xms: 等价于 -XX:InitialHeapSize (初始化堆内存)
    • Xmx: 等价于 -XX:MaxHeapSize (Max堆内存)

(2)查看jvm默认值

  • 查看参数
    • 第一种方式:
      • jps
      • jinfo -flag 具体参数 java进程编号
      • jinfo -flags java进程编号
    • 第二种方式:
      • -XX:+PrintFlagsInitial

        • 查看初始默认值
        • 公式:
          • java -XX:+PrintFlagsInitial -version
          • java -XX:+PrintFlagsInitial
        • 在这里插入图片描述
      • -XX:+PrintFlagsFinal

        • 主要查看修改更新
        • 公式:
          • java -XX:+PrintF
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值