JVM面试题(一)

2023-09-18 19:12:43

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

  1. 内存模型以及分区,需要详细到每个区放什么。
  2. 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。
  3. 对象创建方法,对象的内存分配,对象的访问定位。
  4. GC 的两种判定方法:
  5. SafePoint 是什么
  6. GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
  7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。
  8. Minor GC 与 Full GC 分别在什么时候发生?
  9. 几种常用的内存调试工具:jmap、jstack、jconsole、jhat
  10. 类加载的几个过程:

提示:以下是本篇文章正文内容,下面案例可供参考

一、内存模型以及分区,需要详细到每个区放什么。

JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,
class 类信息常量池(static 常量和 static 变量)等放在方法区
new:

  1. 方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字
    节码)等数据
  2. 堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要
    在堆上分配
  3. 栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操
    作数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个应用类型,所
    以还是一个指向地址的指针
  4. 本地方法栈:主要为 Native 方法服务
  5. 程序计数器:记录当前线程执行的行号

二、堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。

堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包
含 Eden+Survivor 区,survivor 区里面分为 from 和 to 区,内存回收时,如果用的是复
制算法,从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动
到老年区,当 JVM 内存不够用的时候,会触发 Full GC,清理 JVM 老年区
当新生区满了之后会触发 YGC,先把存活的对象放到其中一个 Survice区,然后进行垃圾清理。因为如果仅仅清理需要删除的对象,这样会导致内存碎片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候,就会使用下一个 Survive,这样循环使用。如果有特别大的对象,新生代放不下,就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存活时间一般比较久远。


三、对象创建方法,对象的内存分配,对象的访问定位。

new 一个对象


四、GC 的两种判定方法:

引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就
会回收但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)
的情况
引用链法: 通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等-static 变量)来判断,如果有一条链能够到达 GC ROOT 就说明,不能到达 GC ROOT 就说明可以回收


五、SafePoint 是什么

比如 GC 的时候必须要等到 Java 线程都进入到 safepoint 的时候 VMThread 才能开始
执行 GC,

  1. 循环的末尾 (防止大循环的时候一直不进入 safepoint,而其他线程在等待它进入
    safepoint)
  2. 方法返回前
  3. 调用方法的 call 之后
  4. 抛出异常的位置

六、GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

先标记,标记完毕之后再清除,效率不高,会产生碎片
复制算法:分为 8:1 的 Eden 区和 survivor 区,就是上面谈到的 YGC
标记整理:标记完毕之后,让所有存活的对象向一端移动


七、GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。

并行收集器:串行收集器使用一个单独的线程进行收集,GC 时服务有停顿时间
串行收集器:次要回收中使用多线程来执行
CMS 收集器是基于“ 标记— 清除”算法实现的,经过多次标记才会被清除
G1 从 整体来看是基于“ 标记— 整理”算法实现的收集器,从 局部(两个 Region 之间)上来看是基于“ 复制”算法实现的


八、Minor GC 与 Full GC 分别在什么时候发生?

新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC


九、几种常用的内存调试工具:jmap、jstack、jconsole、jhat

jstack 可以看当前栈的情况
jmap 查看内存
jhat 进行 dump 堆的信息
mat(eclipse 的也要了解一下)


十、类加载的几个过程:

加载、验证、准备、解析、初始化。然后是使用和卸载了
通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文件格式校验、元数据验证,字节码校验等。准备是对这个对象分配内存。解析是将符号引用转化为直接引用(指针引用),初始化就是开始执行构造器的代码


总结

  1. 内存模型以及分区,需要详细到每个区放什么。
  2. 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。
  3. 对象创建方法,对象的内存分配,对象的访问定位。
  4. GC 的两种判定方法:
  5. SafePoint 是什么
  6. GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
  7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。
  8. Minor GC 与 Full GC 分别在什么时候发生?
  9. 几种常用的内存调试工具:jmap、jstack、jconsole、jhat
  10. 类加载的几个过程:
更多推荐

数据库锁及批量更新死锁处理

数据库锁锁间隙锁锁定的是一个间隙范围,而不会锁住某条记录。共享锁就是读锁,独占锁就是写锁,可以理解为读写锁,读读不互斥,读写互斥,写写互斥,共享锁(S锁)、独占锁(X锁)指的就是InnoDB上的行锁(记录锁)。意向锁是InnoDB引擎的一种特殊的表锁,在获取共享锁和独占锁之前必须拿到对应类型的意向锁。乐观锁和悲观锁更多

如何处理ChatGPT在文本生成中的语法错误和不合理性?

ChatGPT是一种强大的自然语言处理模型,但它并不是完美的,有时会产生语法错误或不合理的文本。这些问题可能会影响模型生成的内容的质量和可信度。在处理ChatGPT中的语法错误和不合理性时,有许多方法和策略可以采用,以下是一些详细的讨论:**1.数据清洗和预处理:**首先,可以通过对输入数据进行清洗和预处理来减少语法错

Ninja: Towards Transparent Tracing and Debugging on ARM【TEE的应用】

目录摘要引言贡献背景TrustZone和受信任的固件PMU和ETM相关工作x86上的透明恶意软件分析ARM上的动态分析工具基于仿真的系统硬件虚拟化裸机系统Trustzone相关的系统系统架构具体实现和评估可以看论文,这里不赘述了讨论总结作者:ZhenyuNingandFengweiZhang发布:USENIX时间:20

Hadoop NameNode执行命令工作流程

HadoopNameNode执行命令工作流程客户端API或者CLI与NameNode的交互命令数据的格式(1)预处理流程(2)创建NameNode与NameNodePrcServer流程(3)HDFSAPI以及CLI的命令到NameNode的工作执行流程(4)执行命令的参数流动客户端API或者CLI与NameNode的

使用LDA(线性判别公式)进行iris鸢尾花的分类

线性判别分析((LinearDiscriminantAnalysis,简称LDA)是一种经典的线性学习方法,在二分类问题上因为最早由[Fisher,1936]提出,亦称”Fisher判别分析“。并且LDA也是一种监督学习的降维技术,也就是说它的数据集的每个样本都有类别输出。这点与主成分和因子分析不同,因为它们是不考虑样

9、DVWA——XSS(Stored)

文章目录一、存储型XSS概述二、low2.1源码分析2.2通关分析三、medium3.1源码分析3.2通关思路四、high4.1源码分析4.2通关思路一、存储型XSS概述XSS,全称CrossSiteScripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面

分布式系统中的选举,日志副本,安全等设计思想

链接:https://pan.baidu.com/s/1G9295khav7_k3dD9G0f_Kw?pwd=q216提取码:q216领导选举领导选举(Leaderelection)是在分布式系统中选择一个节点作为领导者或协调者的过程。分布式系统通常由多个节点组成,每个节点都可以执行特定的任务。然而,为了使系统有序运行

HCIE-容器docker

1、安装配置操作系统,使用CentOSstream8镜像之前:RHEL8.4发布了,CentOS紧随其后,发布CentOS8.4之后:CentOS走在前面,成为RHEL上游,再去发布RHEL制作模板,模板配置要求,cpu至少2个,内存建议4G,硬盘100G,网卡使用NAT模式。1.编辑网卡[root@tempnetwo

Java|List.subList 踩坑小记

很久以前在使用Java的List.subList方法时踩过一个坑,当时记了一条待办,要写一写这事,今天完成它。我们先来看一段代码://初始化list为{1,2,3,4,5}List<Integer>list=newArrayList<>();for(inti=1;i<=5;i++){list.add(i);}//取前3

传感器浮点数数据在串口通信中封包技术解析

一、项目实现要求根据项目要求,我们需要在多台机器人间进行数据通信,系统搭建如下:在机器人A上搭载大气压模块传感器和zigbee通信模块,在机器人B上搭载手势传感器和zigbee通信模块,在机器人C上搭载zigbee通信模块,要求A和B的传感器数据能够通过zigbee模块传输到机器人C并用以做进一步的控制处理。二、由于分

word的分隔符和分页符

目录1.word中的分隔符和分页有何不同2.word中我想把表格所在的页设置为横向,上下页均为纵向3.表格页末尾的光标回车生成新的页面后,其仍然为横向,而我希望它为纵向1.word中的分隔符和分页有何不同分隔符和分页符在Word中都是用于文本分段的工具,但它们的用途和操作方式有所不同。分隔符是一个广义的概念,包括分页符

热文推荐