【JAVA】JVM内存区域

JVM内存区域

JVM的内存区域分为线程私有区域(程序计数器、虚拟机栈、本地方法区)、线程共享区域(堆、方法区)和直接内存
在这里插入图片描述

  • 线程私有区域的生命周期与线程相同,随线程的启动而创建,随线程的结束而销毁。在JVM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存在与否和本地线程的启动和销毁对应。
  • 线程共享区域随虚拟机的启动而创建,随虚拟机的关闭而销毁。
  • 直接内存也叫作堆外内存。JDK的NIO模块提供的基于Channel与Buffer的I/O操作方式就是基于堆外内存实现的,NIO模块通过调用Native函数库直接在操作系统上分配堆外内存,然后使用DirectByteBuffer对象作为这块内存的引用对内存进行操作,Java进程可以通过堆外内存技术避免在Java堆和Native堆中来回复制数据带来的资源占用和性能消耗,因此堆外内存在高并发应用场景下被广泛使用(Netty、Flink、HBase、Hadoop都有用到堆外内存)。

程序计数器

  • 线程私有,唯一无内存溢出问题的区域
  • 用于存储当前运行的线程所执行的字节码的行号指示器。
  • 每个运行中的线程都有一个独立的程序计数器。
  • 方法执行时,程序计数器记录的是实时虚拟机字节码指令的地址
  • 如果方法执行的是Native方法,则程序计数器的值为空(undefined)

虚拟机栈

  • 描述Java方法的执行过程的内存模型。它在当前栈帧中存储了局部变量表、操作数栈、动态链接、方法出口等信息
  • 栈帧用来存储部分运行时数据及其数据结构,处理动态链接方法的返回值和异常分派。
  • 栈帧用来记录方法的执行过程,方法的执行和返回对应栈帧在虚拟机栈中的入栈和出栈。
  • 线程1在CPU1上运行,线程2在CPU2上运行,在CPU资源不够时其他线程将处于等待状态,等待获取CPU时间片
    在这里插入图片描述
  • 在线程内部,每个方法的执行和返回都对应一个栈帧的入栈和出栈,每个运行中的线程当前只有一个栈帧处于活动状态.

本地方法区

  • 与虚拟机栈作用类似,区别是虚拟机栈为执行Java方法服务,本地方法栈为Native方法服务。
  • 线程私有

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

方法区

  • 方法区也被称为永久代,用于存储常量、静态变量、类信息、即时编译器编译后的机器码、运行时常量池等数据。
    在这里插入图片描述
  • 线程共享
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZhShy23

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

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

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

打赏作者

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

抵扣说明:

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

余额充值