Java (JVM) 内存模型

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

Java 虚拟机 (JVM) 

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

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

Java (JVM) 内存结构

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

 堆

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

 

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

JVM SwitchJVM 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 寄存器能够在某些特定平台上存储返回地址或本机指针。


作者:一枚路过的程序猿
链接:https://juejin.cn/post/7132312603363131428
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值