java架构之路-(面试篇)JVM虚拟机面试大全

https://www.cnblogs.com/cxiaocai/p/11634918.html
 

  下文连接比较多啊,都是我过整理的博客,很多答案都在博客里有详细说明,理解记忆是最扎实的记忆。而且我的答案不一定是最准确的,但是我的答案不会让你失望,而且几乎每个答案都是问题的扩展答案。

1.JVM内存模型

  答:https://www.cnblogs.com/cxiaocai/p/11483629.html

先经过类装载子系统装载,经由验证,准备,解析,初始化四个过程。方法被调用,方法进栈,对象放在堆,栈内存的引用指向我们的对象,方法逐行执行,由我们的程序计数器来控制。元空间放置静态方法,不占用jvm内存,占用的是实际内存空间。

2.JVM垃圾回收算法

  答:三种算法。https://www.cnblogs.com/cxiaocai/p/11547743.html

  复制算法,由一个内存块复制到一个内存块下,缺点是有一半的内存是留给复制用的,不用用于直接存储

  标记清理,扫逐个内存块是否可被回收,可以回收的就回收掉,缺点是会产生内存碎片

  标记整理,标记整理是是标记清除的升级版,优点:解决内存碎片问题。缺点:整理阶段,由于移动了可用对象,需要去更新引用。

3.JVM垃圾收集器有哪些?以及优劣势比较?

  答:https://www.cnblogs.com/cxiaocai/p/11547743.html

  有五种垃圾回收器,分别是串行的Serial,并行的ParNew,高CPU的Parallel Scavenge,还有我们的CMS和大内存的G1。

  需要说的是CMS回收器的过程,初始标记(STW),并发标记,重新标记(STW,耗时70%),并发清理 ,并发重置。

  G1回收器适合大内存的服务器,回收过程是,初始标记(STW),并发标记,最终标记(STW),筛选回收(STW)。

  G1回收器的优点是STW时间是可以控制的。串行的Serial,自我觉得没啥优点,唯一的优点就是清理的彻底吧。并行的ParNew,开启多个线程去回收,一般来说线程数和CPU的核数相等,但不建议用在老年代,在老年代兼容性差。高CPU的Parallel Scavenge可能会抢占用户线程的CPU。CMS回收器需要考虑到老年代担保机制。

  https://www.cnblogs.com/cxiaocai/p/11570519.html

  再就是G1三个GC都是什么YoungGC优先判断一下回收一次的工作效率,不值得不执行。MixedGC清理内存块,复制算法,Full GC停止系统程序,然后采用单线程进行标记、清理和压缩整理,好空闲出来一批Region来供下一次MixedGC使用

4.什么是类的加载

  答案:https://www.cnblogs.com/cxiaocai/p/11483629.html

    1.验证:验证我们的编译文件(字节码文件)是否正确。

    2.准备:给予类的静态常量开辟堆空间。并且赋予默认值。对象也在这个时候放置在堆空间,并且给予空值。

    3.解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用。就像是我们把main转化为001,将()转化为002,将这一系列的编码存在堆上。

    4.初始化,将第3步的静态常量(或对象)赋值,执行静态代码块。

5.简述双亲委派

  答:https://www.cnblogs.com/cxiaocai/p/11483629.html

  这个简单啦,别管几层,下面给我的我一律不管,除非我是最顶层,上级交给我的,我看看我可以做吗?做不了我给我下级。

  用技术一点的话就是类来了,交给我们的自定义加载器,自定义加载器先不做处理,交给我们的应用类加载器,应用类加载也先不处理,交给我们的扩展类加载器,扩展类加载器也先不处理,交给我们的启动类加载器,启动类加载器没办法了,先尝试加载一下吧,加载不了,回退给扩展类加载器,扩展类加载器也尝试一下加载吧,加载不了再交给我们的应用类加载器,应用类加载器还是处理不了只有回退给我们的自定义加载器了。

  自定我们的类加载器,只要重写com.sun.org.apache.bcel.internal.util包下的ClassLoader类的findClass方法,最后调用defineClass方法。就可以实现我们的自定义加载器。  

6.简述老年代担保机制

  答:https://www.cnblogs.com/cxiaocai/p/11520731.html

  Eden区满了后,不会立即做MinorGC,会判断一下老年代的剩余空间是否大于我们要回收的对象,够大就做MinorGC吧,如果老年代不够大了,我们会判断时候配置了-XX:-HandlePromotionFailure (jdk8以上默认设置),没配置,直接FullGC,如果配置了就去判断老年代的剩余空间是否小于我们每次minorGC后每次要放在老年代对象大小的平均值,如果老年代小于minorGC了,那么进行fullGC。

7.Java对象创建过程

  答:为对象分配存储空间。开始构造对象。递归调用其超类的构造方法。进行对象实例初始化与变量初始化。执行构造方法体。使用完毕,计算GCRoot根,也就是对象不可达分析,进行垃圾回收,触发finalize方法,方法运行结束,稍后进行垃圾回收。

8.类的生命周期

  答:类的完整生命周期包括7个部分:加载——验证——准备——解析——初始化——使用——卸载

9.如何判断对象可以被回收?

  答:1,引用计数法(基本不用,循环引用对象永远无法销毁,可能内存溢出)

    2,可达性分析算法。GCRoots根节点一般为线程栈的本地变量、静态变量、本地方法栈的变量等等。

    3,常见的引用类型(强软弱虚)。

    4,finalize最终判断对象存活。

    如何判断一个类是无用的类

    1.该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何 实例。

    2.加载该类的 ClassLoader 已经被回收。    
    3.该类对应的 java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。 

10.JVM的永久代中会发生垃圾回收么?

  答:永生代也是可以回收的,条件是

    1.该类的实例都被回收。

    2.加载该类的classLoader已经被回收

    3.该类不能通过反射访问到其方法,而且该类的java.lang.class没有被引用 当满足这3个条件时,是可以回收,但回不回收还得看jvm有没有“时间”。

11.一般用什么来分析GC日志分析

  答:jmap -heap PID,jstat -gc PID,javap -c ***.class,线上尽力别用jvisualvm命令,消耗性能,想快速优化(完全不熟悉业务)可以直接通过调整eden,Survivor区来设置,记得为什么会发生fullGC,两个重要的一个动态年龄计算,另一个是老年代担保机制,熟悉业务时,可以结合业务来调整,而且在项目上线前,应该做提前的预估。

12.调优命令

  答:

  栈相关

    -Xss->设置单个线程栈大小,比如-Xss512K,数值越小,一个线程栈里能分配的栈帧就越少,说明可以开启的线程数越多

  方法区(元空间)

    -XX:MetaspaceSize->设置方法区的大小,也是触发GC的阈值,比如-XX:MetaspaceSize=256M

    -XX:MaxMetaspaceSiz->设置方法区的最大值,比如-XX:MaxMetaspaceSize=256M

  堆相关

    -Xms->jvm启动时分配的内存,比如‐Xms200m

    -Xmx->jvm运行过程中分配的最大内存,比如-Xmx500m

    -Xmn->设置年轻代大小,比如-Xmn2g

    -XX:NewSize->设置年轻代大小 比如-XX:NewSize=2g

    -XX:PretenureSizeThreshold->可以设置大对象的大小,比如-XX:PretenureSizeThreshold=100000000 单位为btye。

    -XX:MaxTenuringThreshold->设置分代年龄,比如-XX:MaxTenuringThreshold=10 默认为15。

    -XX:-HandlePromotionFailure->老年代分配担保机制参数,1.8默认开启。

    -XX:-UseAdaptiveSizePolicy->禁止JVM自动优化eden和Survivor默认比例8:1:1,反之JVM默认有这个参数-XX:+UseAdaptiveSizePolicy,会导致这个比例自动变化。

    -XX:SurvivorRatio->设置Eden和Survivor大小比如 -XX:SurvivorRatio =8,注意Survivor区有两个。表示Eden:Survivor=8:2,一个Survivor区占整个年轻代的1/10。

    -XX:NewRatio->设置老年代和年轻代的比值大小 比如-XX:NewRatio=4,表示年老代和年轻代比值为4:1。

  还有很多的命令就不依依列举了,可以去看我的博客https://www.cnblogs.com/cxiaocai/p/11570519.html

13.Minor GC与Full GC分别在什么时候发生?

  答:Minor GC发生在年轻代,当eden区满的时候会出发Minor GC。

    Full GC发生在老年代,回收所有堆空间的内存,Minor GC前的老年代担保机制可能出发FullGC。

14.简述对象动态年龄判断

  答:https://www.cnblogs.com/cxiaocai/p/11520731.html

  当我们做完minorGC以后,对象放在to区域,也就是我们Survivor的to区域,可能对象是放不下的,这时会来计算分类年龄,大致是这样来算的将所有分代年龄为1的相加,再加上分代年龄为2的,再加分代年龄为3的,依次相加,一直加到最大的分代年龄,但在相加过程中,你会发现加到分代年龄为m的对象,总大小已经放满了to区域,这时就将m到n分代年龄的对象都移置到老年代,包含m。也就是大于Survivor区域的50%时,则后面的对象,包含该年龄的对象都放置在老年代。

15.类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序

  答:当创建类对象时,先初始化静态变量和静态块,然后是非静态变量和非静态代码块,然后是构造器。由于静态成员只会被初始化一次,所以如果静态成员已经被初始化过,将不会被再次初始化。

16.简述一下逃逸分析

  答:-XX:+DoEscapeAnalysis : 表示开启逃逸分析。-XX:-DoEscapeAnalysis : 表示关闭逃逸分析 从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:-DoEscapeAnalysis。逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量引用。正常的方法调用中,方法体中创建的对象将在执行完毕之后,将回收其中创建的对象;故由于无法回收,即成为逃逸。

关注公众号获得更多面试和学习资料。

感谢大家的阅读,不正确的地方,还希望大家来斧正,我们一起探讨技术问题,觉得写得好的,给个推荐,给个赞,点个关注吧,鞠躬,谢谢

[转帖]java架构之路-(面试篇)JVM虚拟机面试大全的更多相关文章

  1. java架构之路-(spring源码篇)由浅入深-spring实战详细使用

    今天我更新了一篇jvm垃圾回收的算法和垃圾回收器的内部逻辑,但是看的人不多啊......貌似大家还是比较喜欢看源码吧,毕竟实战要比理论用的多. 这篇文章不会详细的深入底层源码,只是基于注解和配置来说说 ...

  2. java架构之路(多线程)JMM和volatile关键字

    说到JMM大家一定很陌生,被我们所熟知的一定是jvm虚拟机,而我们今天讲的JMM和JVM虚拟机没有半毛钱关系,千万不要把JMM的任何事情联想到JVM,把JMM当做一个完全新的事物去理解和认识. 我们先 ...

  3. java架构之路(多线程)JMM和volatile关键字(二)

    貌似两个多月没写博客,不知道年前这段时间都去忙了什么. 好久以前写过一次和volatile相关的博客,感觉没写的那么深入吧,这次我们继续说我们的volatile关键字. 复习: 先来简单的复习一遍以前 ...

  4. java架构之路-(12)JVM垃圾回收算法和垃圾回收器

    接上次JVM虚拟机堆内存模型来继续说,上次我们主要说了什么时候可能把对象直接放在老年代,还有我们的可能性分析,提出GCroot根的概念.这次我们主要来说说垃圾回收所使用的的算法和我们的垃圾回收器,需要 ...

  5. java架构之路(多线程)synchronized详解以及锁的膨胀升级过程

    上几次博客,我们把volatile基本都说完了,剩下的还有我们的synchronized,还有我们的AQS,这次博客我来说一下synchronized的使用和原理. synchronized是jvm内 ...

  6. java架构师视频教程 内含activemq+jvm+netty+dubbo

    目录: 架构师视频教程包含activemq jvm netty dubbo 0分布式项目实战所有视频(分布式项目视频)互联网架构师第二期-视频部分互联网架构师第二期-资料部分1.Netty快速入门教程 ...

  7. java架构之路-(面试篇)JVM虚拟机面试大全

    下文连接比较多啊,都是我过整理的博客,很多答案都在博客里有详细说明,理解记忆是最扎实的记忆.而且我的答案不一定是最准确的,但是我的答案不会让你失望,而且几乎每个答案都是问题的扩展答案. 1.JVM内存 ...

  8. java架构之路-(面试篇)Mysql面试大全

    说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案. 1.索引是什么 ...

  9. java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(上)源码执行流程

    做过web项目的小伙伴,对于SpringMVC,Struts2都是在熟悉不过了,再就是我们比较古老的servlet,我们先来复习一下我们的servlet生命周期. servlet生命周期 1)初始化阶 ...

随机推荐

  1. C# 获取枚举值/获取名字和值

    枚举 int 转 枚举名称 public void Test() { //调用 string name1= ConvertEnumToString<ActionLogType>(1); s ...

  2. 【CSP模拟赛】坏天平(数学&思维)

    蹭兄弟学校的题目做还不用自己出题的感觉是真的爽 题目描述 nodgd有一架快要坏掉的天平,这架天平右边的支架有问题,如果右边的总重量比左边多太多,天平就彻底坏掉了.现在nodgd手上有n种砝码,质量分 ...

  3. 生产者消费者模型Java实现

    生产者消费者模型 生产者消费者模型可以描述为: ①生产者持续生产,直到仓库放满产品,则停止生产进入等待状态:仓库不满后继续生产: ②消费者持续消费,直到仓库空,则停止消费进入等待状态:仓库不空后,继续 ...

  4. C语言JSON序列化/反序列化

    最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...

  5. P2P模式

    P2P模式 P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver).每个消息都被发送到一个特定的队列,接收者从队列中获取消息.队列保留着消息,直到他们被消费 ...

  6. input标签type="file"上传文件的css样式

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. cache-control: max-age=1,s-maxage=1

    cache-control: max-age=1,s-maxage=1

  8. mediacoder固定质量CRF

    视频编码:crf 与 bitrate 对照表 CRF(constant rate factor)就是x264/x265下压制视频的一种恒定量化值的编码方式,码率不恒定.其实就相当于vbr1pass.采 ...

  9. MyBatis:MyBatis操作MySQL存储过程

    一 . 数据库中创建存储过程,并查看创建结果 1.创建存储过程 DROP procedure IF EXISTS net_procedure_request; DELIMITER $$ )) BEGI ...

  10. Linux下java进程CPU占用率高分析方法(一)

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...