写点什么

jvm

  • 2022 年 8 月 07 日
  • 本文字数:1497 字

    阅读完需:约 5 分钟

1、什么是 jvm?


JVM 是 java virtual machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚拟出来的计算机,是通过在实际的计算机上模拟各种计算功能来实现的。

主流的 jvm 有:HotSpot (平时我们开发用到的)J9 、JRckit,Zing 等等。

2、jvm 与操作系统的关系

jvm 是编程语言与操作系统的桥梁,或者说是中间件,作用就是通过解释器把字节码文件解释成各个操作系统能识的信息。

3、jdk、jre,jvm 的关系

jvm 是运行的核心,但是只有 jvm 是什么也干不了,jre 是 jvm 运行时需要的 jar 需要的一些类库,与 jvm 共同组成了运行时环境,

jdk 除了包含 jre 与 jvm 还有以下工具,比如 java,javac、javadoc、javap 等等。



4、jvm 的整体架构

jvm 主要分为五大区,①类装载器子系统、②、运行时数据区、③、执行引擎、④本地方法接口、⑤垃圾回收模块

4.1、运行时数据区

线程私有:

①、程序计数器

程序计数器时一块很小的内存空间,可以看作是当前线程执行的信号指示器,虚拟机的

字节码解释工作就是通过改变程序计数器的数值来获取下一条要执行的指令。一个处理器同一个时刻只能执行一个线程中的一条指令,在处理多个线程时会切换,所以为了再次切换回来时正确的恢复到切换前的位置,每个线程都会有一个单独的程序计数器,记录当前线程的执行位置,各个线程之间的计数器互补影响,独立存储。

②、Java 虚拟机栈

java 虚拟机栈与计数器一样时线程私有的。它的生命周期与线程生命周期相同,虚拟机栈描述的是 Java 方法执行的内存模型,每个方法执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等等

--->栈帧 :在栈中对每个方法的信息的封装与体现,主要存储局部变量表,操作数栈,动态链接,方法出口等信息。

③、本地方法栈

本地方法栈也是和 java 虚拟机栈的作用相似,只不过本地方法栈是为虚拟机使用到的 native 方法服务,在虚拟机规范中并没有对本地方法的使用语言有要求,所以可以由各个厂商自行决定使用什么语言,,甚至有的虚拟机之间把本地方法栈与虚拟机栈合二为一,比如 sun HotSpot 虚拟机。

线程共享:

①、堆(大小可以执行 -Xmx 、Xms)

对于大多数的应用来说,Java 堆(Java heap)是虚拟机中最大的一块内存,是被所有线程共享的一块内存区域,堆的存在主要目的就是存放 Java 对象,几乎所有的对象都在堆中分配内存,但是 JIT 编译器的发展与逃逸分析技术的逐渐成熟,也不那么绝对了。

堆主要分为新生代和老年代(比例为 1:2),但是可以修改 -XX:NewRatio=4 表示 1:4

新生代:Eden,与 From Survivor 、To Survivor 三个区 比例为 8:1:1 也可以通过参数设置 –XX:SurvivorRatio 


②、方法区

1.7 之前是放在永久代中,之后 hotspot 把永久代移除,用了元空间来替代,永久代以前是字 jvm 内存中和堆空间是连续的,元空间是物理机内存的一部分与 Java 堆不连续了,

方法区与堆一样是各个线程共享的,主要存放的被虚拟机加载的类的信息,常量,静态变量,即时编译器编译后的代码缓存等数据。

-->为什么要废除永久代?

  • 在原来的的永久代中,永久代需要存放类信息,常量,静态变量等等。它的大小容易确定,不如类由多少,常量由多少,静态变量的 多少等等,使用 -XX:MaxPermSize 指定很容易造成永久代的内存移除。

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


③、直接内存(非运行时数据区的一部分)

  • 之间内存不是虚拟机运行时数据区的一部分,在 jdk 引入 NIO 类时,引入了通道与缓存区,它可以使用 native 函数库之间分配堆外内存,然后通过一个存储在 Java 堆里面的 DirectByteBuffer 对象作为着一块内存引用操作,避免 java 堆和 native 堆总来回复制数据。

用户头像

还未添加个人签名 2020.06.05 加入

还未添加个人简介

评论

发布
暂无评论
jvm_JVM_InfoQ_48703db93d9b_InfoQ写作社区