当前位置: 首页 > news >正文

10道JVM经典面试题

1、 JVM中,new出来的对象是在哪个区?

2、 说说类加载有哪些步骤?

3、 JMM是什么?

4、 说说JVM内存结构?

5、 MinorGC和FullGC有什么区别?

6、 什么是STW?

7、 什么情况下会发生堆/栈溢出?

8、 你了解几种垃圾回收器,简单说说?

9、 垃圾回收算法你了解吗?

10、 如果对象的引用被置为null,会被马上回收吗?

1、 JVM中,new出来的对象是在哪个区?

new出来的对象放在堆里,对象的引用放在栈里。

2、 说说类加载有哪些步骤?

类加载分三步:加载、连接(验证、准备和解析)和初始化。

加载:class文件加载到JVM内存(静态变量、常量放到方法区),产生Class对象。

验证:验证class文件是否格式正确。

准备:为静态变量分配内存并设置默认的初始值

解析:将符号引用替换为直接引用 (栈帧里的动态链接也有一步符号引用转变为直接引用)

初始化:为类的静态变量赋予正确的初始值。

3、 JMM是什么?

JMM是java内存模型,是一种规范,与线程共享有关,堆和方法区所有线程共享,需要对其制定规则规范。主内存:java所有变量都存储在主内存中。工作内存/线程本地内存:本线程用到的变量为主存中的副本拷贝。

4、 说说JVM内存结构?

共享区域:堆、方法区

私有区域:虚拟机栈、程序计数器、本地方法栈。

堆:对象和数组、字符串常量池。

方法区:常量、静态变量,运行时常量池(字面量和符号引用)。

虚拟机栈:局部变量、对象引用。

程序计数器:记录线程执行位置,以便下一次继续执行。

本地方法栈:是一些native方法(c++实现)

5、 MinorGC和FullGC有什么区别?

MinorGC发生在年轻代,当eden区满了之后会触发MinorGC.

FullGC发生在老年代,它会暂停所有线程回收年轻代和老年代的对象。

6、 什么是STW?

STW(STOP THE WORLD)GC前会执行STW操作。线程进入JVM设置的“安全点”,暂停所有运行中的线程,stop the world,然后开始GC。

7、 什么情况下会发生堆/栈溢出?

递归容易发生栈溢出。 堆溢出:对象一直增大,不释放。 比如循环里一直list.add

8、 你了解几种垃圾回收器,简单说说?

Serial单线程串行回收器、Parallel并行回收器、CMS回收器、G1回收器、ZGC回收器。

Serial是年轻代串行回收器,采用复制算法。

Serial Old是老年代串行回收器,采用标记整理算法。

Parallel Scavenge是年轻代并行回收器,采用复制算法。

Parallel Old是老年代并行回收器,采用标记整理算法。

ParNew是年轻代并行回收器,采用复制算法,与Scavenge的区别是它能够与CMS结合。

CMS是老年代回收器,采用标记清除算法,特点是低停顿时间,但牺牲一定的吞吐量。

G1回收器是JDK9默认的回收器,废除了空间上的区域划分,而是采用一个个独立的region区域组成,逻辑上保留了分代策略。

ZGC是JDK11引入的回收器,是一种低延迟的回收器。

9、 垃圾回收算法你了解吗?

有引用计数器算法、复制算法、标记清除算法、标记整理算法。

引用计算器就是对象被别人引用时,它的计数器加1,引用结束就减1,对象的计数器值为0就回收。

标记清除根据根节点寻找可达对象,如果不可达就回收,可达性分析法就是挑选一个稳定的对象作为GCROOT,然后寻找可达的对象,不可达就回收。

复制算法把空间分钟两块,回收的时候就把未使用的复制到另一块区域,然后满了就删除本区域,从头到尾只使用一块空间,另一块作为存放回收时未使用的部分。

标记整理算法在标记-清除算法的基础上做了一些优化。在一块内存空间内,标记可达的对象,压缩到内存的一边,然后删除其他对象,这样就不会产生内存碎片。

10、 如果对象的引用被置为null,会被马上回收吗?

不会,在下一个垃圾回收周期中,这个对象是可被回收的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 时间序列预测 — — ARIMA模型(理论分析与代码详解)
  • lua 写一个 不同时区之间转换日期和时间 函数
  • qt 如何制作动态库插件
  • SSH不用每次都输入密码的方法
  • Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题
  • Python机器学习实战:分类算法K近邻
  • Neuron协议网关的北向应用插件开发
  • mysql之视图的创建以及查询;
  • uboot的mmc partconf命令
  • 谷粒商城实战笔记-56~57-商品服务-API-三级分类-修改-拖拽功能完成
  • 前端Vue项目中腾讯地图SDK集成:经纬度与地址信息解析的实践
  • GD32 MCU电源复位和系统复位有什么区别
  • FastGPT 源码调试配置
  • mesa LLVMpipe ORCJIT 上游化:一场历时两年的后端合并马拉松,幕后英雄竟是 TA!
  • 基于 HTML+ECharts 实现监控平台数据可视化大屏(含源码)
  • SegmentFault for Android 3.0 发布
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 77. Combinations
  • Brief introduction of how to 'Call, Apply and Bind'
  • Golang-长连接-状态推送
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mysql外键的使用
  • SQLServer之创建显式事务
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 排序(1):冒泡排序
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何进阶一名有竞争力的程序员?
  • 入口文件开始,分析Vue源码实现
  • 实现简单的正则表达式引擎
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • zabbix3.2监控linux磁盘IO
  • 整理一些计算机基础知识!
  • ​​​【收录 Hello 算法】9.4 小结
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (k8s)kubernetes集群基于Containerd部署
  • (Ruby)Ubuntu12.04安装Rails环境
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (动态规划)5. 最长回文子串 java解决
  • (面试必看!)锁策略
  • (三)elasticsearch 源码之启动流程分析
  • (三)Honghu Cloud云架构一定时调度平台
  • (十六)视图变换 正交投影 透视投影
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net dataexcel winform控件 更新 日志
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 依赖注入和配置系统
  • .NET6实现破解Modbus poll点表配置文件