Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境)

JVM有哪些部分组成,运行流程是什么?
Pasted image 20240721135250
Pasted image 20240721135342

JVM组成

什么是程序计数器?

程序计数器:线程私有的,内存保存字节码的行号。用于记录正在执行的字节码指令的地址

详细介绍java堆?

线程共享的区域

主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法在扩展时,则抛出OutOfMemoryError异常

Pasted image 20240721141804

java7和java8的jvm内存结构区别

Pasted image 20240721142234

你能给我详细介绍java堆吗?
Pasted image 20240721142311

什么是虚拟机栈?

Java Virtual machine Stacks(java虚拟机栈)

  • 每个线程运行时所需要的内存,称为虚拟机栈,先进后出
  • 每个栈有多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

Pasted image 20240721144512

垃圾回收是否涉及栈内存?

垃圾回收主要指堆内存,当栈帧弹栈以后,内存就会释放

栈内存分配越大越好吗?

未必,默认的栈内存通常为1024k
栈帧过大会导致线程数变少,例如,机器总内存512m,目前能活动的线程数则为512个,如果把栈内存改为2048k,那么能活动的栈帧就会减半

方法内的局部变量是否是线程安全的

Pasted image 20240721145549
Pasted image 20240721145523

栈内存溢出情况

  • 栈帧过多导致栈内存溢出,典型问题:递归调用
  • 栈帧过大导致栈内存溢出

Pasted image 20240721145843Pasted image 20240721145852

解释一下方法区?

  • 方法区(Method area)是各个线程共享的内存区域
  • 主要存储类的信息、运行时常量池
  • 虚拟机启动的时候创建,关闭虚拟机时释放
  • 如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError:Metaspace
    Pasted image 20240721152637

常量池

一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型以及字面量等信息
Pasted image 20240721154308

运行时常量池

常量池是*.class文件中的,当该类被加载,它的常量信息就会放入运行时常量池,并把里面的符号地址变为真实内存地址

Pasted image 20240721154529

解释一下方法区?
Pasted image 20240721154548
介绍一下运行时常量池
Pasted image 20240721154613

你听过直接内存吗?

直接缓存:并不属于JVM中的内存结构,不由JVM管理。虚拟机的系统内存,常见于NIO操作时,用于数据缓冲区,他分配回收成本较高,但读写性能高

常规IO

Pasted image 20240721164231

NIO

Pasted image 20240721164502

你听过直接内存吗?

Pasted image 20240721164529

类加载器

什么是类加载器,类加载器有哪些?

类加载器:JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来

Pasted image 20240721170828

1、什么是类加载器?
Pasted image 20240721170847
2、类加载器有哪些
Pasted image 20240721170912

什么是双亲委派模型?

加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被记载,子加载器尝试加载该类

为什么采用双亲委派机制?

Pasted image 20240721171804

什么是双亲委派模型?
Pasted image 20240721172057
JVM为什么采用双亲委派机制?
Pasted image 20240721172124

类装载的执行过程说一下?

Pasted image 20240721215026

加载

前两句话就是元空间中存储类的信息,最后一句话在堆中创建对象
Pasted image 20240721215442

验证

Pasted image 20240721215811

准备

为类变量(static 静态变量)分配内存并设置类变量初始值

Pasted image 20240721215942

解析

将类中的符号引用转换为直接引用

比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法
Pasted image 20240721220246

初始化

对类中的静态变量,静态代码块进行初始化操作

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行

使用

Pasted image 20240721221235

说一下类装载的执行过程?
Pasted image 20240721221322

垃圾回收

对象什么时候可以被垃圾回收器回收

如果一个或多个对象没有任何引用指向它,那么这个对象就是垃圾,如果定位了垃圾,则有可能被垃圾回收器回收

如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法

引用计数法

Pasted image 20240722162409
可能存在问题

Pasted image 20240722163026
Pasted image 20240722163100

可达性分析算法

Pasted image 20240722163228

哪些对象可以作为GC Root?

Pasted image 20240722163428

对象什么时候会被垃圾器回收?
Pasted image 20240722164912

JVM垃圾回收算法有哪些?

标记清除算法

Pasted image 20240722165100

标记整理算法

Pasted image 20240722165212

复制算法

Pasted image 20240722165334

JVM垃圾回收算法有哪些?

Pasted image 20240722165423

JVM中的分代回收?

分代收集算法

Pasted image 20240722170615
Pasted image 20240722171240

MinorGC 和MixedGC以及FullGC的区别是什么

Pasted image 20240722171919

说一下JVM中的分代回收

Pasted image 20240722172042>
MinorGC 和MixedGC以及FullGC的区别是什么?

Pasted image 20240722172112

说一下JVM有哪些垃圾回收器?

串行垃圾收集器

Pasted image 20240723085642

并行垃圾收集器

Pasted image 20240723085813

CMS(并发)垃圾收集器

Pasted image 20240723090042

G1垃圾收集器

说一下JVM有哪些垃圾回收器?

Pasted image 20240723090133

详细聊一下G1垃圾回收器?

Pasted image 20240723091035

Young Collection(年轻代垃圾回收)

Pasted image 20240723091257
Pasted image 20240723091307
Pasted image 20240723091338

Concurrent Mark(并发标记)

当老年代占用内存超过阈值(默认是45%)后,触发并发标记,这时无需暂停用户线程
标记老年代中依旧存活的内存对象

Pasted image 20240723091509

混合垃圾回收(Mixed Collection)

Pasted image 20240723091615

Pasted image 20240723091820

到达一定阈值的幸存者区和回收价值比较高的老年代放到新的老年代中

复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集里

聊一下G1垃圾回收器?
Pasted image 20240723092151

强引用、软引用、弱引用、虚引用的区别

Pasted image 20240723100809Pasted image 20240723100945

Pasted image 20240723104441

区别?
Pasted image 20240723104513

JVM实践

JVM调优的参数可以在哪里设置?

war包部署在tomcat中设置

Pasted image 20240723163833

jar包部署在启动参数设置

通常在linux系统中直接加参数启动springboot项目

Pasted image 20240723163932

jvm调优的参数可以在那里设置
Pasted image 20240723163953

JVM调优的参数有哪些?

对于JVM调优,主要就是调整年轻代、老年代、元空间的内存空间大小以及使用的垃圾回收器类型

Pasted image 20240723164617

设置堆空间大小

Pasted image 20240723164745

虚拟机栈的设置

Pasted image 20240723165713

年轻代中Eden区和两个survivor区的大小比例

Pasted image 20240723165946

年轻代晋升老年代的阈值

Pasted image 20240723170216

设置垃圾回收收集器

Pasted image 20240723170524

JVM调优的参数有哪些?

Pasted image 20240723170548

说一下JVM调优的工具?

Pasted image 20240723172357

Jmap

Pasted image 20240723190738

Jstat

Pasted image 20240723190840

Java内存泄漏的排查思路?

三种情况:

Pasted image 20240723193028

Pasted image 20240723193344

步骤

Pasted image 20240723193411
Pasted image 20240723194309

Pasted image 20240723194333

java内存泄漏的排查思路?
Pasted image 20240723194417

CPU飙高的排查方案与思路?

Pasted image 20240723214655
Pasted image 20240723214711
通过以上分析,在进程40940中的线程40950占用CPU较高

Pasted image 20240723215247

排查思路?
Pasted image 20240723215304