面试系列之JVM

2023-11-10

说说JVM的内存模型?

方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据

堆:存放对象实例,几乎所有的对象实例都要在堆上分配

程序计数器:当前线程所执行的字节码的行号指示器

虚拟机栈:描述的是Java方法执行的内存模型

本地方法栈:为虚拟机使用到的native方法服务

 

讲讲什么情况下回出现内存溢出,内存泄漏?

内存溢出 out of memory:指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory(比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出);

内存泄露 memory leak:指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,最终内存泄漏将导致内存溢出;

 

常见JVM启动内存参数设置?

-Xms:设置java程序启动时初始堆内存大小

-Xmx:设置java程序能获得的最大堆内存大小

-Xmn:可以设置新生代的大小

-XX:PermSize 设置非堆内存初始值(JDK8版本开始移出)

-XX:MaxPermSize 设置最大非堆内存的大小(JDK8版本开始移出)

 

聊聊MinorGC 和FullGC?

MinorGC发生在新生代的垃圾收集动作,当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了;

FullGC发生在老年代的垃圾收集通常发生Full GC意味着至少发生了一次Minor GC(直接出生早老年代的除外),Full GC因为都是大对象回收,所以通常速度要比Minor GC慢很多;

 

JVM中大对象如何进行分配?

大对象,指的就是需要大量连续内存空间的Java对象,比较典型的大对象就是那种很长的字符串以及数组,经常出现大对象容易导致当内存空间还有很多的时候就提前触发收集器收集以获取足够连续的内存空间;

虚拟机提供一个可控制的参数:-XX:PretenureSizeThreshold来设置对象直接进入老年代的阈值,当对象大于这个值直接进入老年代,这样做是为了避免在Eden区和Survivor区之间发生大量的内存复制;

 

如果A和B对象循环引用,是否可以被GC?

判断一个对象是否会被GC主要是判断该对象的引用链中是否有关联对象跟GC ROOT根相关联,如果没有跟root关联,即使A和B循环关联,AB也会被GC处理掉;

 

jvm gc如何判断对象是否需要回收,有哪几种方式?

引用计数算法和可达性分析算法

 

Java中能不能主动触发GC?

可以,调用System.gc(),但是该方式不会立即使JVM触发GC,只是通知JVM尽快执行GC,具体还是由JVM自己调度;

 

垃圾回收算法有哪些?

引用计数:在对象被其他对象所引用时计数器加1,而当引用失效时则减1,缺点:无法处理循环引用的情况,还有就是每次进行加减操作比较浪费系统性能;

标记-清除:分为标记和清除两个阶段:首先标记出所有需要回收的对象,然后统一回收掉所有标记的对象,缺点:存在空间碎片问题,这种情况下,当程序在后期运行过程中需要分配较大对象时,无法找到足够的连续内存,而不得不提前触发垃圾回收,不连续的内存空间的工作效率要低于连续的内存空间;

复制算法:将内存等分成2块,每次只使用其中一块在垃圾回收时,将正在使用的内存中的存留对象复制到未被使用的内存块中去,之后去清除之前正在使用的内存块中所有的对象,反复去交换俩个内存的角色,完成垃圾收集,此算法不需要考虑内存碎片问题,缺点:真正可用的内存其实只有总内存1/2(Java中新生代的from和to空间就是使用这个算法);

标记-压缩:标记-压缩算法是在标记-清除的基础上做的优化,也是先标记,但是标记完不是直接清理,而是先压缩,把存活的对象压缩到内存的一端,然后再将存活对象端边界以为的内存对象直接清理掉,减少了空间碎片问题,同时也解决了复制算法的1/2内存牺牲问题;

分代收集算法:根据对象的存活周期不同,将内存划分为N块,然后根据每个内存的特点使用不同的算法;

分区算法:将整个内存分为N多个小的独立空间,每个小空间都可以独立使用,这样细粒度的控制一次回收多少个小空间和哪些小空间,而不是对整个空间进行GC,从而提升性能,并减少了GC的停顿时间

 

JVM是怎么进行垃圾回收的?

一般将Java堆分为新生代和老年代,在新生代每次收集有大量对象死亡,只有少量对象存活,比较适合复制算法(牺牲少量存活对象的复制为代价就能完成收集),老年代中因为对象存活率高,没有额外的空间使用,就必须使用标记-清除或者标记-压缩算法来进行回收

新生代:新生代的对象生死周期比较短,新生代将内存分为一块较大的Eden区和两块较小的Survivor区,每次使用Eden和其中的一块S1,当垃圾回收时,将Eden和S1中还存活的对象一起拷贝到另一块S2上,最后清除掉Eden和S1区;

 

Java的类加载机制,什么是双亲委派?

类加载生命周期:

双亲委派:某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载;

 

JVM堆和栈的区别?

堆主要放new的对象,而栈放基本类型和句柄,句柄指向的是堆

垃圾回收的时候回收的是堆,栈比较难回收,一般不回收

 

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

面试系列之JVM 的相关文章

随机推荐

  • Java集合Collection常用知识点归纳

    Java集合Collection常用知识点归纳 关系图解 一 常用集合分类 Collection List 接口 extends Collection lt E gt 元素按进入先后有序保存 可重复 单列集合 ArrayList 接口实现类
  • 铨顺宏智能RFID图书管理应用

    一 RFID图书管理应用背景 铨顺宏智能RFID图书档案管理应用 图书借还 快速盘点 查找 乱架图书整理等问题一直困扰着图书馆的管理及工作人员 铨顺宏通过图书馆的RFID系统建设 将简化读者的借阅流程 提高流通效率 大幅度降低图书清点和查找
  • pyecharts图表库学习:Bar(柱状图/条形图)、Bar3D(3D 柱状图)

    柱状 条形图 通过柱形的高度 条形的宽度来表现数据的大小 Bar add 方法签名 add name x axis y axis is stack False bar category gap 20 kwargs name gt str 图
  • C语言函数大全-- x 开头的函数(1)

    x 开头的函数 1 1 xdr accepted reply 1 1 函数说明 1 2 演示示例 1 2 1 accepted reply 1 2 2 Test c 2 xdr array 2 1 函数说明 2 2 演示示例 3 xdr a
  • 第四届蓝桥杯JavaB组省赛- 有理数类

    第四届蓝桥杯JavaB组省赛 有理数类 题目描述 有理数就是可以表示为两个整数的比值的数字 一般情况下 我们用近似的小数表示 但有些时候 不允许出现误差 必须用两个整数来表示一个有理数 这时 我们可以建立一个 有理数类 下面的代码初步实现了
  • Linux系统报错NMI watchdog: BUG: soft lockup - CPU#5 stuck for 24s

    目录 一 问题描述 二 解决方法 1 将 watchlog thresh 临时设置为 30 2 将 watchlog thresh 永久设置为 30 3 将 watchlog thresh 写入启动文件 一 问题描述 Linux 系统响应变
  • Wce中的source文件中的RELEASETYPE类型

    1 E WINCE600 PLATFORM EAuto657t Src Media au1300 wince subproject sources RELEASETYPE LOCAL 2 E WINCE600 PLATFORM EAuto6
  • 【STM32Cube】学习笔记(五):红外避障传感器

    文章目录 摘要 一 简介 1 GPIO简介 2 红外避障传感器 3 性能参数 二 硬件电路设计 1 模块内部电路 2 与单片机相连接电路 三 软件设计 1 CubeMX配置 2 CubeIDE代码 四 结果显示 五 总结 附录 摘要 本篇文
  • FastJson序列化null值问题

    在使用fastjson进行序列化时 他默认当字段为null时是不会序列化这个字段的 当你需要将null序列化出来时 可以用 JSONField的serialzeFeatures属性加在字段上 JSONField serialzeFeatur
  • python 正则提取邮箱_python利用正则表达式提取字符串

    前言 正则表达式的基础知识就不说了 有兴趣的可以点击这里 提取一般分两种情况 一种是提取在文本中提取单个位置的字符串 另一种是提取连续多个位置的字符串 日志分析会遇到这种情况 下面我会分别讲一下对应的方法 一 单个位置的字符串提取 这种情况
  • 计算机文档保存了在文件夹中找不到,word文档保存后找不到了如何解决

    word文档保存后找不到了如何解决 腾讯视频 爱奇艺 优酷 外卖 充值4折起 相信很多小伙伴都在使用Word软件来编辑文档 在使用的过程中 总会遇到这样那样的问题 今天就跟大家介绍一下word文档保存后找不到了的具体解决方法 1 打开电脑上
  • 一个TCP长连接设备管理后台工程(六)---封包器与处理器

    封包器 上面介绍了过滤器 过滤器实际就是一个能够处理粘包和拆包的解析器 和封包器的作用正好相反 但是封包器会很简单 因为封包没有粘包和拆包的处理 代码如下 Packer is proto Packer api func Packer msg
  • autocomplete实现原理

    autocomplete实现原理主要用在input 和 textarea这两个标签上 为这标签增加键盘监听事件和提示列表添加鼠标事件 例如 input的id为txt 为input增加键盘监听事件 keyup var mindex 1 txt
  • postman使用教程——接口测试

    Postman 之前是作为Chrome 的一个插件 现在要下载应用才能使用 以下是postman 的界面 各个功能区的使用如下 快捷区 快捷区提供常用的操作入口 包括运行收藏夹的一组测试数据 导入别人共享的收藏夹测试数据 Import fr
  • 程序设计和C语言

    TOC程序设计和C语言 1 什么是计算机程序 一组计算机能够识别和执行的指令 计算机本质就是程序的机器 2 什么是计算机预言 机器指令 计算机能直接识别和接受的二进制代码 机器语言 机器指令的集合 符号语言 又称为汇编语言 计算机的低级语言
  • 新手月入10k很难?方法是关键!写给迷茫的测试从业者!

    关于软件测试行业前景 行业薪资 一直都是准备转行 刚刚入行甚至是在职一 两年的朋友密切关注的问题 毕竟这关系着自己未来的 钱途 也决定着自己的职业发展路线 那软件测试员 究竟该如何规划职业发展之路 如何才能月薪过万 作为过来人 分享一下我的
  • yarn清理缓存命令

    1 查看yarn全局缓存目录 yarn cache dir 2 清除缓存 yarn cache clean
  • 服务器安装文件共享软件权限,服务器共享文件权限

    服务器共享文件权限 内容精选 换一换 文件系统创建完成后 用户需在客户端挂载文件共享 在本地共享目录和CSG的文件共享建立映射 通过操作本地的目录实现对CSG共享目录的操作 实现数据实时上云管理 本章节主要介绍在Windows Server
  • 面试了30多家大厂后,整合出这份1658 页《Java 面试突击核心讲》

    面试神技 主要包含 Java 基础 JVM 多线程 MySQL Spring SpringBoot SpringCloud 分布式 Dubbo Mybatis Redis 网络 Linux MQ Zookeeper Netty 大数据 算法
  • 面试系列之JVM

    说说JVM的内存模型 方法区 存储已被虚拟机加载的类信息 常量 静态变量 即时编译后的代码等数据 堆 存放对象实例 几乎所有的对象实例都要在堆上分配 程序计数器 当前线程所执行的字节码的行号指示器 虚拟机栈 描述的是Java方法执行的内存模