0
点赞
收藏
分享

微信扫一扫

JVM性能优化之初识JVM

我是小小懒 2022-02-22 阅读 85

JVM性能优化之初识JVM

文章目录


一、什么是JVM

1.JVM简介

我们知道JAVA程序是跨平台的,可以一次编译到处运行,编译完成之后不管是windows、Linux还是Mac都可以直接运行,JVM就在这里起到了重要的作用。看下面这张图,这是C代码运行的情况,不同的平台需要执行不同的编译然后才能运行:
在这里插入图片描述
下面是Java代码的执行情况,Java的代码编译完成之后是.class文件,class文件是不区分平台的,真正让代码适配不通平台的是JVM虚拟机,还记得安装虚拟机的时候需要安装不通平台的安装包了吧,JVM负责将class文件解析为自己平台的二进制去执行,这样Java就可以跨平台了:
在这里插入图片描述

2.JDK、JRE和JVM的关系

我们常常听到JDK和JRE,现在又加了个JVM,它们3者之间又什么关系或者联系呢?

根据介绍可以知道(JDK官方文档有详细的图说明),JDK是JAVA的运行环境(JRE) + 一些JAVA工具;而JRE是JAVA虚拟机(JVM) + 一些标准库。所以它们之间的关系我们可以用下面的韦恩图来表示:

在这里插入图片描述

二、JVM的内存结构

JVM内存分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分,其中堆和方法区是线程共享的,而虚拟机栈、本地方法栈和程序计数器是线程独占的。
在这里插入图片描述
下面简单的介绍一下JVM内存的五个结构,后面文章再每个部分都详细的讲解。

1.堆

堆是虚拟机中内存最大的部分,是线程共享的,在虚拟机启动的时候创建堆空间,主要用来存放我们new出来的对象实例,堆是GC中最重要的区域。所以站在GC的角度上我们还可以把堆分为新生代和老年代,新生代又可以分成Eden区、From Survivor区和To Survivor区,如下图所示:
在这里插入图片描述
根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

2.方法区

和堆空间一样,方法区也是线程共享的,主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区同样可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。

3.虚拟机栈

虚拟机栈是线程私有的,Java虚拟机栈和线程同时创建,用于存储栈帧。每个方法在执行时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直到执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

4.本地方法栈

本地方法栈与虚拟机栈的作用相似,当然本地方法栈也是线程私有的,看名字我们就知道,它区别于虚拟机栈是本地方法栈调用的是本地方法,也就是我们常见的Native方法。

5.程序寄存器

程序计数器也叫PC寄存器,是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

三、三大商用虚拟机

  • HotSport VM:JDK1.3时成为JVM默认的虚拟机直到现在,占有绝对的市场地位。它的起名就是指的热点代码探测技术,优点是可以通过计数器找到最具有编译价值的代码,触发即时编译或栈上替换,以及通过编译器与解析器协同工作的模式,在最优化的程序相应时间与最佳执行性能中取得平衡。我们常说的JVM内存结构包括其它分析一般都是指的HotSport VM。
  • JRockit:JRockit专注于服务器端的应用,其内部不包含解析器的实现,是目前最快的虚拟机。JRockit的优点在于全面的Java运行时解决方案组合,其中JRockit Real Time解决方案提供毫秒甚至微妙级的JVM相应时间适用于军事指挥以及电信网络的需要;其提供的MissionControl服务套件可以以极低的开销来监控、管理和分析生产环境中的应用程序。JRockit于2008年被oracle收购。
  • J9:J9是IBM公司制作的虚拟机,定位于HotSpot相似,适用于服务器端、桌面应用以及嵌入式等多种用途。J9也号称为目前世界上最快的JAVA虚拟机,当然它的最快是在IBM自己的产品上。
举报

相关推荐

0 条评论