JVM 知识整理

  1. JVM 类加载机制
  • 加载(将文件加载到内存中)
  • 验证(确保class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全)
  • 准备 (准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间)
  • 解析 (解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。)
  • 初始化 (开始真正执行类中定义的Java程序代码)
  1. JVM提供了3种类加载器

    • 启动类加载器Bootstrap ClassLoader(负责加载 JAVA_HOME\lib rt.jar)
    • 扩展类加载器Extension ClassLoader(负责加载 JAVA_HOME\lib\ext)
    • 应用程序类加载器ApplicationClassLoader(负责加载用户路径(classpath)上的类库)
  2. JVM 通过双亲委任模型进行类的加载。

    • 当一个类加载器收到类加载任务,会先交给其父类加载器去完成,因此最终加载任务都会传递到顶层的启动类加载器,只有当父类加载器无法完成加载任务时,才会尝试执行加载任务。
    • 采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个Object对象。
  3. 类实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段他们的执行顺序

    • 先静态、先父后子
    • 先静态:父静态 > 子静态
    • 优先级: 父类 > 子类静态代码块 > 非静态代码块 > 构造函数
    • 一个类的实例化过程:
      • (1)父类中的static 代码块,当前类的static
      • (2)顺序执行父类的普通代码块
      • (3)父类的构造函数
      • (4)子类普通代码块
      • (5)子类(当前类)的构造函数,按顺序执行。
      • (6)子类方法的执行。
  4. JVM内存分配

    • 根据JVM规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五部分组成。
    • 其中 堆 、方法区由所有线程共享的数据区
    • 虚拟机栈 、程序计数器、本地方法栈 为线程隔离数据区
    虚拟机栈 线程创建时产生,方法执行时生成栈帧
    本地方法栈
    方法区 存储类的元数据信息 常量等
    java代码中所有的new操作
    非堆 JVM自用的区域,方法区、JVM内部处理、类方法,构造方法等
  5. java 8 的内存分代改进 从永久代到元空间,在小范围自动扩展永生代避免溢出。

  6. JVM 垃圾回收机制,何时出发MinorGC等操作

    • 垃圾回收机制:不同的对象生命周期不同。
    • JVM 中共划分为三个代:年轻代、老年代和持久代。
    • 年轻代:存放所有新生代的对象;
    • 老年代:在年轻代经历了N次垃圾回收仍然存活的对象,将被放到老年代中,故都是一些生命周期较长的对象;
    • 持久代:用于存放静态文件,如java类、方法等。
    • 新生代的垃圾收集器名为"minor gc",老生代的GC命名为"Full Gc 或者 Major GC",其中System.gc()强制执行的Full Gc
  • 判断对象是否需要回收的方法有两种:

    • 1 引用计数 :当某对象的引用数为0时,便可以进行垃圾收集。
    • 2 对象引用遍历 :如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。
  • 触发GC的条件:
    • 1 GC在优先级最低的线程中运行,一般在引用程序空闲即没有应用线程在运行时被调用。
    • 2 Java 堆内存不足时,GC被调用。
  • GC 算法 GC最基础的算法有三种:标记-清除算法、复制算法、标记压缩算法,我们常见的垃圾回收器一般都采用分代收集算法
    • 标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
    • 复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
    • 标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
    • 分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
  • 垃圾回收器
    • Serial收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。
    • ParNew收集器,ParNew收集器其实就是Serial收集器的多线程版本。
    • Parallel收集器,Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。
    • Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
    • CMS收集器,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
    • G1收集器,G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征
  1. GC分析 命令调优

    • GC日志分析
   2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]
2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]
复制代码

通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回收,耗时长,因此一般尽量减少full gc的次数

  • 调优命令

    • Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
    • jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
    • jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
    • jmap,JVM Memory Map命令用于生成heap dump文件
    • jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
    • jstack,用于生成java虚拟机当前时刻的线程快照。
    • jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。
  • 调优工具

    • 常用的调优工具分为两类jdk自带监控工具:jconsole和jvisualvm第三方有:MAT(Memory Analyzer Tool)、GChisto。

      • jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类等的监控
      • jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。 MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗
      • GChisto,一款专业分析gc日志的工具
  1. Eden区和Survivo。

    • 每一个对象的创建跟分配都是在堆上面进行的,堆分为新生代,老生代。
    • 新生代有一个Eden和两个Survivor(from,to)组成,默认比例是8:2。也可以使用-XXSurvivorRatio来改变百分比。
  2. JVM 参数

    jvm参数:

    • -Xms:初始堆大小
    • -Xmx:堆最大内存
    • -Xss:栈内存
    • -XX:PermSize 初始永久带内存
    • -XX:MaxPermSize 最大永久带内存
  3. 堆空间

    • 堆被划分为:新生代、老年代
    • 堆大小 = 新生代 + 老年代
    • 新生代与老年代的比例值为1:2
    • 新生代中Edem:from:to = 8:1:1 即Eden = 8/10的新生代空间大小, from = to = 1/10的新生代空间大小
    • Minor GC 是发生在新生代中的垃圾收集动作,所采用的是复制算法。
    • Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。

转载于:https://juejin.im/post/5b001f44518825428b390eee

JVM 面试知识整理相关推荐

  1. *Java软件开发面试知识整理*

    Java软件开发面试知识整理 围绕以下几点回答问题:是什么.为什么.什么时候用.项目实现.解决什么问题.遇到的困难 谈谈你对Java和C的理解? Java: 面向对象.Unicode:可以跨平台(JV ...

  2. 安卓高级面试知识整理

                                                    安卓高级面试知识整理 Android 四大组件:这是一份全面 & 详细的Activity学习指南 ...

  3. iOS开发面试知识整理 – OC基础 (二)

    iOS | 面试知识整理 – OC基础 (二) 1.C和 OC 如何混编 xcode可以识别一下几种扩展名文件: .m文件,可以编写 OC语言 和 C 语言代码 .cpp: 只能识别C++ 或者C语言 ...

  4. 2020秋招 C++软件开发/游戏开发 面试知识整理汇总

    鄙人的2020秋招目前已经基本结束,最终拿了六家公司的offer,在综合比较之后目前已经有了明确的偏向,那就是去某公司转行Java,至于原因有很多层,我即使在做了这个决定半年后还是不敢肯定这个决定是否 ...

  5. JVM基础知识整理----体系结构和运行时数据区

    JVM java概述 java体系 java程序语言 java虚拟机实现 class文件格式 java类库api 第三方类库 javaSE javaEE javaME java历史 1991年4月 J ...

  6. C语言面试基础知识整理

    一.预处理 1.什么是预编译?何时需要预编译? (1)预编译又称预处理,是做些代码文本的替换工作,即程序执行前的一些预处理工作.主要处理#开头的指令,如拷贝#include包含的文件代码.替换#def ...

  7. Java面试知识(持续更新)

    (欢迎各位大佬添加新的面试知识,本文纯属博主手打,如有错误,欢迎各位大佬批评在下方,小弟一定及时改正) 基础篇 1.一个".java"源文件可以有多个类,但只能有一个public类 ...

  8. 史上最全JVM重点知识总结

    史上最全JVM重点知识总结 基于<深入了解java虚拟机>相关章节进行地重点知识归纳,同时面向企业面试,给出常见面试问题解析及自己的见解,如果有不正确的地方欢迎大佬们指正. 文章目录 1. ...

  9. 2022年最新面试JVM面试追魂夺命17问,教科书级回答

    文章目录 前言 1.JVM的运行时数据区有哪些? 2.什么是堆内存?堆内存包含哪些部分? 3.什么是内存溢出? 4.什么是内存泄漏?与内存溢出有什么关系? 与内存溢出的关系! 5.你知道哪几种垃圾收集 ...

最新文章

  1. 使用maven创建项目和cannot change version web module 3.0
  2. python图像隐写技术_图像隐写技术(Image Steganography)
  3. 夯实基础项目工程之图论——Uncle Bogdan and Country Happiness,Graph Coloring,How Many Paths?,Array Differentiation
  4. 【随机】Ghd(CF364D)
  5. SiameseRPN详解
  6. k8s 基础概念和术语
  7. DLL入口点函数DllMain
  8. TPAMI 2021 华为诺亚悉尼大学陶大程团队提出多功能卷积,助力轻量级网络
  9. [BZOJ] 1025 [SCOI2009]游戏
  10. VMware打开闪退
  11. shell脚本学习(二十八)——服务启动脚本的编写
  12. L. Simone and graph coloring
  13. kobo glo安装koreader(刷ksm后)
  14. excel计算一年第几周
  15. c语言编程绘制空间螺旋线,在UG中绘制变螺距螺旋线的方法
  16. oracle查询所有员工人数,oracle查询员工人数最少的部门
  17. Nvidia最新三维重建技术Instant-ngp初探
  18. 算法.动态规划 导航/数塔取数字问题
  19. centOs7 安装docker 镜像
  20. Ajax 和 XML: 五种 Ajax 反模式

热门文章

  1. jQuery插件写法
  2. 深入理解JVM读书笔记--Class文件结构
  3. 大数据之-Hadoop_环境搭建_虚拟机准备---大数据之hadoop工作笔记0016
  4. 大数据_Hbase-API访问_Java操作Hbase_MR-数据迁移-开发代码---Hbase工作笔记0016
  5. Netty工作笔记0038---Netty模型--通俗版
  6. STM32工作笔记0043---什么是漏源电压,栅源电压
  7. C#.Net工作笔记008---c# 日期时间大小比较_日期相减
  8. C语言快速学习笔记001-相关语法
  9. 扒一扒那些奇葩的甲方吧
  10. 初学angularJS 个人总结 错误排除