jdk1 6(jdk1.6与jdk1.8的区别)

张工 2022-06-12 18:31:32 阅读:38
  

  作为Java程序员,我们所有的程序都运行在Java虚拟机上,我们只需要深入研究Java虚拟机的底层原理,无论是JVM的内存区域,堆生成和垃圾收集算法,JVM的性能调优。充分了解JVM的运行机制后,我们才能成为更好的Javaer。

  今天给大家讲一些面试中必问的JVM面试分析。同时,对于JVM和性能调优,自己也整理过一份万字文档笔记,内容包括内存区域,垃圾回收,性能调优,GC,类加载机制以及平时工作问题的一些调优笔记记录!有需要的朋友麻烦帮忙转发下,私信回复我【JVM】即可获取免费领取方式!


金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了


  1.JVM的内存模型以及分区情况和作用

  如下图所示:


金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了


  黄色部分是线程共享的,蓝色部分是线程私有的。

方法区

  用于存储类信息、常量、静态变量和虚拟机加载的其他数据。

  存储对象实例。所有对象和数组都应该在堆上分配。是JVM管理的最大内存区域。

   Java方法执行的内存模型:存储局部变量表、操作数栈、动态链接、方法出口等信息。生命周期与线程相同。

本地方法栈

  类似于虚拟机栈,只是本地方法栈服务于原生方法执行,虚拟机栈服务于虚拟机执行的Java方法。

程序计数器

  当前线程执行的行号指示器。是JVM最小的内存区域。当字节码被执行时,程序计数器被用来选择下一个要被执行的字节码指令。

2.如何判断对象已死?

  堆中几乎有所有的对象实例。垃圾收集前的第一步是判断那些死的对象(即不能再以任何方式使用的对象)。


金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了


  2.1 引用计数法

  向对象添加引用计数器。每当有对它的引用时,计数器就加1;当引用无效时,计数器减1;任何时候计数器为0的对象都不能再次使用。

  这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。对象之间所谓的相互引用如下面的代码所示:除了对象objA和objB相互引用之外,两个对象之间没有任何引用。但是由于它们相互引用,它们的引用计数器不为0,所以引用计数算法无法通知GC回收器回收它们。

  公共类引用计数c {

  对象实例=null

  公共静态void main(String[] args) {

  ReferenceCountingGc objA=new ReferenceCountingGc();

  ReferenceCountingGc objB=new ReferenceCountingGc();

  objA.instance=objB

  objB.instance=objA

  objA=null

  objB=null

  }

  }2.2可达性分析算法

  该算法的基本思想是从一系列称为“GC Roots”,的对象开始,从这些节点向下搜索。节点走过的路径称为参考链。当一个对象连接到GC根而没有任何引用链时,证明该对象是不可用的。

=pc" img_width="465" img_height="323" alt="金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了" >


  3.方法区回收

  判断常量是否废弃可以判断是否有地方引用这个常量,如果没有引用则为废弃的常量。

  判断类是否废弃需要同时满足如下条件:

  • 该类所有的实例已经被回收(堆中不存在任何该类的实例)。
  • 加载该类的 ClassLoader 已经被回收。
  • 该类对应的 java.lang.Class 对象在任何地方没有被引用(无法通过反射访问该类的方法)。

3.垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

  常见的垃圾回收算法有:

  标记-清除算法、复制算法、标记-整理算法、分代收集算法

  3.1标记-清除算法

  标记―清除算法包括两个阶段:“标记”和“清除”。 标记阶段:确定所有要回收的对象,并做标记。 清除阶段:将标记阶段确定不可用的对象清除。

  缺点:

  1. 标记和清除的效率都不高。
  2. 会产生大量的碎片,而导致频繁的回收。

  3.2复制算法

  内存分成大小相等的两块,每次使用其中一块,当垃圾回收的时候, 把存活的对象复制到另一块上,然后把这块内存整个清理掉。

  缺点:

  1. 需要浪费额外的内存作为复制区。
  2. 当存活率较高时,复制算法效率会下降。

  3.3标记-整理算法

  标记―整理算法不是把存活对象复制到另一块内存,而是把存活对象往内存的一端移动,然后直接回收边界以外的内存。

  缺点: 算法复杂度大,执行步骤较多

  3.4分代收集算法

  目前大部分 JVM 的垃圾收集器采用的算法。根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为新生代( Young Generation 和老年代( Tenured Generation ),永久代( Permanet Generation )。

  老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

  如下图所示:


金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了


  

  • Young:存放新创建的对象,对象生命周期非常短,几乎用完可以立即回收,也叫 Eden 区。
  • Tenured: young 区多次回收后存活下来的对象将被移到 tenured 区,也叫 old 区。
  • Perm:永久带,主要存加载的类信息,生命周期长,几乎不会被回收。

  缺点: 算法复杂度大,执行步骤较多。

4.JVM 中垃圾收集器有哪些? 他们特点分别是什么?

  新生代垃圾收集器

  Serial 收集器

  特点: Serial 收集器只能使用一条线程进行垃圾收集工作,并且在进行垃圾收集的时候,所有的工作线程都需要停止工作,等待垃圾收集线程完成以后,其他线程才可以继续工作。

  使用算法:复制算法

  ParNew 收集器

  特点: ParNew 垃圾收集器是Serial收集器的多线程版本。为了利用 CPU 多核多线程的优势,ParNew 收集器可以运行多个收集线程来进行垃圾收集工作。这样可以提高垃圾收集过程的效率。

  使用算法:复制算法

  Parallel Scavenge 收集器

  特点: Parallel Scavenge 收集器是一款多线程的垃圾收集器,但是它又和 ParNew 有很大的不同点。

  Parallel Scavenge 收集器和其他收集器的关注点不同。其他收集器,比如 ParNew 和 CMS 这些收集器,它们主要关注的是如何缩短垃圾收集的时间。而 Parallel Scavenge 收集器关注的是如何控制系统运行的吞吐量。这里说的吞吐量,指的是 CPU 用于运行应用程序的时间和 CPU 总时间的占比,吞吐量 = 代码运行时间 / (代码运行时间 + 垃圾收集时间)。如果虚拟机运行的总的 CPU 时间是 100 分钟,而用于执行垃圾收集的时间为 1 分钟,那么吞吐量就是 99%。

  使用算法:复制算法

  老年代垃圾收集器

  Serial Old 收集器

  特点: Serial Old 收集器是 Serial 收集器的老年代版本。这款收集器主要用于客户端应用程序中作为老年代的垃圾收集器,也可以作为服务端应用程序的垃圾收集器。

  使用算法:标记-整理

  Parallel Old 收集器

  特点: Parallel Old 收集器是 Parallel Scavenge 收集器的老年代版本这个收集器是在 JDK1.6 版本中出现的,所以在 JDK1.6 之前,新生代的 Parallel Scavenge 只能和 Serial Old 这款单线程的老年代收集器配合使用。Parallel Old 垃圾收集器和 Parallel Scavenge 收集器一样,也是一款关注吞吐量的垃圾收集器,和 Parallel Scavenge 收集器一起配合,可以实现对 Java 堆内存的吞吐量优先的垃圾收集策略。

  使用算法:标记-整理

  CMS 收集器

  特点: CMS 收集器是目前老年代收集器中比较优秀的垃圾收集器。CMS 是 Concurrent Mark Sweep,从名字可以看出,这是一款使用"标记-清除"算法的并发收集器。

  CMS 垃圾收集器是一款以获取最短停顿时间为目标的收集器。如下图所示:

金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了


  从图中可以看出,CMS 收集器的工作过程可以分为 4 个阶段:

  • 初始标记(CMS initial mark)阶段
  • 并发标记(CMS concurrent mark)阶段
  • 重新标记(CMS remark)阶段
  • 并发清除((CMS concurrent sweep)阶段

  使用算法:复制+标记清除

  G1 垃圾收集器

  特点: 主要步骤:初始标记,并发标记,重新标记,复制清除。

  使用算法:复制 + 标记整理

  更多面试中问到的JVM问题,你知道多少呢!由于篇幅有限,可以看整理的JVM与性能调优笔记!有需要的朋友麻烦帮忙转发下,私信回复我【JVM】即可获取免费领取方式!

  • 内存溢出OOM异常排查
  • CPU资源占用过高
  • JVM参数调优
  • GC回收及原理
  • GC中的STW现象
  • ......
金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了


  市面上真正适合学习的Tomcat资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃。学透Tomcat难道就真的就没有一种适合大多数同学的方法吗?

  为了让粉丝学好JVM,我特邀了前华为资深架构师Mark老师为大家带来《JVM与性能调优实战》直播课,从JVM底层机制,到JVM深度调优、大厂常问面试题分析,再到OOM实战、GC,参数调优等,带你在实战中解决遇到的各种问题,不仅学技术,更要学习解决问题的思路以及面试的技巧!(图片里学习参与方式!)


金三银四Java必备:大厂都必问的几道JVM问题,看完解析你该会了


  

课程安排

  Java虚拟机内存全解剖

  • 体系解密Java虚拟机底层机制
  • 剖析方法在Java虚拟机中的执行
  • 内存溢出OOM的实战
  • 常见面试题剖析

探秘GC垃圾回收及性能调优实战

  • GC的原理和算法
  • JVM中的GC回收器
  • 重大影响,GC中的STW现象
  • 亿级流量网站JVM参数调优实战
二维码