JVM(面试篇)

JVM

在这里插入图片描述
元空间:被虚拟机加载的类信息、常量、静态变量,即编译器编译后的代码。
本地方法栈:本地方法栈是用来支持本地(native)方法执行的一个区域。当一个Java应用调用了一个用其他语言(如C或C++)实现的本地方法时,这个方法的执行就需要借助本地方法栈来完成。
虚拟机栈:线程私有虚拟机栈用于执行java方法的数据结构,每个线程在创建时都会获得一个独立的虚拟机栈区域,用于存储该线程执行过程中所需的栈帧(Stack Frame)
程序计数器:线程私有,用来存储当前线程所执行字节码指令位置
堆:线程共享,用来存储对象实例、数组共享数据等,分为新生代和老年代,新生代用于存储新创建的对象,经过多次垃圾回收后任然存在的对象放入老年代

在这里插入图片描述

虚拟机栈

在这里插入图片描述

堆栈区别

在这里插入图片描述

类加载器

在这里插入图片描述

双亲委派机制

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

类的装载过程

在这里插入图片描述

垃圾回收

引用计数法:记录对象的引用次数,没有引用时就是垃圾对象
可达性分析算法:有一个Root节点记录非垃圾对象,不在这个路径上的就是垃圾对象
在这里插入图片描述

JVM垃圾回收算法

在这里插入图片描述

STW

STW(Stop the world)在垃圾回收算法执行过程中,需要将JVM内存冻结,在STW状态下,JAVA的所有线程都是停止执行的-GC线程除外。native方法可以执行,但是不能与JVM交互。

分代回收

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

垃圾回收

在这里插入图片描述

G1垃圾回收

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

一个对象从加载到JVM到被GC回收过程

1.首相将类的字节码文件加载到JVM的元空间
2.根据类信息在堆中创建对象
3.对象首先会被分配到堆中新生代的Eden区,经过Minor GC(young GC)后,如果存活,就会进入到Suvivor区,在后续每次GC中,如果一直存活,就会在survivor区之间来回拷贝,每次移动年龄加1.
4.当年龄超过阈值(15)会进入老年代。
5.经过FullGC,标记为垃圾对象就会被GC清理

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

JVM参数设置位置

在这里插入图片描述

JVM调优

主要是调整新生代、老年代、元空间的内存大小以及垃圾回收器的类型
在这里插入图片描述
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a8944bb8cc59421在这里插入图片描述

排查JVM问题

1.使用jmap查看JVM各个区域的使用情况
2.使用jstack查看线程的运行情况,是否出现了阻塞或者死锁
3.可以通过jstate查看垃圾回收情况,特别是fullGC(全量垃圾回收,消耗更多的时间和资源,出现情况可能是:堆内存不足、老年代空间不足、系统请求),如果fullGC比较频繁就需要调优
4.如果频繁发生fullgc但是没有出现内溢出,那么表示fullgc回收了很多的对象,这些对象很多应该在新生代中回收掉,避免进入老年代。对于这种情况,考虑这些存活时间不长的对象,是不是比较大,导致新生代方法不下,从而直接进入到了老年代,尝试加大新生代大小。

JVM内存泄漏

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

CPU飙高

在这里插入图片描述

Arthas排查程序线上问题

常用命令
memory 查看虚拟机各区域大小以及使用率
jad +类全路径 反编译代码
thread -n 展示cpu使用比较高的线程
thread -b 查看获得锁的线程
trace
watch 检测代码的入参以及抛出异常,代替debug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值