首页 > 其他分享 >JVM高频面试题

JVM高频面试题

时间:2024-07-16 20:00:00浏览次数:16  
标签:面试题 标记 对象 虚拟机 回收 内存 JVM 高频 加载

1. 内存模型

线程独享: 虚拟机栈, 本地方法栈, 程序计数器

线程共享: 堆, 方法区

2. 虚拟机栈的作用

存放栈帧, 栈帧又包含局部变量表, 每个方法从被调用到执行结束的过程都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程

3. 程序计数器

存放下一条指令的信息

4. 堆

Java堆是被所有线程共享的区域, 存放几乎所有的对象实例, 是垃圾回收器管理的区域

5. 方法区

存放已加载的类信息, 常量, 静态变量, 编译后的代码缓存

6. 对象的内存布局

  • 对象头:

    • 存储对象自身的运行时数据, 如锁状态, GC年龄分代, 线程持有的锁
    • 类型指针, 指向它的类型元数据,
    • 如果对象是个数组, 那么还有一块用于记录数组长度的数据,
  • 实例数据:程序代码里定义的各种类型的字段.这部分的顺序会收到虚拟机分配策略参数的影响.

  • 对齐填充: 不是必要的, 但是必须保证任何对象的大小都是8字节的整数倍

7. 对象时如何访问定位的

  • 句柄访问
  • 直接指针访问

8. 对象已死

  • 引用计数法

  • 可达性分析

9. 引用

  • 强引用: 最传统的引用, 无论在任何情况下, 只有有强引用, 就不会被回收
  • 软引用: 用来描述还有用, 但是非必要的对象, 在系统将要发生内存溢出前才会被回收
  • 弱引用: 用来描述非必要的对象, 只要垃圾回收器开始工作,就会被回收
  • 虚引用: 最弱的引用关系, 只是为了能在该对象被回收时得到系统的通知

10. 垃圾收集算法

  • 标记-清除: 先标记需要回收的对象, 再统一回收
  • 标记-复制: 将内存划分成相等两块, 一块用完了就把存活的对象复制的另一边, 以此往复, 但是为了避免浪费太多空间, 而且大部分对象具有朝生夕死的特性,现在采用Elden:Survivor=8:1 的方式, 每次都将 Elden 和 正在用的那块Survivor 空间复制到另一块空闲的Survivor, 以此往复
  • 标记-整理: 回收对象后, 将所有存活的对象向内存空间的一端移动, 然后直接清理边界以外的内存. 可以避免内存空间过于碎片化, 有利于内存分配

11. CMS 收集器

CMS (Concurrent Mark Sweep), 基于 标记-清除算法,

运作过程: - 初始标记, - 并发标记, -重新标记, - 并发清楚

优点: 并发收集, 低停顿

缺点: 对处理器资源敏感, 无法处理浮动垃圾, 会产生大量空间碎片

12. G1 收集器

G1 (garbage first) 收集器, 面向服务端, 是一款全功能垃圾收集器, 开创基于Region的堆内存布局.能实现在指定长度为M毫秒的时间片段内, 消耗在垃圾收集上的时间不超过N毫秒的功能.

运作过程: - 初始标记, - 并发标记, - 最终标记, - 筛选回收

13. 内存分配的策略

  • 对象优先在 Eden 分配
  • 大对象直接进入老年代
  • 长期存活的对象进入老年代
  • 动态对象年龄判定
  • 空间分配担保

14. 常用 JVM 调优命令

jsp:虚拟机进程状况工具

jstat:虚拟机统计信息监视工具

jinfo:java配置信息工具

jmap:内存映像工具

jhat:虚拟机堆转存快照分析工具

jstack:java 堆栈跟踪工具

15. 类加载的流程

  • 加载: - 通过类的全限定名来获取此类的二进制字节流, - 将字节流转化为方法区的运行时数据结构 - 在内存中生成一个代表这个类的java.lang.Class对象, 作为数据的访问入口
  • 验证: 确保Class文件的字节流中包含的信息符合 <java虚拟机规范> 的全部要求
  • 准备: 为类中定义的标量赋初值, 注意区分初值与默认值,
  • 解析: 将常量池中的字符串替换为直接引用
  • 初始化: Java虚拟机开始执行编写的Java程序, 执行类构造器 () 方法,

16. 双亲委派模型

如果一个类加载器收到了类加载的请求, 首先会委派上一级的类加载器去完成, 每一次都是如此, 直到最顶层启动类加载器, 如果, 父级类加载器无法完成加载任务, 那么子类才会尝试自己去加载,

好处是, 程序运行时, 某一个类只会被某个特定的类加载器加载, 不会出现多个不同但是又同名的类, 保证了Java程序的稳定性

标签:面试题,标记,对象,虚拟机,回收,内存,JVM,高频,加载
From: https://blog.csdn.net/qq_42742845/article/details/140455865

相关文章

  • 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、 239. 滑动窗口最大值、347.
    150.逆波兰表达式求值题目:.-力扣(LeetCode)思路:遇到数字进栈,遇到符号出栈运算。代码:classSolution{public:intevalRPN(vector<string>&tokens){stack<longlong>sta;for(strings:tokens){if(s=="+"||s=="-"||s=="*"......
  • JVM方法区和永久代的区别(文章来源于文心一言)
    方法区和永久代的区别:一、定义与功能方法区(MethodArea)定义:方法区是JVM规范中定义的一个内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但它通常被称为“非堆”(Non-Heap),以......
  • 深入理解Java虚拟机(JVM)及其内部原理
    深入理解Java虚拟机(JVM)及其内部原理大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,了解Java虚拟机(JVM)的工作原理是非常重要的。本文将深入探讨JVM的内部结构和运行机制,帮助读者更好地理解和优化Java应用程序的性能。一、JVM的基本概念和组成......
  • 关于hash的面试题
    目录题目1.java里,HashMap的底层实现原理2.如何判断一个HashMap是否已经满了?3.HashSet如何检查重复4.HashSet如何判断一个元素是否已经存在.简单的理解hash题目选自牛客网1.java里,HashMap的底层实现原理数组结构:HashMap使用一个数组来存储元素。哈希函数:通过键......
  • 嵌入式C语言指针面试题大全(持续更新)
    什么是指针?指针在C语言中的作用是什么?在C语言中,指针是一种变量类型,它存储的是其他变量或数据结构的内存地址,而不是实际的数据值。指针允许程序员直接操作和管理内存,这是C语言的一个重要特性,也是它能够高效地处理资源和进行底层编程的原因之一。指针在C语言中有多种作用,包括......
  • 深入剖析hashCode和equals的区别及大厂面试题
    关于作者:毕业半年被裁,一个月斩获大厂offer,面试经验50+。“跟着周哥走,offer手里有”。文末免费领取周哥50+场面试总结出的必背面试题。首先我们要知道,equals()和hashCode()都属于Object类,而Object类是所有类(包括Class)的父类。搞清楚这一点,再分别解析equals和hashCode,......
  • 高频订单流时序成像及CNN预测
    文章来源于公众号:Logan投资往期文章精选高频因子--tick级别订单流因子计算(附代码)RSRS择时指标的150倍计算加速(有代码)二级:最近思考的量化指标再挖掘二级:手搓的择时指增一级:新能源汽车部件--CCS集成母排投研一级:轮胎行业的研究最近在交流群里跟大家交流了一下关于时......
  • Day10(栈与队列) | 150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元
    150.逆波兰表达式求值给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为'+'、'-'、'*'和'/'。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数之间的除法总是......
  • 高频面试问题总结(通用)
    目录一.个人信息相关1.请你做一下自我介绍。2.说一下自己的优点和缺点。3.为什么选择我们公司?4.请说一下你的职业规划。5.你还有什么问题要问吗?6.如果公司决定录用你,你什么时间可以到职?二.工作经历和能力相关1.简单介绍下你的校园经历。2.有实习经历吗?如果有的话请......
  • JVM相关面试题
    来自黑马程序员(新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)_哔哩哔哩_bilibili)目录5.1JVM组成面试官:JVM由那些部分组成,运行流程是什么?面试官:能不能解释一下方法区?面试官:你听过直接内存吗?面试官:什么是虚拟机栈面试官:能说一下堆栈的区别......