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. AtCoder Beginner Contest 133 E - Virus Tree 2(组合数学)

    题意 n个点的树k种颜色,距离不超过2的点对需颜色不同,求方案数 Code(copy) #include<iostream> #include<cstdio> #include ...

  2. Linux之字符串截取

    获取字符串的长度 在 Shell 中获取字符串长度很简单,具体方法如下: ${#string_name} string_name 表示字符串名字. root@master:~# b="ma ...

  3. Tensorflow object detection API(1)---环境搭建与测试

    参考: https://blog.csdn.net/dy_guox/article/details/79081499 https://blog.csdn.net/u010103202/article/ ...

  4. DELPHI开发LINUX插件架构的程序

    DELPHI开发LINUX插件架构的程序 DELPHI可以开发LINUX配置型插件架构的程序,并且这一套插件架构,同样适用于MSWINDOWS和MAC. 配置插件: 根据配置,动态加载插件:

  5. Mysql中 查询慢的 Sql语句的记录查找

    Mysql中 查询慢的 Sql语句的记录查找 慢查询日志 slow_query_log,是用来记录查询比较慢的sql语句,通过查询日志来查找哪条sql语句比较慢,这样可以对比较慢的sql可以进行优化. ...

  6. ActiveMQ参数异常 “Invalid broker URI”

    某次启动项目报错,提示ActiveMQ参数异常 该参数的值配置如下 跟踪读取配置的代码如下,可以看到读取我配置的key为xmq.actmq.connection.url.forSend的对应值,赋值到 ...

  7. java动态加载jar文件

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, Invo ...

  8. Flutter AspectRatio、Card 卡片组件

    Flutter AspectRatio 组件 AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widg ...

  9. 解决 service iptables save 报错 please try to use systemctl

    本文档根据 service iptables save 报错 please try to use systemctl 提供解决方案.报错 [root@Jaking ~]# service iptabl ...

  10. centos6.8安装python3.7.3报错Can't connect to HTTPS URL because the SSL module is not available问题解决

    环境:CentOS release 6.8 (Final) # 直接编译python3.7在使用pip3安装依赖的时候报错: Can't connect to HTTPS URL because th ...