- 先说说几个基本概念,后面再总结java内存数据模型。
内存储器 :主存,指内存条,分为只读存储器 ROM(数据已永久保存,在可读芯片上))、随机存储器RAM(可读写,断电即消失),一般说到内存,指的是计算机的随机储存器(RAM)
外存储器:硬盘、U盘、光盘及软盘
寄存器:在 cpu 内部,速度最快。
高级缓存(Cache):它是介于CPU与内存之间,常用有一级缓存(L1)、二级缓存(L2)、三级缓存(L3)(一般存在于Intel系列)。它的读写速度比内存还快,当CPU在内存中读取或写入数据时,数据会被保存在高级缓冲存储器中,当下次访问该数据时,CPU直接读取高级缓冲存储器,而不是更慢的内存。
CPU <-[Cache(L1、L2、L3)]-内存 <--硬盘
三者之间的关系:
简单来说,硬盘用来存储我们的程序和数据,当我们运行程序的时候,CPU首先接受到我们的命令,之后CPU是告诉硬盘,我要运行你存储的程序A,你把程序A送到内存去。
CPU对内存说,我让硬盘把程序A送到你这里来了,你保存一下。 等程序A被完整的送到内存之后。CPU就开始执行程序A。
- 在JAVA中,内存模型:有六个不同的地方可以存储数据。
1、寄存器 : 在 CPU内部,是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的 程序计数器,互不影响,--> 线程私有。
2、栈【包含java虚拟机栈、本地方法栈】 : 方法里的变量、参数,一般指局部变量,方法返回值 ,对象的引用? -->线程私有的,是线程安全的。
3、堆 : new创建的对象、数组,还有实例变量 -->被所有的线程共享。
4、静态区(全局区): 静态变量【类变量】,类的类型信息 -->被所有的线程共享,是在程序中永远的唯一的元素。
5、只读区(常量区【只读数据】+代码区【程序指令】): 常量final、程序代码 -->被所有的线程共享
6、非RAM存储,其他存储方式,不放置在内存中。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。
方法区这个概念是在 JVM 的数据区里面出现的,包含4、5两个,一般存放类的基本信息
这里再讲一下,JDK1.7之前运行时常量池是方法区的一部分,JDK1.7及之后版本已经将运行时常量池从方法区中移了出来,在堆(Heap)中开辟了一块区域存放运行时常量池。
运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。
- 上面的2-5存放于内存中
https://www.cnblogs.com/ChenZhongzhou/p/5685537.html C++中的栈内存和堆内存的区别
https://www.cnblogs.com/Lynn-Zhang/p/5449199.html 程序在内存中的分布
https://www.cnblogs.com/dotgua/p/6291925.html [java]我的数据在哪里?——数据的内存模型
https://www.cnblogs.com/panxuejun/p/5970739.html java中的基本数据类型存放位置
https://www.cnblogs.com/hqji/p/6582365.html java栈、堆、方法区详解
https://blog.csdn.net/u014470361/article/details/79297601 什么是栈区、堆区静态区(全局区)、常量区、代码区