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. 基于SpringBoot的Web API快速开发基础框架

    其实还是很因为懒,才会有这个案例项目的产生,每次开启一个终端的小服务都要整理一次框架,造成重复的.不必要的.缺乏创造性的劳动,SO,本着可以用.用着简单的原则上传代码到Github,希望有需要的朋友直 ...

  2. nexus私服快速update index方法

    简单搭好nexus私服后,做好基本的配置. 稍微麻烦点的就是让其更新Jar索引文件.如果有耐心的话,完全可以通过在线更新索引的方式来做,但所消耗的时间较长,让人误以为出错了,不知所措. 下面介绍一种简 ...

  3. 使用flink Table &Sql api来构建批量和流式应用(2)Table API概述

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  4. 【栈-例题】网页跳转-C++

    描述 蒜头君每天都在用一款名为 "蒜厂浏览器" 的软件.在这个浏览器中,一共三种操作:打开页面.回退和前进.它们的功能如下: 打开页面:在地址栏中输入网址,并跳转到网址对应的页面: ...

  5. HDFS的HA(高可用)

    HDFS的HA(高可用) 概述 (1)实现高可用最关键的策略是[消除单点故障].HA 严格来说应该分成各个组件的 HA 机制:HDFS 的 HA 和 YARN 的 HA. (2)Hadoop2.0 之 ...

  6. C语言入门4-运算符和表达式

    一.     分类 C语言一共有34种运算符,10种运算类型,本节我们要掌握的有( 7 种) 算术运算符(+.-.*./.%). 关系运算符(>.>=.==.!=.<.<=). ...

  7. TreeMap 还能排序?分析下源码就明白了

    Java 中的 Map 是一种键值对映射,又被称为符号表或字典的数据结构,通常使用哈希表来实现,但也可使用二叉查找树.红黑树实现. HashMap 基于哈希表,但迭代时不是插入顺序 LinkedHas ...

  8. javascript基础学习第一天

    Javascript 发展过程: 1.出现:为了解决用户和游览器之间的交互. 2.概念:基于对象和事件驱动,运行在游览器客户端的脚本语言. -js在游览器中运行的.(js引擎:执行js代码) -事件: ...

  9. HTTP_2_HTTP协议概要

    http协议概要 HTTP 通信对象 通信方式 通信状态 定位资源 节省通信量 超文本传输协议 客户端与服务器端 请求和响应 不保存状态(借助cookie) 请求URI keep-alive/pipe ...

  10. 记一次idea问题—performing vcs refresh...

    01.前言 本人出现该场景是,我把本地SVN A项目删了,而A项目与B项目同在一个SVN目录下,当我修改B项目且提交代码时,出现了该问题. idea不是很懂操作,就搜索了一下得出了三种答案,但只有其一 ...