1. JVM运行时划分哪几个区域?哪些区域是线程共享的?哪些区域是线程独占的?

JVM运行时一共划分:程序计数器、虚拟机栈、堆、本地方法栈、方法区。

线程共享的数据区域:堆、方法区。

线程独享的数据区域区域:程序计数器、虚拟机栈、本地方法栈。

2. 这几个内存区域分别存放什么数据?

程序计数器记录当前线程执行的位置;

虚拟机栈存储基本数据类型以及对象的引用等;

堆存储对象实例;

本地方法栈与虚拟机栈类似,它为Native方法服务;

方法区存储被JVM加载的类信息、常量、静态变量等。

3. GC回收算法

(1)标记-清除算法:首先标记出需要回收的对象,标记完成后统一清除。此算法缺点是标记-清楚效率不高,且容易出现大量不连续的碎片空间。

(2)复制算法:将内存空间划分成两部分,每次只使用一个内存空间部分,当一个内存空间使用完,将会把存活的对象复制到另一空间,然后一次性清理掉该部分空间。此算法缺点是内存利用率较低,只有一半。

(3)标记-整理算法:和标记-清楚算法相同也是先标记出需要回收的对象,但在标记完成后不是直接清除而是将存活的对象像一侧进行移动,再清除边界之外的内存。

4. 这三种GC回收算法在JVM中是如何应用的?

GC主要发生在JVM的堆内存中,堆内存分为"新生代"和"老年代",新生代的GC称为"Minor GC",老年代的GC称为"Major GC"。

新生代中的GC算法使用复制算法:新生代中分为了Eden区和Survivor区(Survivor from和Survivor to),新产生的对象实例先在Eden区,Eden区满了过后再在Survivor from区,如果Survivor from区也满了后,将进行Minor GC(复制算法),将存活的对象复制到Survivor to区,此时清除Eden区和Survivor from区,此时Survivor from成为新的Survivor to。新的对象又将在Eden区域进行分配,周而复始。

老年代中的GC算法使用标记-清除算法/标记-整理算法,视具体的GC回收器而定。

5. 频繁的Full GC会带来什么问题?

CPU占用率过高,系统出现卡顿。

6. 什么是OOM内存溢出,它发生在哪块内存区域

OOM通常发生在堆内存上,指的是内存对象没有及时回收,造成没有多余的内存分配给新的对象,此时应该定位程序中是否在频繁创建对象而没有及时回收,或者设置JVM的参数-Xms、-Xmx。

但OOM还有一种情况发生在虚拟机栈,此时虚拟机栈并不是因为递归太深造成StackOverflow,而是的的确确发生了OOM。首先,虚拟机栈作为线程独享的内存区域,总的虚拟机栈内存大小有限,也就是可分配的线程大小有限,当每个虚拟机栈设置的内存大小过大时,此时可分配的线程大小就变少,继续创建过多的线程可能会导致无法再分配内存空间,造成虚拟机栈的OOM。此时的解决办法时,适当设置虚拟机栈的内存大小-Xss,以便能创建更多的线程。

7.常用的GC回收器有哪些,有什么特点?

CMS:通常对老年代的对象进行GC,基于标记-清除算法,是一个低停顿、并发收集的GC回收器。它的GC过程一共分为4个步骤:

①初始标记,标记GC Roots能关联的对象(即存活的对象),会停止用户线程。

②并发标记,不会停止用户线程,和用户线程一起工作标记可达对象。

③重新标记,标记因为在“并发标记”阶段新产生的对象。

④并发清除,同用户线程一起工作,清理需要清理的对象。

缺点:

①占用CPU资源

②无法处理并发标记期间产生的浮动垃圾

③由于采用标记-清楚算法,会产生大量的内存碎片

G1:应用于整个堆上的内存,物理上不再划分年轻代与老年代,只做逻辑保留,采用标记-整理算法,是一个可对停顿时间预测的低停顿、并发收集的GC回收器。它的GC过程同CMS类似,一共分为4个步骤:

①初始标记,同CMS回收器一致,标记出存活的对象。

②并发标记,同CMS回收器一致,和用户线程并发标记出存活的对象。

③最终标记,同CMS回收器一致,修正在并发标记将期间用户线程新产生的对象。

④筛选回收,这个阶段可根据用户期望的GC停顿时间制定回收计划。

8. 类在JVM中的加载过程

Java文件被编译为Class字节码文件后被加载到JVM中,主要分为三步:加载 -> 连接 -> 初始化。连接过程又分为:验证 -> 准备 -> 解析。

9. 类是如何被加载到JVM中的

Java文件被编译成Class字节码文件后,通过类加载器被加载到JVM中。类加载器从上往下一共有:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器。类先从自定义类加载器开始,逐层向上传递到启动类加载器,当启动类加载器不能加载时,再向扩展类加载器加载,这称为双亲委派模型。

10. 类加载器的双亲委派模型有什么好处

假设一个类首先被自定义类加载器加载,我们写Object类时,系统中就会出现不同的Object类。为了保证在系统中始终都只有一个Object类,方法就是它们都通过启动类加载器加载。

这是一个能给程序员加buff的公众号 (CoderBuff)

JVM面试十问的更多相关文章

  1. 2019年JVM面试都问了什么?快看看这22道面试题!(附答案解析)

    一. Java 类加载过程? Java 类加载需要经历一下 7 个过程: 1. 加载 加载是类加载的第一个过程,在这个阶段,将完成一下三件事情: • 通过一个类的全限定名获取该类的二进制流. • 将该 ...

  2. JDK基础必备面试十问

    1. new一个对象在Java内部做了哪些工作? 从静态角度来看,new一个对象表示创建一个类的对象实例. 从JVM运行角度来看,当JVM执行到new字节码时,首先会去查看类有没有被加载到内存以及初始 ...

  3. 面渣逆袭:JVM经典五十问,这下面试稳了!

    大家好,我是老三,"面渣逆袭"系列继续,这节我们来搞定JVM.说真的,JVM调优什么的一个程序员可能整个职业生涯都碰不到两次,但是,一旦用到的时候,那就是救命了,而且最重要的是-- ...

  4. 十问 JVM

    今天我们来讨论下 Java 虚拟机,通过一系列常见的问题来逐渐深入了解 JVM 创建对象过程,内存布局,类加载以及 GC 回收算法等机制. 十问 JVM 问题整理: Java虚拟机创建对象的过程 (使 ...

  5. 面试总问的jvm调优到底是要干什么?

    1. 压力测试的理解,xxx的性能10w/s,对你有意义么? 没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最 ...

  6. 面试必问:JVM类加载机制详细解析

    前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是cla ...

  7. 面试阿里百分百问的Jvm,别问有没有必要学,真的很有必要朋友

    面试阿里百分百问的Jvm,别问有没有必要学,真的很有必要朋友 前言: JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一 ...

  8. 上位机面试必备——TCP通信灵魂二十问【下】

    上篇文章跟大家介绍了TCP通信常见的前10个面试题,没看过的小伙伴可以点击下方链接进行查看: 上位机面试必备——TCP通信灵魂二十问[上] 今天就后面的10个面试题接着做下说明:欢迎关注[dotNet ...

  9. JAVA程序员面试30问(附带答案)

    第一,谈谈final, finally, finalize的区别. 最常被问到.final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能 ...

随机推荐

  1. 学习 Vue ,从入门到放弃

    最近项目刚完成,手上工作稍微轻松些,准备储备下技术,为未来挑战做好准备. 之前项目用的较多的是angulajs,不过版本较老,还停留在1.5x系,虽然结合了webpack,es2015等前沿技术,但理 ...

  2. 使用WebService发布soap接口,并实现客户端的https验证

    什么是https HTTPS其实是有两部分组成:HTTP + SSL / TLS, 也就是在HTTP上又加了一层处理加密信息的模块,并且会进行身份的验证. 如何进行身份验证? 首先我们要明白什么是对称 ...

  3. 第三章.定制专属的kali

    1.更新升级 • apt-get update • apt-get upgrade • apt-get dis-upgrade   2.根据个人喜好需求安装软件包 • 库 • Apt-get命令 • ...

  4. Java编程思想:通配符(后面有两个小节,研究的不够深入)

    import java.util.*; public class Test { public static void main(String[] args) { } } /* 15.9 边界 要点: ...

  5. kali换源

    在/tec/apt/sources.list加入以下内容 #中科大更新源 deb https://mirrors.ustc.edu.cn/kali kali-rolling main non-free ...

  6. 个人永久性免费-Excel催化剂功能第61波-快速锁定解锁单元格及显示隐藏公式

    Excel的所有功能都是需求导向的,正因为有客户在企业管理的过程中,有这样的需求出现了,然后相应的Excel就出现了相应的功能来辅助管理,学习Excel的功能,其实真的可以学习到先进企业的许多的管理思 ...

  7. 【区分】Typescript 中 interface 和 type

    在接触 ts 相关代码的过程中,总能看到 interface 和 type 的身影.只记得,曾经遇到 type 时不懂查阅过,记得他们很像,相同的功能用哪一个都可以实现.但最近总看到他们,就想深入的了 ...

  8. HTML 去调table表单里面td之间的间距

    首先为大家展示一下最原始的代码和效果.直接在table中用td划分的表格会默认隐藏边框.  接下来我们用css来增加样式,为table增加边框. table { border: 1px solid # ...

  9. Visual Studio 2015 WinForm应用程序打包教程

    最近开发了一个小软件.由于需要打包.网上找了一些资料.然后整合了起来.希望对大家有所帮助.不全面请见谅. 本人开发工具用的是Visual Studio 2015  打包控件 InstallShield ...

  10. C# 不同访问符的访问级别

    public----成员可以由任何代码访问. private----成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字). internal----成员只能由定义它的项目(程序集) ...