薄情先生|程序员进阶系列:多图教你掌握JVM( 二 )
如上图所示 , 按照内存共享来划分 JVM 内存 , 主要划分为线程共享内存区域(堆、方法区)、线程私有内存区域(程序计数器、虚拟机栈、本地方法栈)、直接内存 。
JVM 运行时数据区解剖从上面介绍 , 可以清晰知道 JVM 运行时数据区 , 主要分为程序计数器、虚拟机栈、本地方法栈、方法区、堆 。 接下来就逐步解剖 , 简单了解一下 。
- 程序计数器
主要是为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置 , 每个线程都需要有自己独立的程序计数器 。
- 虚拟机栈
JVM 栈是每个线程私有的 , 线程创建的同时都会创建对应的 JVM 栈 。
JVM 栈中存放的是当前线程中局部基本类型的变量、返回结果以及 Stack Frame , 而非基本类型的对象在 JVM 栈上仅存放一个指向堆上的地址 。
- 本地方法栈
- 方法区
在方法区中 , 主要存放静态变量、常量、类信息、运行时常量池以及所有的方法的信息 。 运行时常量池(Runtime Constant Pool)是方法区的重要一部分 , 用于存储编译器生成的常量和引用 。
如上图所示 , 值得注意的是 JDK 1.8 相比 JDK 1.7 , JVM 运行时数据区划分中的方法区(持久代)从 JVM 运行时数据区拿掉了 , 而在本地内存加入了元数据区(Metadata Memory) , 简而言之在 JDK 1.8 中 , 元数据区替代了方法区(持久代) 。
- 堆
- 其它
在 JDK 1.4 中加入了 NIO , 引入了一种基于通道(Channel)与缓冲区(Buffer)的 I/O 方式 , 它可以使用 Native 函数库直接分配堆外内存 , 然后通过一个存储在 Java 堆里面的DirectByteBuffer 对象作为这块内存的引用进行操作 。
避免了在 Java 堆和 Native 堆中来回复制数据 , 能在一些场景中显著提高性能 。
寄语写最后本次 , 主要让大家了解一下 JVM 的内存结构 , 希望通过本次分享 , 大家对 JVM 能有个梗概的认识 , 想要彻底掌握还需针对性的弥补 , 说句心里话 , 希望能够把这些图都记在脑子里 , 只要做到脑中有图 , 心就不慌 。
好了 , 本次就谈到这里 , 一起聊技术、谈业务、喷架构 , 少走弯路 , 不踩大坑 。 欢迎关注「一猿小讲」 , 会持续输出原创精彩分享 , 敬请期待!
历史原创推荐程序员进阶系列:你真的懂 HelloWorld 吗?
程序员进阶系列:年少不懂爱家家 , 懂了已是猿中人
Java线程池深度揭秘
Java 8 的这些特性 , 你知道吗?
Java程序跑的快 , 全要靠线程带
推荐阅读
- 薄情娱乐咖|还能登上人生巅峰,贾诩简直就是张绣的“人生导师”,打一手烂牌
- 脑极体|百度之星正在出圈,用十六年打造程序员版“天才请就位”
- 方舟先生|称用作品说话,粉丝可以先看其他人,胡歌被侃失踪人口但无惧掉粉
- LOL嘴强老司机|老骥伏枥!卡萨六进世界赛首次闯入四强!从决胜局拉哥到关键先生
- 中国新闻网|马来西亚将“云纪念”陈嘉庚先生146周年诞辰
- 八卦先生|新版《粉红女郎》:殷桃不及陈好有风情,男配角比原版颜值降级
- 程序员|我国超重型火箭核心设备亮相,载重超“胖五”5倍,还用上了3D打印
- 小彩说娱乐|本以为会丑,却是被天使吻过的脸,有种基因叫“憨豆先生”的女儿
- 体育先生V|GOAT之争极其激烈的五大体育项目
- 体育先生V|现役只有他最有机会吗?,詹姆斯加入4冠+4MVP俱乐部第四人
