【Java】深入理解JVM学习笔记(一) —— JVM数据区域

JVM结构图

JVM结构

程序计数器

是一块较小的内存空间。当前线程所执行的字节码的行号指示器。

字节码解释器工作原理

通过改变计数器的值来选取下一条需要执行的字节码指令。

分支、循环、跳转、异常处理、线程恢复等操作都需要依赖计数器

JAVA多线程实现方式

线程之间轮流切换并分配处理器执行时间实现的

运行Java方法时,执行虚拟机字节码指令地址。
运行Native方法时,计数器则为空(undefined)。是唯一一个在java虚拟机中没有规定outOfMemoryError的错误


虚拟机栈

线程私有。虚拟机栈的生命周期和线程相同。用来描述java方法执行的内存模型。

栈帧

每个方法创建时产生

作用:存储局部变量表、操作数栈、动态链接、方法出口等。

每个方法调用到执行完成的过程,对应一个虚拟机栈帧入栈到出栈的过程

堆(Heap)栈(Stack)只是java虚拟机内存粗略的划分

局部变量存储了编译时期各种基本类型、对象引用。不等于对象本身,可能是指向对象起始地址的引用指针,也可能是代表一个对象的句柄或其他与此对象相关的位置和returnAddress(字节码地址)

特例:64位长度的long和double类型数据占用2个局部变量空间。其余只占用1个。

虚拟机栈异常

  1. 线程请求的栈深度大于虚拟机所允许的栈深度,抛出StackOverException
  2. 虚拟机动态扩展到无法申请到更多可用内存,抛出OutOfMemoryException

本地方法栈

虚拟机栈有的特性,本地方法栈都有。唯一的区别:虚拟机栈执行Java方法,本地方法栈执行Native方法


堆(Heap)

虚拟机管理内存中最大的一块。
被所有线程共享的内存区域。
唯一作用就是存放对象实例。

不过随着JIT编译器发展与逃逸分析技术成熟,栈上分配、标量替换也可以存放对象实例。

Java堆是垃圾收集管理的主要区域,也叫做GC堆。

从内存回收的角度看。由于垃圾回收分析采用分代收集算法。可细分为:新生代和老年代。也可分为:Eden空间、From Survivor空间、To Survivor空间。

从内存分配的角度看。线程共享的Java堆可划分多个线程私有的线程缓冲区。

划分的目的是为了更好的回收内存、更快的分配内存。

-Xms 和 Xmx 控制Java堆大小。

堆异常
如果堆中内存没有完成实例分配,抛出OutOfMemoryException


方法区

各个线程的共享区域。存储已加载的类信息、常量、静态变量以及编译器编译后的代码数据。
为了与Java堆区分开,方法区的另一个别名non-Heap(非堆)

非堆可以不实现垃圾收集。

运行时常量池

属于方法区一部分。用于存放编译时期生成的各种字面量和符号引用。
运行时常量池相当于Class常量池又一重要的特性:动态性。
运行期可将新的常量放入常量池。常用的是String的intern()

直接内存

不属于虚拟机运行时数据区。也不属于虚拟机定义的内存区域。但是被频繁使用。可能导致OutOfMemoryException出现。

NIO就使用了这个方式。通过使用Native函数直接分配给堆外内存。然后通过一个存储在Java堆中directByteBuffer对象作为这块内存的引用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值