JVM系列(一)----JVM基本概念

一、什么是JVM

JVM(Java Virtual Machine) ,中文名java虚拟机,是由软件技术模拟出计算机运行的一个虚拟计算机。

java程序经过编译后,产生 .class 文件, jvm 才能识别并运行它,jvm 针对每个操作系统开发出对应的编译器,所以只要其操作系统有对应版本的jvm,那么java程序便能运行起来,这是java可以一次编译,到处运行的原因。

二、JRE、JDK和JVM的关系

JRE(Java Runtime Environment, Java运行环境)** 是Java平台,所有的程序都要在JRE下才能够运行。包括JVM和Java核心类库和支持文件。

JDK(Java Development Kit,Java开发工具包)** 是用来编译、调试Java程序的开发工具包。包括Java工具(javac/java/jdb等)和Java基础的类库(java API )。

JVM(Java Virtual Machine, Java虚拟机)** 是JRE的一部分。JVM主要工作是解释自己的指令集(即字节码)并映射到本地的CPU指令集和OS的系统调用。Java语言是跨平台运行的,不同的操作系统会有不同的JVM映射规则,使之与操作系统无关,完成跨平台性。

三、JVM基本概念

jvm基本结构如下:

说明: 方法区:线程共享的,用于存放被虚拟机加载的类的元数据信息:如常量、静态变量、即时编译器编译后的代码。也称之为永久代,有一个别名叫做Non-Heap(非堆)。

在JDK8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域取代。元空间的本质和永久代类似,都是对jvm规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在于虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入元空间,字符串和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制,而由系统实际可用空间控制。

采用元空间代替永久代的原因:

1. 字符串存在永久代中,容易出现性能和内存溢出。

2. 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大容易导致老年代溢出(因为堆内存有限,此消彼长)

3. 永久代会为GC带来不必要的复杂度,并且回收效率低。

四、JVM生命周期

1. 启动:启动一个Java程序,一个JVM实例就产生。拥有public static void main(String[] args)函数的class可以作为JVM实例运行的起点。

2. 运行: main()作为程序初始线程的起点,任何其他线程均可由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM使用,程序可以指定创建的线程为守护线程。

3. 消亡:当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。

五、JVM体系

- 类的加载机制

- jvm内存结构

- GC算法 垃圾回收

- GC分析 命令调优