JDK,JRE,JVM是什么
JDK全称为Java Development Kit(Java开发工具包),提供了Java语言开发的一系列工具,可以用来运行,编译Java程序。
JRE全称为Java Runtime Environment(Java运行环境),是Java语言的运行环境。
JVM全称为Java Virtual Machine(Java虚拟机),是一种计算机平台的规范,是一种虚拟的计算机,JVM是专门用来运行Java程序的,不同的操作系统中,可以安装与操作系统适应的JVM。
【注意】
- JDK和JRE并不是包含与被包含的关系,因为JDK是Java开发工具包,而JRE是Java运行环境。如果我们只需要进行Java开发,那么只需要安装JDK即可,同理,如果我们只是需要进行Java程序的运行,那么只安装JRE即可。但是,在一般的JDK中,都会包含JRE,所以我们日常所说的JDK,其实也都是指包含了JRE的JDK。
- 不同的操作系统需要安装相对应的JVM,这也是Java程序为什么可以跨平台运行的原因,因为不同操作系统的JVM屏蔽了Java程序与操作系统之间的联系。
JVM的组成
Java虚拟机一共由两部分组成,分别是两个子系统和两个组件。
两个子系统
- 类加载(Class loader):根据给定的全限定名类名来装载class文件到Runtime data area中的method area。
- 执行引擎(Execution engine):执行classes中的指令。执行引擎包含即时编译器和垃圾回收器。
两个组件
- 本地接口(Native Interface):与native libraries交互,是其它编程语言交互的接口。
- 运行时数据区(Runtime data area):这就是我们常说的JVM的内存。
JVM的内存
JVM的内存,即运行时数据区,分为两个区域,分别是线程隔离数据区和线程共享数据区。
线程隔离数据区
- 程序计数器:当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。
- 本地方法栈:与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的。
- Java虚拟机栈:用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
线程共享数据区
- Java堆:Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存。
- 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
JVM调优
JVM调优参数 | 说明 |
---|---|
-Xms2g | 初始化推大小为 2g |
-Xmx2g | 堆最大内存为 2g |
-XX:NewRatio=4 | 设置年轻的和老年代的内存比例为 1:4 |
-XX:SurvivorRatio=8 | 设置新生代 Eden 和 Survivor 比例为 8:2 |
–XX:+UseParNewGC | 指定使用 ParNew + Serial Old 垃圾回收器组合 |
-XX:+UseParallelOldGC | 指定使用 ParNew + ParNew Old 垃圾回收器组合 |
-XX:+UseConcMarkSweepGC | 指定使用 CMS + Serial Old 垃圾回收器组合 |
-XX:+PrintGC | 开启打印 gc 信息 |
-XX:+PrintGCDetails | 打印 gc 详细信息 |