java内存模型是学习java的基础,如果了解的不够透彻将很难学好java。所以不论理论知识多么的枯燥,也需要去记住并理解。最重要的是理解,不然后面的java路肯定是荆棘丛生。
多做笔记肯定是有好处,把不理解的东西写出来。去网上查阅资料,把认为正确的比较精华的东西整理一下。就算复制一些资料,以后在自己的博客里查找也比较方便,自己有心得时也可以补充。
言归正传 想要理解java内存的划分就需要知道java的特性以及运行机制,java的跨平台,多态 等
1 . java程序是在 jvm运行的,所以java内存的划分 实际就是虚拟机内存的划分。(因为java的跨平台特性,不同平台只需要下载相应版本的jre。所以java程序在jvm内运行)
2 .java程序的运行机制 请参考另一篇文章 https://www.cnblogs.com/zjf6666/p/9184374.html
二 . java运行时数据区域的划分
有篇文章画的图片 挺好的,总结了内存的划分。
1.程序计数器 (program counter,pc)
从百科的定义来看,程序计数器是用于存放下一条指令所在单元的地址的地方。
程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。- - 《深入理解Java虚拟机》
特性
- 因为处理器在一个确定时刻只会执行一个线程中的指令,线程切换后,是通过计数器来记录执行痕迹的,因而可以看出,程序计数器是每个线程私有的。
- 如果执行的是java方法,那么记录的是正在执行的虚拟机字节码指令的地址的地址,如果是native方法,计数器的值为空(undefined)。
- 这个内存区域是唯一一个在java虚拟界规范中没有规定任何OutOfMemoryError的情况的区域。(由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的) 更多可以参考https://blog.csdn.net/leaf_0303/article/details/78953669
2 .本地方法栈
本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。
在JVM规范中,并没有对本地方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。
同虚拟机栈相同,Java虚拟机规范对这个区域也规定了两种异常情况StackOverflowError
和 OutOfMemoryError
异常。
程序计数器 和 本地方法栈 对我们来说不是太重要
3 虚拟机栈(java 栈)
4 java堆
5 方法区
3 ,4,5 参考 https://www.cnblogs.com/zjf6666/p/9264498.html