JAVA虚拟机学习之内存区域篇(一)

特别声明:本文为日常学习总结,纯属自用用途,不做其他参考,如有错误,欢迎指正。

JAVA虚拟机数据区域: 方法区,堆,虚拟机栈,本地方法栈, 程序计数器。

图片来源于网络

本图来源于网络
方法区:
– 别名:(非堆),hotsopt上称为:永久代 ,JAVA虚拟机规范将之描述为堆的一个逻辑部分。
– 作用:存储已经被虚拟机加载的类的信息,常量,静态变量, 也就是编译后的代码数据。
– 特点: 是一个被各个线程共享的内存区域,内存不足时抛出异常:OutOfMemoryError。

堆区:

– 作用: 存放对象实例就是其唯一目的。
– 特点: JAVA虚拟机管理的内存中最大的部分, 所有线程共享。 也是GC的主要区域。
堆在物理内存空间上可以不连续。内存不足时抛出异常:OutOfMemoryError。

JAVA虚拟机栈:
– 作用: 对应着JAVA方法的执行,每个方法在执行的时候回创建一个栈帧,里面存放着局部变量表、操作数栈、动态链接,方法出口等信息。方法的调用到完成,对应着入栈到出栈过程。 注意:局部变量表的内存空间在编译期间就分配好了,后期不会变化。
– 特点: 线程私有, 生命周期和线程相同。两种异常:栈深过深:StackOverFlowError;内存不足:OutOfMemoryError。

本地方法栈:
– 作用: 和JAVA虚拟机栈类似。区别在于: 为虚拟机用到的Native服务。
– 注意: 本地方法大部分是用C语言实现,并没有变异成字节指令。

程序计数器:

– 目的 : 细分到一个处理器上来观察,由于虚拟机的多线程是通过线程轮流切换并分配处理器执行时间来实现的。任一时刻,处理器都会执行一个线程中的指令。 为了让线程在切换的过程中,能恢复到正确执行的位置,故每个线程都需要安排一个程序计数器。
这个计数器里存放的数据为: 线程正在执行的虚拟机字节码指令地址。如果是native方法,则计数器为空。
特点: 每个线程都独立拥有一个计数器。互相不独立。该部分的内存区域: 线程私有。
注意:这部分内存是JAVA虚拟机规范中唯一一个没有规定任何OutOfMemoryError的区域。

补充:
运行时常量池:
– 作用: 是方法区的一部分,Class文件中包含常量池信息,用于存放编译器生成的各种字面量和符号引用。

直接内存:
– 作用: 也成为堆外内存,不经过虚拟机,直接访问系统内存。一般来说,堆内存在使用的时候,是先拷贝到直接内存的。
在JDK1.4中新加入的NIO(new input /output 类),引入了基于通道和缓冲区的IO方式,(重点来了。。。)可以使用Native函数库直接分配堆外内存。通过JAVA堆中的DirectByteBuffer对象作为这块内存的引用来操作。
– 特点: 内存分配不收JAVA堆大小的限制,但是受本机内存的限制。
– 对比: 堆内存:分配快,访问慢! 直接内存:分配慢,访问快!
– 使用场景: 直接内存适用于 需要大内存且需要频繁访问的场景。

后续篇与本文连续。如需转载,注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值