Java (JVM) 内存模型

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Java 虚拟机 (JVM)

JVM 是一种抽象计算机,它使计算机能够运行 Java 程序。JVM 有三个概念: 规范 (指定 JVM 的工作方式。但实现已由 Sun 等公司提供)、 实现 (称为 (JRE) Java 运行时环境)和 实例 (编写 Java 命令后,运行Java 类,一个 JVM 实例被创建)。

Java 虚拟机加载代码、验证代码、执行代码、管理内存(这包括从操作系统 (OS) 分配内存、管理 Java 分配,包括堆压缩和垃圾对象的删除)并最终提供运行时环境。

Java (JVM) 内存结构

JVM 定义了在程序执行期间使用的各种运行时数据区域。有些区域是由 JVM 创建的,而有些是由程序中使用的线程创建的。但是,JVM 创建的内存区域只有在 JVM 退出时才会被销毁。线程的数据区在实例化时创建,在线程退出时销毁。 image.png

堆内存是运行时数据区域,所有 java 类实例和数组的内存都从该区域分配。堆是在 Java 虚拟机启动时创建的,并且在应用程序运行时可能会增加或减少大小。可以使用 –Xms VM 选项指定堆的大小。根据垃圾收集策略,堆可以是固定大小或可变大小。可以使用 –Xmx 选项设置最大堆大小。默认情况下,最大堆大小设置为 64 MB。

image.png 堆内存被分为年轻代老年代,比例为1:2
年轻代又被分为伊甸区两个幸存者区,比例默认为:8:1:1
常用的一些JVM内存参数设置

JVM Switch JVM Switch Description
-Xms 设置 JVM 启动时的初始堆大小
-Xmx 设置最大堆大小
-Xmn 设置年轻代的大小,其余空间用于老年代
-XX:PermGen 设置永久代内存的初始大小
-XX:MaxPermGen 设置 Perm Gen 的最大大小
-XX:SurvivorRatio 提供 Eden 空间的比例,例如,如果年轻代大小为 10m,VM 切换为 –XX:SurvivorRatio=2,则将为 Eden 空间保留 5m,为两个 Survivor 空间保留 2.5m。默认值为 8
-XX:NewRatio 年轻代和老年代的比例

堆是一个共享的运行时数据区,并将实际对象存储在内存中。它在虚拟机启动期间被实例化

方法区

  • 它是堆区域的逻辑部分,在虚拟机启动时创建。
  • 该内存分配给类结构、方法数据和构造函数字段数据,以及类中使用的接口或特殊方法。堆可以是固定大小或动态大小,具体取决于系统的配置。
  • 可以是固定大小或根据计算需要扩展。不需要是连续的。

虽然方法区在逻辑上是堆的一部分,但它可能会或可能不会被垃圾收集,即使垃圾收集在堆区是强制性的。

JVM 栈

  • 堆栈在创建线程的同时创建,用于存储方法返回值和执行动态链接时需要的数据和部分结果。
  • 堆栈可以是固定大小或动态大小。堆栈的大小可以在创建时独立选择。
  • 堆栈的内存不需要是连续的。

本地方法栈

本机方法堆栈不是用Java语言编写的。该内存是在创建时为每个线程分配的。它可以是固定的或动态的。

程序计数器(PC寄存器)

每个执行特定方法任务的 JVM 线程都有一个与之关联的程序计数器寄存器。非本地方法具有存储可用 JVM 指令地址的 PC,而在本地方法中,程序计数器的值是未定义的。PC 寄存器能够在某些特定平台上存储返回地址或本机指针。

猜你喜欢

转载自juejin.im/post/7132312603363131428