Java语言基础内存模型 Java语言基础内存模型是指Java虚拟机(JVM)在计算机内存(RAM)中的工作方式。Java内存模型(Java Memory Model,简称JMM)定义了Java虚拟机在计算机内存中的工作方式,主要关注内存一致性和可见性两个问题。 1. Java内存模型(JMM) Java内存模型是共享内存的并发模型,线程之间主要通过读-写共享变量(堆内存中的实例域、静态域和数组元素)来完成隐式通信。JMM控制Java线程之间的通信,决定一个线程对共享变量的写入何时对另一个线程可见。 2. 同步机制 为了解决内存一致性和可见性问题,JMM提供了以下同步机制: * 原子性:对于一些基本数据类型,如int、long等,JMM提供了原子操作,保证这些操作在多线程环境下是原子性的,即不会被其他线程干扰。 * 互斥性:使用synchronized关键字或ReentrantLock等同步机制,将代码块或方法声明为互斥的,保证同一时间只有一个线程能够访问该代码块或方法,从而避免多个线程同时修改共享变量的问题。 * 可见性:使用volatile关键字或synchronized关键字等同步机制,保证一个线程修改了共享变量的值后,其他线程能够立即看到该修改。 3. 主内存和工作内存 JMM定义了主内存和工作内存的概念。所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。工作内存是JMM的一个抽象概念,也叫本地内存,其存储了该线程以读/写共享变量的副本。 4. Java内存划分 Java内存划分主要分为以下几个部分: * 栈区(stack segment):由编译器自动分配释放,存放函数的参数值、局部变量的值等。 * 堆区(heap segment):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。堆区是动态分配的内存区域,用于存放由new创建的对象和数组。 * 静态区(data segment):存放全局变量、静态变量和字符串常量,不释放。 * 代码区(code segment):存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。 5.Java虚拟机内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间。主要包括: * 程序计数器(Program Counter Register):线程私有,可以看做是当前线程所执行的字节码的行号指示器。 * Java虚拟机栈(Java Virtual Machine Stacks):线程私有,为虚拟机执行java方法服务。每一个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 * Java堆(Java Heap):线程共享,是java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 * 方法区(Method Area):线程共享,用于存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 * 运行时常量池(Runtime Constant Pool):线程共享,是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。 * 直接内存(Direct Memory):不是虚拟机运行时数据区域的一部分,也不是Java虚拟机规范中定义的内存区域。但这部分也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。
- 粉丝: 1w+
- 资源: 105
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JavaWeb实践goods表的查询
- mmexport1731978754683.jpg
- Bifrost - 面向生产环境的 mysql,MariaDB,kafka 同步到Redis,MongoDB,ClickH
- openssh9.8 for rhel8 centos8 rokey8 rpms
- FATP FA 01;FATP FA 01
- openssh9.8 for rhel7 centos7 rpms
- 通用的C++数据结构代码实现,使用模板 代码完整,注释齐全,可直接运行,可使用doxygen生成网页和PDF文档,跨Window
- MySQL联合查询:使用JOIN连接多个表的指南
- Linux环境下Apache Tomcat的详细部署
- keil5生成自己的lib库具体方法