2021面试知识点汇总?

jvm面试题汇总?

jvm调优?

说一下 JVM 调优的工具?

JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。

  • jconsole:用于对 JVM 中的内存、线程和类等进行监控;
  • jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等。

常用的 JVM 调优的参数都有哪些?

  • -Xms2g:初始化推大小为 2g;
  • -Xmx2g:堆最大内存为 2g;
  • -XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
  • -XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;
  • –XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
  • -XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
  • -XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
  • -XX:+PrintGC:开启打印 gc 信息;
  • -XX:+PrintGCDetails:打印 gc 详细信息。

jvm 垃圾回收原理?

在Java中,程序员是不需要显式的去释放一个对象内存的,而是由虚拟机自动执行,在jvm 中,有一个垃圾回收线程,他是低优先级的,在正常情况下是不会执行的,只有当程序空闲或者当前堆内存不足时,扫描哪些没有被任何引用的对象,并且将他们添加到要回收集合中,进行回收.程序员不能实时的对所有对象或者对象的调用垃圾器进行回收.

垃圾回收种类?

包括:分代复制垃圾回收,标记垃圾回收,增量垃圾回收.

有什么办法主动通知虚拟机进行垃圾回收?

主动调用System().gc()通知gc运行,但是Java语言规范并不能保证gc 一定会执行.

怎么判断对象是否可以被回收?

垃圾回收期在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收的.哪些对象是存活的,是不可以被回收的,哪些对象是已经死掉的,需要被回收的.

一般有两种方式来进行判断:

  • 引用计数器法:为每个对象创建一个引用计数,有对象引用时,计数器+1,引用被释放时计数器-1,当计数器为0的时候就可以被回收,但是有一个缺点是他不能解决循环引用的问题.
  • 可达性分析算法:从GC ROOTS 开始向下搜索,搜索所走过的路径成为引用链,当一个对象到GC ROOTS没有任何引用链相连时,说明该对象是可以被回收的.

在Java 中 ,对象什么时候可以被垃圾回收?

当对象对当前使用这个对象的应用程序变的不可触及的时候,就可以被垃圾回收.

JVM中的永久代中会发生垃圾回收吗?

不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完成垃圾回收(Full GC )

jvm类加载机制?

简述Java类加载机制?

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。

简述jvm 加载class文件的原理机制?

Java中所有的类都需要由类加载器装载到jvm中才能运行,类记载其本身也是一个类,而他的工作就是把class文件从硬盘读取到内存中,在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的使用方法.像是反射,就需要显式的加载所需要的类.
类装载方式有两种:

  • 隐式装载,程序在运行过程中当碰到通过new等方式生成对象时,则会隐式调用类装载器加载对应的类到jvm中.
  • 显式装载,通过class.forname()等,显式加载需要的类.

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

实现通过类的权限定名,获取该类的二进制字节流的代码块叫做类加载器.
主要有四种类加载器:

  • 启动类加载器(BootStrap ClassLoader ):用来加载Java核心类库.无法被Java程序直接引用.
  • 扩展类加载器(extensions class loader ):用来加载Java的扩展库,Java虚拟机的实现会提供一个扩展库目录,该类加载器在此目录里面来查找加载Java类
  • 系统类加载器(system class loader ):他根据Java应用的类路径来加载Java类,一般来说,Java应用的类,都是由他来完成加载的.可以通过 ClassLoader.getSystemClassLoader()来获取它。
  • 已定义类加载器:通过继承 java.lang.ClassLoader类的方式实现。

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

类加载分为以下5个过程:

  • 记载: 根据查找路径找到相应的class文件然后导入.
  • 验证:检查加载的class文件的正确性.
  • 准备:给类中的静态变量分配内存空间.
  • 解析:虚拟机将常量池中的符号引用替换成直接引用的过程.符号引用就理解是一个标示,而在直接引用直接指向内存中的地址.
  • 初始化: 对静态变量和静态代码块执行初始化工作

jvm 双亲委派?

如果一个类加载器收到了类加载的请求,他首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这个所有的加载请求都会被传送到顶层的类加载器中,只有当父加载无法完成加载请求的时候,子加载器才回去尝试加载类.

jvm 内存模型?

JVM内存共分为堆,方法区,本地方法区,程序计数器,虚拟机栈.

  • 堆: 线程共享主要存放的是对象的实例和数组,更加关注数据的存储,被所有线程所共享的一块内存区域,在虚拟机启动的时候创建,用于存档对象的实例.堆可以按照可扩展来实现,通过-Xms,-Xmx来控制
  • 方法区:线程共享,被所有方法线程共享的一块内存区域用于存储已经被虚拟机加载的类信息,常量,静态变量等.
  • 本地方法区:线程私有,和虚拟机栈类似,主要为虚拟机使用的native方法服务.
  • 程序计数器: 线程私有,是当前线程所执行的字节码行号指示器.
  • 虚拟机栈主要存放局部变量,操作数栈,返回结果,更加关注程序方法的执行:线程私有,一个线程每调用一个方法就创建一个栈针,存储了局部变量,操作数,动态链接,方法返回地址等数据.每个方法从调用到执行完毕,对应虚拟机栈中的入栈和出栈,如果线程强求的栈深度大于虚拟机的栈深度,则报错:StackOverflowError,如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存时,则抛出:OutOfMemoryError

jvm有那些垃圾回收算法?

  • 标记-清除算法:标记无用的对象,对这个对象进行垃圾回收.缺点:效率不高,无法清除垃圾碎片.
  • 复制算法:按照容量划分为两个大小相等的区域,当一块用完的时候将活着的对象复制到另一块上面,然后再把已使用的内存空间一次性清除掉.缺点:内存使用率不高,只有原来的一半.
  • 标记-整理算法:标记无用对象,然后让所有存活的对象都向一端移动,然后直接清除掉边界以外的内存.
  • 分代算法:根据对象存活周期的不同,将内存分为几个区域,一般是分为新生代和年老代,新生代基本采用复制算法,年老代基本采用标记整理算法.

JVM 有哪些垃圾回收器?

用于回收新生的收集器包括Serial(复制算法),PraNew(复制算法),Parallel Scavenge(复制算法) 回收老年代的收集器包括 Serial Old (标记-整理算法), Parallel Old (标记整理算法) CMS (标记-清除算法) 还有用于回收整合java对的G1(标记-整理算法)收集器

如果说垃圾回收算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现,

  • Serial收集器(复制算法): 新生代带线程收集器,标记和清理都是单线程,有点是高效
  • ParNew收集器(复制算法):新生代并行收集器,实际上是Serial收集器的多线程版本在多核CPU环境下,有着比Serial更好的表现.
  • Parallel Scavenge收集器(复制算法):新生代并行收集器,追求高吞吐量,高效利用CPU.吞吐量=用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务.
  • Serial Old收集器(标记-整理算法):老年代单线程收集器,Serial的老年代版本.
  • Parallel Old收集器(标记-整理算法):老年代并行收集器,parallel Scavenge 的老年代版本
  • CMS收集器(标记-清除算法):老年代并行收集器.
  • G1收集器(标记-整理算法): G1的回收范围是整个Java堆,包括新生代,老年代,而前六种收集器的回收范围仅限与新生代或者年老代.

OOM 和 SOF

内存溢出,当程序在申请内存时,没有足够的内存使用,就是抛出out of menory异常,也就是要求分配的内存超过了系统能够分配的内存.内存泄漏(SOF)会导致内存溢出,是指程序在申请内存后无法释放已申请的内存空间,当内存泄漏堆积后,就会造成内存溢出.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值