硬件内存模型
物理机并发处理的解决方案对于JVM内存模型的实现也有很大的参考作用。毕竟JVM也是做硬件层面的事情,底层架构也决定了上层的架构建模方式。
计算竞争不仅仅是多个处理器参与计算,而是会涉及到一系列的硬件问题,其中最直接的就是需要记忆交互。然而,计算机的存储设备与处理器的预算速度相差太大,根本无法满足处理器的处理速度。该怎么办?它涉及到在处理器和存储器之间添加一个读写速度接近处理器运行速度的缓存层作为处理器和缓冲区。
缓存从内存中复制使用过的数据,以方便处理器快速运行,然后将计算后的数据同步到主存中,以便处理器无需等待。
缓存虽然解决了处理器和内存之间的冲突,但也给计算机带来了另一个问题:缓存一致性。特别是当多个处理器涉及同一主存区域时,各自的缓存数据可能会不一致。
那么,当出现不一致时,谁应该占上风?
要解决这个问题,处理器和内存之间的读写必须遵循一定的协议。此类协议包括:MSI、MESI、MOSI。Synapse、Firefly和DragonProtocol等这就是上图中处理器、缓存和内存的管理方式。
除了缓存之外,为了充分利用处理器,处理器会对代码输入指令的乱序执行进行优化,只要输出一致,输入信息可以随意重新排列,因此程序中指令的计算顺序与输入代码的顺序不一致。
JVM内存模型
上面我们了解了硬件内存模型,以此为参考,我们来看看jvm的内存模型。
jvm定义的一组Java内存模型,用于实现跨所有平台一致的内存访问效果,从而屏蔽消除了各种硬件和操作系统的内存访问差异。这与C和C++不同。C和C++会直接使用操作系统的物理硬件和内存模型来进行处理,因此每个平台上都会有差异。Java的情况并非如此。
Java的内存模型要求所有变量都存储在主存中。Java课程发现,每线程都有自己的工作内存,工作内存保存了线程使用的变量的主内存副本。线程的所有操作、读取和变量赋值都必须在工作内存中执行。主存变量不能直接写入主存来完成。
Linux中的线程本身有自己的线程栈,也使用了内存调度器,大于10M,所以通过减少可以看出线程占用的最小内存-s。
上一篇:华为怎么扩大内存容量代码
下一篇:java吃cpu还是内存