jvm面试题
1、虚拟机的类加载机制
1.1、什么是虚拟机的类加载机制
在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、准备、解析、初始化,使这些数据 最 终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做JVM的类加载机制。
从二进制字节流从加载到内存,到卸载出内存过程中有7个生命周期阶段,而类加载机制包括前五个阶段
如下图所示:
其中,加载、验证、准备、初始化、卸载的开始顺序是确定的,注意,只是按顺序开始,进行与结束的顺序并不一定。解析阶段可能在初始化之后开始。
2、 如何实现JAVA 类的动态加载
3、述一下JVM加载CLASS文件的原理机制
4、谈谈JAVA内存模型
java虚拟机规范中试图去定义一种方式,来屏蔽掉各种硬件和操作系统内存访问差异,来显现java程序在不同的平台都能够达到一致的内存访问效果,java内存主要目标是定义内存中各个变量的访问规则,规定所有变量都存储在主内存,每个线程都要自己工作内存(高速缓存,与主存是两个东西),对变量的所有操作都要在线程自己的工作内存中,操作完再放回到主内存中
5、如何分析JVM的异常
6、谈一下你GC?
GC指的是垃圾收集,GC需要完成三件事情
- 那些内存需要回收
- 什么时候回收
- 如何回收
引用计数法算法
- jvm给对象中添加一个 引用计数 器,每当有一个地方引用对象时,计数器就加1,当引用失效时,计数器就减1,计数器为0的对象,就说明需要回收
可达性分析算法
- 实际中jvm是通过可达性分析算法来判断哪些对象需要被回收的,这个算法基本的思路是 GC Roots的对象作为起始点,从在这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到
- GC Ronts对象没有任何引用链相连时,表示对象不可达。
(1) 标记-清除算法
这个算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,然后统一回收被 标记的对象,这个算法有两个问题,首先是效率问题,另一个是空间问题,标记清除之后,会产生大量的内存
碎片,空间碎片太多,以后在程序运行的过程,如果需要分配较大对象时,无法找到足够的连续内存而不得不触发另一次GC操作
(2) 复制算法
这个算法是解决标记-清除算法带来的空间太多碎片问题,将内存按容量划分为大小相等的两块 ,每次只使用其中的一块,当前块要用完时,就将还存活 的 对象,移动到另外一块上面,然后将当前块的内存空间一次清理掉。现在商业虚拟机都是采用复制算法来处理新生代,不过容量划分比例不是1:1,而是将内存划分为一块较大的eden空间和两块小的survivor(幸存者区),每次使用Eden和其中一块幸存者区间,当GC回收时,将eden和一块survivor中存活的对象,移动到另外一块Survivor空间上,最后清理掉eden区和刚才用过的幸存者区,像hotspot虚拟机eden区和survivor的比例是8:1。
(3) 标记整理算法
复制收集算法在对象存活率较高时要进行较多复制操作,效率会变低,有人就提出标记整理算法,标记整理不去划分内存空间,分为三个阶段,首先是把一块空间中可回收,存活的对象给标记出来, 然后把存存活的对象移动到当前块空间内的一端,然后清除掉边界以外的对象。
(4) 分代收集
当前商业虚拟机的垃圾收集都是采用分带收集,这种算法不是什么新的 思想,只是根据对象的存活周期,将不同的内存划分为几块,比如hotspot虚拟机,将java堆分为eden sapce(伊甸园) 、survivor space(幸存者区)、tenured Gen(老年代),伊甸园和幸存者区采用复制算法,老年代采用标记整理算法。
7、两个对象相互引用,会不会被GC?
首先两个对象相互引用,和会不会被GC没有直接关系。jvm是采用对象到GC Roots可达性来决定是否会被GC回收的。
8、什么是双亲委派模型?
在ClassLoader的结构中,还有一个重要的字段parent,它也是一个ClassLoader的实例,这个字段表示的ClassLoader也成为这个ClassLoader的双亲,自上而下,有启动类加载器,拓展类 加载器,应用加载器,自定义类加载器,jvm加载类是,默认会使用双亲委派模式.如果一个类加载器收到类加载请求,系统会判断当前类是否已经被加载,如果被加载,就会直接返回可用的类,否则就会先请求自己父类去加载,如果双亲加载失败,则会自己加载,每一个层次的类在加载器的都是如此。
9、java中的内存溢出是如何造成的?
https://www.cnblogs.com/lcword/p/5857909.html
10、HotSpot jvm包含哪些垃圾收集器?
- Serial收集器 (单线程新生代收集器,使用复制算法)
- parNew收集器(多线程并行新生代收集器,使用复制算法)
- parallel Scavenge收集器 (多线程并行新生代收集器,使用复制算法)
- Serial Old收集器(Serial收集器老年代版本单线程老年代收集器,使用标记-整理算法)
- parallel Old收集器(parallel Scavenge收集器老年代版本,采用标记-整理算法)
- CMS收集器(Concurrent Mark Sweep,多线程并发收集器,低停顿,采用标记-清除)
参考:http://blog.csdn.net/wfh6732/article/details/57490195?utm_source=itdadao&utm_medium=referral
11、CMS收集器的标记流程是什么?
- 初始标记
- 并发标记
- 重新标记
- 并发清除
12、jvm 什么情况下会触发minor gc?
当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如,堆内存分为年轻代 又分为 eden 区和 survivor 区,当eden满时 ,就会触发minor GC
13、jvm什么情况下回触发full gc?
首先理一下概念,CMS和Parnew只是一种垃圾回收算法,Parnew作用在新生代,CMS则作用在老年代。至于是在什么情况会发生Full GC?
根据经验来看存在以下几种情况什么发生FullGC:
1. 老年代的使用率达到阈值(通过JVM参数:CMSInitiatingOccupancyFraction设定,默认为92%)
2、永久代的使用率到达阈值CMSInitiatingPermOccupancyFraction设定,默认为92%)
3、当新生代对象沉淀到老年代时担保失败
https://blog.csdn.net/scugxl/article/details/50935863
14、jdk1.7 永久代和jdk1.8元空间的区别?
http://www.cnblogs.com/paddix/p/5309550.html
jvm面试题的更多相关文章
- 这道面试必问的JVM面试题70%的Java程序员会做错
前言 聊聊JVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别. JVM可以说和我们是老朋友了 ...
- 两道JVM面试题,竟让我回忆起了中学时代!
作者:肥朝 原文链接:https://mp.weixin.qq.com/s/4wJ6ANal0blLOseasfIuVw 中学授课模式 考虑到可能有部分粉丝对JVM参数不清楚,所以我们参照中学的授课模 ...
- JVM 面试题汇总
JVM 面试题汇总 1.什么是 JVM?它有什么作用? 答:JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,顾名思义它是一个虚拟计算机,也是 Java 程序能够实现跨平 ...
- 史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)
前言:最近老是收到小伙伴的私信问我能不能帮忙整理出一份JVM相关的面试题出来,说自己在大厂去面试的时候这一块问的是特别多的,每次自己学的时候每次都学不到重点去.这不他来了,一份详细的JVM面试真题给大 ...
- 常见JVM面试题及答案整理
常见JVM面试题及答案整理 1.什么情况下会发生栈内存溢出 2.JVM内存模型 3.JVM内存为什么要分成新生代,老年代,持久代.新生代中为什么要分为Eden和Survivor. 3.1共享内存区划分 ...
- JVM面试题(史上最强、持续更新、吐血推荐)
文章很长而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三部 ...
- 014 JVM面试题
转自:http://www.importnew.com/31126.html 本文从 JVM 结构入手,介绍了 Java 内存管理.对象创建.常量池等基础知识,对面试中 JVM 相关的基础题目进行了讲 ...
- 面试半年,凭借这份JVM面试题,我终于拿到了字节跳动的offer!
内存区域 虚拟机栈生命周期与线程相同,描述的是Java 方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存取局部变量表.操作数栈.动态链接.方法出口等信息本地方法栈与虚拟机栈作用相似,只 ...
- 30道 有趣的 的 JVM 面试题
目录 1.JVN内存结构 2.对象分配规则 3.解释内存中的栈(stack).堆(heap)和静态区(static area)的用法 4.Perm Space中保存什么数据?会引起OutOfMemor ...
- JVM 面试题,安排上了!!!
肝了一篇非常硬核的 JVM 基础总结,写作不易,小伙伴们赶紧点赞.转发安排起来! 原文链接 据说看完这篇 JVM 要一小时 JVM 的主要作用是什么? JVM 就是 Java Virtual Mach ...
随机推荐
- int和Integer之间的区别和联系
在工作中使用==埋下的坑这篇博文中,我们看到当使用基本类型的时候==是完全没有问题的,部分或者混合使用基本类型和装箱基本类型的时候,就可能出现问题了,那么我们可能会想基本类型和装箱基本类型 ...
- Flume与Logstash比较
Flume与Logstash相比,个人的体会如下: Logstash比较偏重于字段的预处理:而Flume偏重数据的传输: Logstash有几十个插件,配置灵活:FLume则是强调用户的自定义开发(s ...
- Oracle 12C -- 网络性能调优
1.传输数据压缩 网络性能主要受两方面影响:bandwidth和data volume. 在网络层对数据进行压缩,可以减少对网络带宽的需求.而且对应用是透明的. 如果是CPU是瓶颈时开启网络层数据压缩 ...
- 【转】Google 的眼光
Google 的眼光 你知道吗,Google(Alphabet)要卖掉 Boston Dynamics,一个它收购才没多久的机器人公司.这也意味着,Google 准备完全退出机器人的领域.新闻传言说, ...
- Linux引导启动程序 - boot
主要描述 boot/目录中的三个汇编代码文件,见列表 3-1 所示.正如在前一章中提到的,这三个 文件虽然都是汇编程序,但却使用了两种语法格式.bootsect.s 和 setup.s 采用近似于 I ...
- MySQL经常使用技巧
建表 每一个表都有一个id字段,最好为UNSIGNED.如 INT(9) UNSIGNED NOT NULL 在表使用一段时间后,使用PROCEDURE ANALYSE得到建议,如select * f ...
- Cmder 设置默认打开目录、解决中文乱码
win + alt + p //打开设置 选择Startup-Task,修改{cmd::Cmder}项,把: *cmd /k "%ConEmuDir%\..\init.bat" - ...
- xml中的<![CDATA[]]> 简介
被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”. 此标记用于xml文档中,我们先来看看使用转义符的 ...
- flock防止crontab脚本周期内未执行完重复执行(转)
如果某脚本要运行30分钟,可以在Crontab里把脚本间隔设为至少一小时来避免冲突.而比较糟的情况是可能该脚本在执行周期内没有完成,接着第二个脚本又开始运行了.如何确保只有一个脚本实例运行呢?一个好用 ...
- Java:集合,Arrays工具类用法
1. 描述 Arrays工具类提供了针对数组(Array)的一些操作,比如排序.搜索.将数组(Array)转换列表(List)等等,都为静态(static)方法: binarySearch - 使用二 ...