Skip to content

JDK,JRE,JVM之间的区别

JDK(Java SE Development Kit)

java标准开发包,提供了编译,运行Java程序所需的各种工具和资源,包括Java编译器,Java运行时环境,以及常用的Java类库.程序开发者必须安装JDK来编译,调试程序.

JRE(Java Runtime Environment)

Java运行环境,用于运行Jav的字节码文件.JRE中包括了JVM及JVM工作所需的类库,普通用户只需要安装JRE来运行Java程序.

JVM(Java Virtual Machinal)

Java虚拟机,是JRE的一部分,它是整个java实现跨平台的最核心的部分,负责运行字节码文件.

tip: JDK包含了JRE,JRE包含了JVM

JVM参数有哪些

  • JVM参数的分类
    • 标准指令: -开头,这些是所有的HotSpot都支持的参数
    • 非标准指令: 以-X开头,这些指令通常根特定的HotSpot版本对应.
    • 不稳定参数:以-XX开头,这一类参数是跟特定的HotSpot版本对应,并且变化非常大.
  • 常用JVM参数
    • -Xmx4g -Xms4g 堆内存大小
    • -Xloggc:gc.log 指定GC日志文件

JVM中哪些是线程共享区

  • 堆区和方法区是所有线程共享的
  • 栈,本地方法栈,程序计数器是每个线程独有的

如何排查JVM问题

  • 可以使用jmap查看JVM中各个区域的使用情况
  • 可以通过jstack查看线程的运行情况,比如阻塞,死锁等
  • 可以通过jstat来查看垃圾回收情况
  • 一般情况并不会一次性找到问题,需要分析,推理,测试,分析,推理,测试,最后才能找到问题的根源
  • 如果已经OOM的系统,可以下载当时的dump文件,通过jsisualvm或eclipse来分析

JVM类加载机制和垃圾回收机制

Java通过类加载器来实现类的加载动作,类加载器分为俩种,一种是通过c++写在jvm内的加载器,一种是我们通过java代码实现的ClassLoader类加载器。

类加载的过程包括加载,验证,准备,解析,初始化。

垃圾回收机制是指Java不需要程序员主动的释放内存。通过一些垃圾回收算法,在对象处于不活跃的情况下,垃圾回收机制会调用对象的finalize方法,标记这个对象处于即将废弃状态。

怎么确定一个对象到底是不是垃圾

引用计数算法

这种方式是给堆内存当中的对象记录一个引用个数,引用个数为0,就认为是垃圾.

可达性算法

这种方式是在内存中,从根对象乡下一直找引用,找到的对象就不是垃圾,找不到的对象就是垃圾.

JVM有哪些垃圾回收算法

标记清除算法

  • 把垃圾标记出来,直接将垃圾回收
  • 容易产生内存碎片

复制算法

  • 将内存分为大小相等的两半,每次只使用其中一半.垃圾回收时,将当前这一块存活对象全部拷贝到另一半,然后当前这一半内存直接清除
  • 不产生内存碎片,但是比较占用内存

标记压缩算法

  • 这种算法和标记清除算法一样,但是在标记之后不直接清理内存,而是将存活对象往一段移动,然后将边界以外的所有内存清除.

一个对象从加载到JVM,再到GC的过程

  • 首先把字节码文件内容加载到方法区
  • 然后在根据类信息在堆区创建对象
  • 对象首先会分配在堆区中年轻代Eden区,经过一次Minor GC后,对象如果存活,就会进入Suvivor区
  • 在后续的minor GC中,如果对象一直存活,就会在Suvivor去来回拷贝,每移动一次,年龄+1
  • 当年龄超过15以后,如果对象依然存活,对象就会进入老年代
  • 如果经过Full GC,被标记为垃圾对象,那么就会被GC线程清理掉.