计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区。起初,用户磁盘和CPU的交互,而CPU的速度越来越快,磁盘远远跟不上CPU的运行速度,才设计的内存,用户缓冲用户IO等待导致CPU的等待成本越来越大,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高度缓存,用来缓解这种症状。因为,现在CPU同内存交互就变成了CPU——》高速缓存——》内存。
根据摩尔定律,我们知道单核CPU的主频不可能无限制的增长,要想很多的提升性能,需要多个处理器协同工作,可以理解为升维到多核。
与此同时,也引入了新的问题:缓存一致性问题。在多处理器系统中,每个处理器有自己的高速缓存,而他们又共享同一块内存(即主存),当多个处理器运算都涉及到同一块内存区域的时候,就有可能发生缓存不一致的现象。为了解决这一问题,需要各个处理器运行时都遵循一些协议,在运行时需要将这些协议保证数据的一致性。
JAVA虚拟机内存模型中定义的访问操作与物理计算机处理的基本一致!
JAVA中通过多线程机制使得多个任务同时执行处理,所有线程共享JVM内存区域主存,而每个线程又单独的有自己的工作空间,当线程与内存区域进行交互时,数据从主存拷贝到工作内存,进而交由线程处理(操作码+操作数)。
JVM的逻辑内存模型:
1 程序计数器:线程私有
2 JAVA虚拟机栈:线程私有
3 JAVA虚拟机堆:线程共享。垃圾收集管理的主要区域。堆空间大小通过-Xmx和-Xms控制,通常两者值相同,防止自动扩展。
4 本地方法栈
5 方法区:线程共享。通常存放类信息,常量,静态变量,即时编译器编译后的代码
6 运行时常量池
7 直接内存:不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区,但是这部分会被频繁的调用且会产生内存溢出
内存中存在的两种异常情况:内存泄漏、内存溢出。其中,内存泄漏堆积后超出内存最大值就会出现内存溢出。
产生内存溢出的原因:
1 内存中加载的数据国语庞大,如一次从数据库中取出过多的数据;
2 集合类中有对对象的引用,但是使用完之后没有清空,使得JVM不能回收;
3 死循环或者循环过多重复对象实体;
4 第三方软件有BUG;
5 启动参数内存值设定太小。