深入理解JVM内存模型

       计算机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   启动参数内存值设定太小。

                               

猜你喜欢

转载自blog.csdn.net/luomanqshijie/article/details/81147226