《温故知新》JVM虚拟机知识点聚合

一、JDK JRE JVM关系

JDK:Java SE开发工具包。包含jre,其中包括java编译器javac.exe,打包工具jer.exe。

JRE:Java SE运行时环境,包含JVM所必须的运行时需要的类库和 rt.jar,bin文件相当于是JVM。JRE 提供了库、Java 虚拟机(JVM)和其他组件,用于运行 Java 编程语言、小程序、应用程序。

JVM:虚拟出来的计算机,主要目的是把java程序中的字节码,解析成具体平台系统的机器码,提供平台使用

二、JVM内存模型

jdk1.6:

  • 方法区(常量池)
  • 本地方法栈
  • java虚拟机栈
  • 程序计数器

jdk1.7

  • 方法区(运行时常量池、类常量池)
  • 堆(字符串常量池)
  • 本地方法栈
  • java虚拟机栈
  • 程序计数器

JDK1.8:

  • 元空间(运行时产量池,类常量池)
  • 堆(字符串常量池)
  • 本地方法栈
  • java虚拟机栈
  • 程序计数器

jdk1.7与jdk1.8内存模型区别:

1.去除了方法区(PermGen永久代)转变为 元空间。优点有元空间的大小只受本地内存影响,不会因永久代的内存空间的不足而抛出OutOfMamouryError异常jdk1.8以前版本的 class和JAR包数据存储在 PermGen下面 ,PermGen 大小是固定的,而且项目之间无法共用,公有的 class,所以比较容易出现OOM异常

JVM堆

可分为两部分

  • 新生代(8:Eden、1:From Servivor、1:To Servivor) -1/3堆空间
  • 老年代  -2/3堆空间

什么时候对象进入老年代?

1.大多数情况对象在新生代Eden分配,当Eden没有足够的空间时将发起一次Minor GC,当Edeng执行完Minor GC后还不足以为对象分配空间,则大对象直接进入老年代, 可以用参数设置大对象直接进入老年代,避免频繁的Minor GC.

2.如果对象在Eden出生,发送Minor GC后然存活,并且能被Survivor容纳,则年龄加1,达到一定年龄后进入老年代,默认为15

垃圾回收机制-GC

垃圾检查方式

  • 引用计数算法:给对象添加一个计数器,每到有一个地方引用时计数器自增1,失效一个时计数器减1,当计数器为0时被GC回收。(缺点:如果两个对象相互引用,则会出现死循环,永远不可被回收
  • 可达性分析算法:定义一系列GC Roots的起始节点集,从这个节点出发,穷举该集合引用到的全部对象并填充到集合中。这个过程对集合中存活的对象进行标记,未标记的对象进行GC回收。(缺点:可能出现错报漏报<STW可以确保可达性分析法的准确性,避免漏报>)

垃圾回收器

  • CMS:以获取最短回收时间停顿的并发收集器。收集范围是老年代,可以配合新生代的Serial和ParNew收集器一起使用。
  • G1:是一款面向服务端应用的收集器,它能充分利用多 CPU、多核环境。因此它是一款并行与并发收集器,并且它能建立可预测的停顿时间模型,即可以设置 STW 的时间。收集范围是老年代和新生代。不需要结合其他收集器使用。

垃圾回收算法

  • 标记-清除算法(会产生大量碎片)
  • 标记-复制算法(解决了碎片问题,但堆空间浪费了一半)
  • 标记-整理算法(标记存活的对象,并向堆的一端移动,清除另一端的对象)

GC类型

Minor GC:又称为新生代GC :指的是发生在新生代的垃圾收集。因为Java对象大多都具备朝生夕灭的特 性,因此Minor GC(采用复制算法)非常频繁,一般回收速度也比较快。
Full GC: 又称为 老年代GC或者Major GC : 指发生在老年代的垃圾收集。出现了Major GC,经常会伴随 至少一次的Minor GC(并非绝对,在Parallel Scavenge收集器中就有直接进行Full GC的策略选择过程)。 Major GC的速度一般会比Minor GC慢10倍以上。老年代:标记-整理算法(清理的时候做内存移动)

你可能感兴趣的:(温故知新,jvm,java,linux)