面试题--JVM垃圾回收及内存管理

2023-05-16

选择题

1.以下哪些内存区域属于 JVM 规范?()

A. 方法区
B. 实例变量
C. 静态变量
D. 程序计数器
E. 虚拟机栈
正确答案:A D E
解析:
Java虚拟机规范划分了七个内存区域,其中根据是否为线程私有的分为两大类:
  1. 线程私有的:线程栈,本地方法栈,程序计数器
  2. 线程共享的:方法区,常量池,直接内存区,堆
其中常说堆和栈分别指的是线程栈和堆,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

2 可以用于生成 JVM 进程堆快照的命令是?

A.jmap
B.jstack
C.jstat
D.jhat
正确答案:A
解析:
  • jmap 生成打印指定 Java 进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节
  • jstack 生成线程快照
  • jstat 命令可以查看堆内存各部分的使用量,以及加载类的数量
  • jhat 分析 java 堆的命令,可以将堆中的对象以 html 的形式显示出来

3.以下哪些 jvm 的垃圾回收方式采用的是复制算法回

A.新生代串行收集器
B.老年代串行收集器
C.并行收集器
D.新生代并行回收收集器
E.老年代并行回收收集器
F.cms 收集器
正确答案: A D
解析:
  • 两个最基本的java回收算法:复制算法和标记清理算法。
  • 复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。
  • 标记清理:一块区域,标记可达对象(可达性分析),然后回收不可达对象,会出现碎片,那么引出
  • 标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象。
  • 两个概念:新生代和年老代
  • 新生代:初始对象,生命周期短的;
  • 年老代:长时间存在的对象。
  • 整个java的垃圾回收是新生代和年老代的协作,这种叫做分代回收。
  • 新生代基本采用复制算法,年老代采用标记整理算法,CMS采用标记清理。

4jvm 中垃圾回收分为 scanvenge gc full GC,其中 full GC 触发的条件可能有哪些

A.栈空间满
B.年轻代空间满
C.老年代满
D.持久代满
E.System.gc()
正确答案: C D E
解析:
1,新生代:
(1)所有对象创建在新生代的 Eden 区,当 Eden 区满后触发新生代的 Minor GC,将 Eden 区和非空闲 Survivor 区存活的对象复制到另外一个空闲的 Survivor 区中。
(2)保证一个 Survivor 区是空的,新生代 Minor GC 就是在两个 Survivor 区之间相互复 制存活对象,直到 Survivor 区满为止。
2,老年代:当 Survivor 区也满了之后就通过 Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。
3,持久代:持久代如果满了,将触发 Full GC。

5 下面对 JVM 叙述不正确的是:

A.JVM 的全称是 Java Virtual Machine
B.JVM 是一种计算机硬件技术,它是 Java 程序的运行平台
C.JVM 是在计算机硬件系统上用软件实现的一台假想机
D.Java 程序在执行时.JVM 把 Java 字节码解释成机器码
正确答案:B
解析:

JVM 也就是 Java Virtual Machine,即 java 虚拟机, 是在现有的平台上,如Windows,Linux 等,运行一个软件,虚拟出一台接口统一的计算机,依次实现 java语言的跨平台特性

判断题

1. 调用 System.gc()之后会立即执行垃圾回收(×)

2. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的(√)

3. Java 方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的(√)

4. 方法区用于存储 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是线程隔离的 (×)

5. 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的(√)

解析:

运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器虚拟机栈区 :也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间 完成分配。堆区 , JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。 方法区 :所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。 程序计数器 :线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。

 

简答题

1java 类装载器的工作流程?

(1)当 AppClassLoader 加载一个 class 时,它首先 不会自己去尝试加载这个类,而是把类加载请求委派 给父类加载器 ExtClassLoader 去完成。

(2)当 ExtClassLoader 加载一个 class 时,它首先 也不会自己去尝试加载这个类,而是把类加载请求委 派给 BootStrapClassLoader 去完成。

(3)如果 BootStrapClassLoader 加载失败(例如在 $JAVA_HOME/jre/lib 里未查找到该 class),会使用 ExtClassLoader 来尝试加载;

(4)若 ExtClassLoader 也加载失败,则会使用 AppClassLoader 来加载 5、如果 AppClassLoader 也加 载失败,则会报出异常 ClassNotFoundException

2、运行时数据区包括哪几部分?哪些是线程私有的,哪些是共享的?

线程共享:Java 堆、方法区、常量池

线程私有:pc 寄存器、虚拟机栈、本地方法栈

3.如何判断一个对象是可以被回收的? 可达性分析

该方案是对象判活的主要方案基本思想就是将所引用的对象想象成一棵树,从树的根节点 GC Roots 出发持续遍历找出所有的树枝对象,这些对象被称之为"可达"对象或者 "存活对象",其余的对象则被视为"死亡"的不可达对象,或称"垃圾"GC Roots 本身一定是可达的,这样从他们出发 遍历到的对象才能保证一致可达,那么 Java 中哪一些对象一定是可达的呢?或者是哪一些可以作为 GC Roots 呢问题:可以作为 GC Roots 的对象虚拟机栈(帧栈中的本地变量表)中的引用的对象方法区中静态属性引用的对象方法区 中常量引用的对象本地方法栈中 JNI 引用的对象

4、论述 Java 中的几种引用类型,并说明每种引用类型的回收时机。

1)强引用:不会被回收

new一个Obiect存放在堆内存,然后用一个引用指向它,这就是强引用。如果一个对象具有强引用,那垃圾回收器就不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

2)软引用:仅在内存不足时,随时有可能被回收

如果一个对象只具有软引用,则内存空间足够时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

3)弱引用:随时有可能被回收

每次执行GC的时候,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

4)虚引用:随时有可能被回收

如果一个对象仅持有虚引用那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

5、新生代的回收方式?

由于新生代中的对象几乎都是朝生夕死”的(达 到 98%),现在的商业虚拟机都采用复制算法来回收 新生代。由于新生代的对象存活率低,所以并不需要 按照 11 的比例来划分内存空间,而是将内存分为 一块较大的 Eden 空间和两块较小的 From Survivor 空间、To Survivor 空间,三者的比例为 811。每 次使用 Eden From Survivor 区域,To Survivor 作 为保留空间。GC 开始时,对象只会存在于 Eden 区和 From Survivor 区,To Survivor 区是空的。GC 进行时, Eden 区中所有存活的对象都会被复制到 To Survivor 区,而在 From Survivor 区中,仍存活的对象会根据 它们的年龄值决定去向,年龄值达到年龄阀值(默认 为 15,新生代中的对象每熬过一轮垃圾回收,年龄值 就加 1)的对象会被移到老年代中,没有达到阀值的 对象会被复制到 To Survivor 区。接着清空 Eden 区和 From Survivor 区,新生代中存活的对象都在 ToSurvivor 区。接着, From Survivor 区和 To Survivor 区会交换它们的角色,也就是新的 To Survivor 区就是 上次 GC 清空的 From Survivor 区,新的 From Survivor 区就是上次 GC To Survivor 区,总之,不 管怎样都会保证 To Survivor 区在一轮 GC 后是空的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试题--JVM垃圾回收及内存管理 的相关文章

  • SRGAN实现超分辨率图像重建之模型复现

    1 论文介绍 1 1简介 论文名称 Photo Realistic Single Image Super Resolution Using a Generative Adversarial Ledig C Theis L Huszar F
  • JavaSE-自定义队列+两栈实现队列+两队列实现栈

    1 顺序队列实现 与栈一样 xff0c 队列也是一种操作受限制的线性表 xff0c 但与栈不同的是 xff0c 栈是后进先出 xff0c 队列的特点是先进先出 实现与栈类似 xff0c 队列有一个队头指针和一个队尾指针 xff0c 入队的时
  • JavaSE-八大经典排序算法及优化算法思路与实现

    目录 1 冒泡排序 1 1算法思想 1 2 算法实现 1 3 算法优化 1 4 算法分析 2 简单选择排序 2 1 算法思想 2 2 算法实现 2 3 算法优化 2 4 算法分析 3 直接插入排序 3 1 算法思想 3 2 算法实现 3 3
  • 快速超分辨率重建卷积网络-FSRCNN

    1 网路结构图 2 改进点 SRCNN缺点 xff1a SRCNN将LR送入网络前进行了双三次插值上采样 xff0c 产生于真实图像大小一致的图像 xff0c 会增加计算复杂度 xff0c 因为插值后图像更大 xff0c 输入网络后各个卷积
  • PriorityQueue(优先级队列)的解读与底层实现

    目录 1 什么是优先级队列 xff1f 2 优先级队列的特性 3 如何使用优先级队列 4 JDK源码分析 4 1类的继承关系 4 2类的属性 4 3常用的方法 5 自定义优先级队列实现 5 1 优先级队列类定义 5 2 add 方法 5 3
  • HashMap的使用与底层结构剖析

    目录 一 基础概念 二 先使用再了解 三 底层结构 1 HashMap结构 xff08 JDK1 8以前 xff09 2 HashMap结构 xff08 JDK1 8以后 xff09 四 HashMap实现 1 成员变量 2 put实现 3
  • 线程基础与使用测试

    目录 一 进程和线程 二 线程的创建 1 继承Thread类 xff0c 重写run 方法 2 实现Runnable接口 xff0c 重写run方法 3 匿名线程 xff0c 匿名内部类 4 实现Callable接口 xff0c 重写cal
  • 线程生命周期及常用方法的使用

    一 守护线程 守护线程是什么 xff1f 守护线程是一类比较特殊的线程 xff0c 一般用于处理后台的工作 xff0c 比如JDK的垃圾回收线程 守护线程的作用 xff1f JVM xff08 Java Virtual Machine xf
  • git合并被fork的仓库的远程分支

    如果你 fork 了一个仓库并在自己的 forked 仓库中进行了更改 xff0c 而原始仓库也有一些更新 xff0c 此时想将原始仓库的更新合并到你的 forked 仓库 xff0c 可以按照以下步骤 xff1a 1 将原始仓库添加为远程
  • Linux-基础知识及常见操作命令汇总

    目录 1 终端操作 2 命令手册 3 关机重启 4 runlevel 5 目录结构 6 文件属性 7 Linux文件属主和属组 8 目录常用命令 9 VIM命令 10 进程管理命令 1 进程状态 2 ps命令 3 pstree命令 jobs
  • 关键字synchronized与volatile详解

    在多线程并发编程中synchronized和volatile都扮演着重要的角色 xff0c synchronized一直是元老级角色 xff0c 很多人都会称呼它为重量级锁 但是 xff0c 随着Java SE 1 6对synchroniz
  • 迁移学习与Transformer架构

    迁移学习 迁移学习干什么的 xff1f 迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务 Eg xff1a 学习识别苹果可能有助于识别梨 xff0c 学习骑自行车可能有助于学习骑摩托车 xff0c 学习打羽毛球可能有助于学习打网
  • 生产者消费者模型分析与实现

    生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题 生产者和消费者彼此之间不直接通讯 xff0c 而通过阻塞队列来进行通讯 xff0c 所以生产者生产完数据之后不用等待消费者处理 xff0c 直接扔给阻塞队列 xff0c 消费
  • ConcurrentHashMap优点与源码剖析

    哈希表是中非常高效 xff0c 复杂度为O 1 的数据结构 xff0c 在Java开发中 xff0c 我们最常见到最频繁使用的就是HashMap和HashTable xff0c 但是在线程竞争激烈的并发场景中使用都不够合理 HashMap
  • IO-字节流

    文件 amp File类的使用 1 文件的概念 文件可以分为文本文件 二进制文件 2 IO流的概念 流是有顺序 有起点和终点的集合 xff0c 是对数据传输的总称 流的本质就是用来对数据进行操作 IO是我们实现的目的 xff0c 实现这个目
  • STM32F407的TCP编程出现客户端无法连接上服务器,DHCP获取IP失败,服务器重启客户端无法自动重连问题解决方案

    单写一篇文章记录这些问题 xff0c 因为有的问题实在是困扰了我太久太久了 xff0c 终于解决了 xff01 xff01 xff01 1 STM32F407的TCP编程 xff0c TCP SERVER测试完全正常 xff0c TCP C
  • SQL练习汇总(查询“01“课程比“02“课程成绩高的学生的信息及课程分)

    1 学生表 Student SID Sname Sage Ssex SID 学生编号 Sname 学生姓名 Sage 年龄 Ssex 学生性别 编号 姓名 年龄 性别 1 赵雷 20 男 2 钱电 20 男 3 孙风 21 男 4 吴兰 1
  • JDBC编程,SQL注入与连接池

    JDBC概念 JDBC Java Data Base Conection 是java中提供的一套标准的应用编程接口 xff0c 用来连接Java编程语言和数据库 JDBC常用组件 xff1a DriverManger xff1a 数据库驱动
  • Pytorch搭建基于SRCNN图像超分辨率重建模型及论文总结

    SRCNN xff08 Super Resolution Convolutional Neural Network xff09 论文出处 xff1a Learning a Deep Convolutional Network for Ima
  • 技术领域的面试总结

    在当今互联网中 xff0c 虽然互联网行业从业者众多 xff0c 不断崛起的互联网公司也会很多 xff0c 仍然是很多同学想要进入的企业 那么本篇文章将会为大家很直白的讲解面试流程以及侧重点 仔细阅读本篇文章 xff0c 绝对会有所收获 x

随机推荐

  • Mybatis基于XML与基于注解实现CRUD

    数据库 实体类Student package com pojo Description Created by Resumebb Date 2021 3 26 public class Student 和数据库中的STudent表对应 pri
  • Spring-IOC容器进行对象管理

    目录 IOC概念 IOC思想 Spring管理对象 集成依赖 spring的配置文件 xff08 Applicationcontext xml xff09 创建实体类User Spring对Bean的实例化方式 基于配置形式 1 通过无参构
  • Spring-AOP原理及实现

    Spring AOP AOP Aspect Oriented Programing 面向切面编程 xff1a 扩展功能不通过修改源代码实现 AOP采用横向抽取机制 xff0c 取代传统纵向继承体系实现响应的功能 xff08 性能监控 事务
  • Spring&Mybatis整合及Spring中JDBCTemplate的使用

    Spring和Mybatis整合 在mybatis中 xff0c 操作数据库需要获取到SQLSession对象 xff0c 而该对象的实例过程在mybatis是通过SQLSessionFactoryBuilder读取全局配置文件来实例化一个
  • SpringMVC设计模式

    什么是MVC MVC是模型 Model 视图 View 控制器 Controller 的简写 xff0c 是一种软件设计规范 是将业务逻辑 数据 显示分离的方法来组织代码 MVC主要作用是降低了视图与业务逻辑间的双向偶合 MVC不是一种设计
  • SSM框架整合

    整合思路 主要分为Controller xff0c service层 xff0c dao层 整合dao mybatis和spring的整合 xff0c 通过spring来管理mapper接口 xff0c 数据源 xff0c 使用mapper
  • SSM框架实战-搭建自己的个人博客1-基础架构搭建

    前言 本系列文章主要通过从零开始搭建自己的个人博客 xff0c 来加深对SSM框架的学习与使用 xff0c 了解一个系统从提出到设计 到开发 到测试 部署运行的过程 xff0c 并记录在搭建过程中的学习心得 遇见的错误及解决方式 代码放在g
  • SSM框架实战-搭建自己的个人博客2-UEditor编辑器的使用

    目录 UEditor 博客内容提交与展示功能测试 Controller开发 新增博客页面add ueditor jsp 博客详情界面detail jsp 博客新增和展示详情功能开发 博客存储 博客标题开发 标签POJO类 TagMapper
  • SSM框架实战-搭建自己的个人博客3-登录实现及前端界面设计

    目录 后台登录功能 前端页面 后端开发 前端界面设计 详情首页 js脚本 SSM整体设计 Dao层 Service层 Mapper xml Controller 子博文界面 部署至服务器 后台登录功能 登录页面 xff1a 用户名和密码 通
  • 超分辨率重建-PNSR与SSIM的计算(RGB、YUV和YCbCr互转)

    RGB YUV和YCbCr 自己复现的网络跑出来的模型进行预测的时候 xff0c 不知道为啥算出来的结果比论文中要低好多 不论scale factor为多少 xff0c 我算出来的结果均普遍低于论文中给出的 xff0c PSNR大概低个1
  • 如何写简历

    注意点 xff1a 篇幅 校招一页 社招二页 谨慎使用精通 精通 gt 熟悉 xff08 推荐使用 xff09 gt 掌握 xff08 推荐使用 xff09 gt 了解 xff08 推荐使用 xff09 拿不准的不要写在简历上 突出自己技能
  • SSM框架实战-搭建自己的个人博客4-文章管理与展示

    实现功能 主要实现上图所示的功能 xff0c 从数据库中查询到所有文章数据 xff0c 并进行显示如标题 xff0c 栏目等信息 xff0c 可以通过分类查询文章 xff0c 通过标签查询文章 xff0c 也可以通过搜索进行模糊查询 xff
  • Pytorch加载与保存模型(利用pth的参数更新h5预训练模型)

    前言 以前用Keras用惯了 xff0c fit和fit generator真的太好使了 xff0c 模型断电保存搞个checkpoint回调函数就行了 近期使用pytorch进行训练 xff0c 苦于没有类似的回调函数 xff0c 写完网
  • 如何用pyplot优雅的绘制loss,acc,miou,psnr变化曲线

    前言 TensorFlowBoard过于强大 xff0c 导致我对它依赖性很强 xff0c 今年转手使用pytorch进行开发 xff0c 本以为没了TensorFlowBoard xff0c 后来发现人家Tensorflow封装了个Ten
  • Pytorch实现CA,SA,SE注意力机制

    通道注意力CA class ChannelAttention nn Module def init self in planes ratio 61 16 super ChannelAttention self init self avg p
  • Python使用OpenCV按自定义帧率提取视频帧并保存

    在做室外语义分割 视觉导航与定位的时候 xff0c 通常会用对一个连续的视频帧进行测试 xff0c 除去常用数据集外 xff0c 也经常会自己制作一些数据集 xff0c 这个工具类可以按需求对视频进行分帧提取 xff0c 封装好了直接可以使
  • 悲观锁与乐观锁详解

    悲观锁 悲观锁顾名思义是从悲观的角度去思考问题 xff0c 解决问题 它总是会假设当前情况是最坏的情况 xff0c 在每次去拿数据的时候 xff0c 都会认为数据会被别人改变 xff0c 因此在每次进行拿数据操作的时候都会加锁 xff0c
  • 亚像素卷积网络(ESPCN)学习与Pytorch复现

    论文内容 论文地址 xff1a Real Time Single Image and Video Super Resolution Using an Efficient Sub Pixel Convolutional Neural Netw
  • Lock锁和ReentrantLock锁

    前言 JDK 1 5中提供的锁的接口java util concurrent locks Lock xff0c 其提供了一些ReentrantLock ReentrantReadWriteLock实现类 参考JDK文档 xff1a Java
  • 面试题--JVM垃圾回收及内存管理

    选择题 1 以下哪些内存区域属于 JVM 规范 xff1f xff08 xff09 A 方法区 B 实例变量 C 静态变量 D 程序计数器 E 虚拟机栈 正确答案 xff1a A D E 解析 xff1a Java虚拟机规范划分了七个内存区