当前位置:首页 > 内存 > 正文

jvm内存模型详解(jvm内存模型划分)

  • 内存
  • 2024-06-07 11:38:56
  • 5380

一、java课程分享java多线程的内存模型


硬件内存模型

物理机并发处理的解决方案对于JVM内存模型的实现也有很大的参考作用。毕竟JVM也是做硬件层面的事情,底层架构也决定了上层的架构建模方式。


计算竞争不仅仅是多个处理器参与计算,而是会涉及到一系列的硬件问题,其中最直接的就是需要记忆相互作用。然而,计算机的存储设备与处理器的预期速度相差太大,根本无法满足处理器的处理速度。该怎么办?它涉及到在存储器之间添加一个读写速度接近处理器运行速度的缓存层以及一个缓冲区。


缓存从内存中复制使用过的数据,以方便处理器快速运行,然后将计算后的数据同步到主存中,以便处理器无需等待。


缓存虽然解决了处理器和内存之间的冲突,但也给计算机带来了另一个题:缓存一致性。特别是当多个处理器涉及同一主存区域时,各自的缓存数据可能会不一致。


当出现不一致时,谁应该占上风?


要解决这个问题,处理器和内存之间的读写必须遵循一定的协议。此类协议包括:MSI、MESI、MOSI。Synapse、Firefly和DragonProtocol等这就是上图中处理器、缓存和内存的管理方式。


除了缓存之外,为了充分利用处理器,处理器还会对代码输入指的乱序执行进行优化,只要输出一致,输入信息可以随意重新排列,因此程序中指令的计算顺序与输入代码的顺序不一致。



JVM内存模型

上面我们了解了硬件内存模型,以此为参考,我们来看看jvm的内存模型。



jvm定义的一组Java内存模型,用于实现跨所有平台一致的内存访问效果,从而屏蔽消除了各种硬件和操作系统的内存访问差异。这与C和C++不同。C和C++会直接利用操作系统的物理硬件和内存模型进行处理,因此在各个平台上会有差异。Java的情况并非如此。


Java的内存模型要求所有变量都存储在主内存中。Java课程发现每个线程都有自己的工作内存,工作内存保存了线程使用的变量的主内存副本。线程的所有操作、读取和变量赋值都必须在工作内存中执行。主存变量不能直接写入主存来完成。



二、详解JVM内存结构组成

你了解JVM内存结构吗?JVM内存结构主要包括两个子系统和两个组件。这两个组件是Runtimedataarea组件和Nativeinterface。)组件

JVM内存结构

最近我研究了一些Java内存泄漏的案例,并与一些以前的朋友进行了讨论。经过详细调查,我们发现以下情况:为了拆解关于JVM有很多以前不为人知的细节,我们首先来看看JVM的内部结构。

如,JVM内存结构主要由两个子系统和两个组件组成。这两个子系统是Classloader子系统和Executionengine子系统。这两个组件是Runtimedataarea组件和Nativeinterface组件。

Classloader子系统的作用

将一个类文件的内容加载到Runtimedataarea的方法区(methodarea)中。Java程序员可以通过基于提供的完全限定类名(例如javalangObject)扩展javalangClassLoader类来创建自己的类加载器。

子系统的作用

类中的执行指令。JVM规范实现(JDK)的核心是执行引擎。各种JDK,比如Sun的JDK、IBM的JDK,其质量主要取决于它们实现的执行引擎的质量。

Nativeinterface组件

与原生库交互是其他编程语言与之交互的接口。当您调用本机方法时,您进入了一个不限于虚拟机的新世界。所以用原生也很方便。heapOutOfMemory,不受JVM控制

RuntimeDataArea组件

这就是我们常说的JVM内存,它主要分为五个部分——

HeapJava虚拟实例只有一个堆区域。

MethodArea当虚拟机加载特定类型时,有关加载类的信息将存储在内存中的Methodarea中。使用类。加载器找到对应的类文件,取类文件的内容,并传输给虚拟机。

JavaStack虚拟机直接在虚拟机上只执行两个操作。每帧Javastack。压入或弹出堆栈。

ProgramCounter每个线程都有自己的PC寄存器,该寄存器在线程启动时创建,始终指向下一条要执行的指令。地址这里的地址是本地指针或偏移量,对应于方法区域内的方法的起始指令。

lishixinzhi/Article/program/Java/hx/201311/26038


三、程序员必须掌握的21个Java核心技术!

程序员的Java技能宝库:深入探索Java核心技术。


内存模型和GC基础知识

了解JVM内存结构,包括堆、栈和方法区,并学习新生代和老年代垃圾回收机制。。、javac和java命令的工作原理是Java开发人员的基础知识。


2.数据类型和对象基础知识

掌握基本数据类型和对象概念,从基本类型到对象实例(类和实例)。然后您将了解多态性的本质以及如何封装和继承静态属性和方法的灵活使用。


3.集合框架和工具

深入了解List、Set、Map的底层实现,您可以使用集合工具类来:学习如何做事。提高数据运营效率。


4.异常处理和IO

统一了Throwable、Exception、RuntimeException的区别,并掌握InputStream、OutputStream、NIO和多线程机制。可调用/可运行、同步和可重入锁)。


网络编程通过MINA/Netty框架提供高效的TCP/UDP通信。


5.时间和日期处理

从JDK8开始,时间和日期API经过优化,可以准确地处理日期和时间操作。


和JSON解析

XML/JSON解析不是J2SE核心的一部分,但现代开发框架包含它是必不可少的。(杰克逊、FastJson、Gson等)。


和工具

Maven是Java开发人员的必备工具,它包含30个实用命令,使项目管理变得轻松高效。


8.泛型和注解

泛型通过使用Spring框架注解简化了编程,减少了XML配置,但是全局的请谨慎管理。语言之间的兼容性。


9.边缘技术

RMI用于远程调用接口,但在某些场景下它仍然很有价值。JNI涉及Java和本地代码之间的交互。注意正确加载本地库路径。


10.职业发展指南

根据您的求职需求,自学Java的学位和学习路径非常重要。我们分享8年经验开发者的建议,提供系统的学习路线和实用的改进建议。


加入Java程序员交流圈,共同分享、共同成长。


掌握以上要点,你的Java技能将会更加扎实,能够轻松应对日常开和挑战。