简述Java内存区域

本编是在学习了周志明《深入理解Java虚拟机》之后,根据章节目录的提示凭借回忆来复习和总结所学内容。

1. Java五大内存区域及作用

程序计数器
书中原话是: 当前线程所执行字节码的行号指示器…在字节码解释器工作时通过改变这个计数器的值来获取下一个需要执行的字节码指令。
简单理解就是:告知程序下一步所执行的指令。
java虚拟机栈
虚拟机栈的单位是 栈帧 ,栈帧中包括有 局部变量表,操作栈,动态链接,方法出口 等信息。每个栈帧代表一个方法的调用,当方法开始调用时入栈,调用完毕 出栈。
简单理解就是:命令具体的执行地点。
本地方法栈
本地方法栈的结构和作用与java虚拟机栈一样,区别是本地方法栈针对的是使用Native调用的外部方法。
简单理解就是:服务于Native方法的 “java虚拟机栈” 。
👇
直接内存 的概念: 它并不是虚拟机运行时内存的一部分,而是外部内存。作用类似对本地方法调用的一种缓冲机制,避免java堆和Native堆来回复制数据。
java堆
存放使用所有对象实例的地点,如new等创建的对象实例。对于java的GC机制主要针对的就是这个区域。
简单理解就是:存放对象实例的地方。
方法区
与反射机制有关,用来存放类的信息(也就是类生成的.class字节码文件在加载如内存后就是放在方法区),常量,静态变量,JIT编译生成的代码和数据。
👇
在方法区中还有一个非常重要的部分:运行时常量池。
它是用来存放class文件中常量池内容的地方,这些信息包括编译期生成的各种字面量和符号引用。
此外运行时常量池除了存放class文件中的常量内容外,还可以在运行过程中动态的加入内容,比如String类的intern()方法就能将这个对象的字符串添加到常量池中。

打个比方:将程序运行比作生产工作车键里的工人工作,那么程序计数器是他的日程表,java虚拟机栈是他的工作台,本地方法栈是远在海外的原材供应商,java堆则是自家仓库,方法区则可以简单看做记在脑子里的工作经验。

2. 作用范围和周期

区域周期范围
程序计数器与线程相同线程私有
java虚拟机栈与线程相同线程私有
本地方法栈与线程相同线程私有
java堆虚拟机启动创建,关闭结束线程共享
方法区虚拟机启动创建,关闭结束线程共享

其实这些内容可以从它们的作用推断出来。

程序计数器和java虚拟机栈,可以从他们的结构可以明显看出,每个线程都得有自己的内容。

对于本地方法栈,在书中并没有明确的表明他的周期和范围, 但是可以通过他和java虚拟机栈是一样的(除了是针对Native方法外),看出他的周期和范围。

java堆既然是所有对象实例共同的摇篮,那么肯定是最开放的周期和范围。

而方法区从存放常量和静态变量来看就更明显了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值