JVM的内存区域

一、JVM的内存区域

       JVM的内存区域分为线程私有区域(程序计数器、虚拟机栈、本地方法区)、线程共享区域(堆、方法区)和直接内存。

在这里插入图片描述

  1. 线程私有区域的生命周期与线程相同,随线程的启动而创建,随线程的结束而销毁。
  2. 线程共享区域随虚拟机的启动而创建,随虚拟机的关闭而销毁。
  3. 直接内存也叫作堆外内存,它并不是JVM运行时数据区的一部分,但在并发编程中被频繁使用。
1.1 程序计数器

       程序计数器是一块很小的内存空间,用于存储当前运行的线程所执行的字节码的号指示器。每个运行中的线程都有一个独立的程序计数器,在方法正在执行时, 该方法的程序计数器记录的是实时虚拟机字节码指令的地址:如果该方法执行的是Native方法,则程序计数器的值为空( Undefined )。程序计数器属于“线程私有”的内存区域,它是唯一没有内存溢出区域。

1.2 虚拟机栈

       虚拟机栈是描述Java 方法的执行过程的内存模型,它在当前栈帧中存储了局部变量表、操作数栈、动态链接、方法出口等信息。同时,栈帧用来存储部分运行时数据及其数据结构,处理动态链接方法的返回值和异常分派。
在这里插入图片描述

1.3 本地方法区

       本地方法区和虚拟机栈的作用类似,区别是虚拟机栈为执行Java 方法服务。本地方法栈为Native方法服务。

1.4 堆

       在JVM运行过程中创建的对象和产生的数据都被存储在堆中,堆是被线程共享的内存区域,也是垃圾收集器进行垃圾回收的最主要的内存区域。由于现代JVM采用分代收集算法,因此Java堆从GC的角度还可以细分为:新生代、老年代和永久代。

1.5 方法区

       方法区也被称为永久代,用于存储常量、静态变量、类信息、即时编译器编译后的机器码、运行时常量池等数据。
JVM把GC分代收集扩展至方法区、即使用Java 堆的永久代来实现方法区,这样JVM的垃圾收集器就可以像管理Java堆一样管理这部分内存。 永久带的内存回收主要针对常量池的回收和类的卸载,因此可回收的对象很少。

二、JVM内存模型(JMM)

       JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。

参考书籍:[1] 王磊,Offer来了,电子工业出版社

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒙面侠1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值