Appearance
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线程清理掉.