JAVA内存区域划分

根据《JAVA虚拟机规范》的规定,JAVA虚拟机在执行JAVA程序的过程中会把内存划分为不同的数据区域。不同类型的数据会存储在不同的区域,理解JAVA内存区域的工作细节对理解JAVA多线程、线程安全性有着重要意义。

注意,JAVA内存区域的划分与我们常说的java内存模型JMM(Java Memery Model)是两个互不交叉的维度的概念,两者没有任何关系。JMM主要是将主内存和工作内存的关系、数据从主内存区读取的工作内存、以及从工作内存写回到主内存区、以及不同线程的工作内存间数据同步的问题。

本文主要讨论内存区域的划分,不涉及JMM相关内容。

从线程隔离角度,可以把这些内存区域分成两部分:线程私有的区域、以及线程共享的区域。顾名思义,线程私有区域的数据是各线程独享的,因此,存储在线程私有区域的数据不会有线程安全问题。线程共享区域的数据是要在不同线程间共享的,这部分数据才有可能引起线程安全问题。

程序计数器

程序计数器(Programe Counter Register)是属于线程私有区域的数据区。

程序计数器数据区基本是程序员最不需要关心的区域。

程序计数器是为了控制程序运行、用来记录需要执行的字节码的地址的,为了准确记录多线程环境下每一条线程的执行指令地址,程序计数器数据区必须是线程私有的区域。

方法区

方法区(Method Area)是线程共享的数据区域。

方法区用来存储虚拟机加载的类信息,包括类的元数据、常量、静态变量等。

大家可以反过头来想想,为什么静态变量可以在类的不同实体对象之间共享?也正因为如此,静态变量使用不当的话也很容易引起线程安全问题。

另外,String s=new String("12345"),那么s是否会存储在方法区?s.intern()呢?

本地方法栈

本地房发展(Native Method Stack)属于线程私有的数据区。

本地方法栈是为JAVA使用到的本地(Native)方法服务的,由于《JAVA虚拟机规范》没有对本地方法栈做硬性规定,所以,有些虚拟机比如HotSpot把本地方法栈和虚拟机栈合二为一了。

虚拟机栈

虚拟机栈(VM Stack)是线程私有的数据区。

虚拟机栈和堆是程序员打交道最多的数据区,也是程序员最需要关心的内容。

JAVA虚拟机栈用于存储局部变量,比如java方法内定义的变量、方法返回等。每一个JAVA方法执行的时候,JAVA虚拟机都会同步创建一个栈帧(Stack Frame),JAVA方法的执行过程对应着局部变量的进栈出栈过程。

JAVA栈保存的是JAVA基本类型或对象引用(refrence),保存在虚拟机栈的局部变量表中,以变量槽(slot)来表示。

堆(JAVA Heap)是线程共享的数据区。

JAVA堆是存放JAVA对象的内存区域,几乎所有的JAVA对象都存储在JAVA堆中。

JAVA堆也是JAVA垃圾回收器(GC)的主要工作对象,不同的垃圾回收器或者垃圾回收算法,会按照不同的方式划分JAVA堆,比如新生代、老年代、永久代...等等,不管怎么划分,这样的划分仅仅是为了垃圾回收服务的,并不是JAVA堆内存必须按照这样的方式进一步细致划分。

***存储在线程共享的数据区中的数据,才有可能存在线程安全性问题。***也就是说,方法区、堆内的数据,有可能存在系统安全性。但是方法区中存储的主要是类的元数据信息以及静态变量,从线程安全角度来看,应用需要重点关注的是静态变量。而内存堆中存储的是JAVA对象,在多线程高并发应用中,是引起线程安全问题的主要数据存储区域、因此,也是程序员最应该关注的地方。

相关推荐
孤廖20 分钟前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
我命由我1234522 分钟前
Android 对话框 - 对话框全屏显示(设置 Window 属性、使用自定义样式、继承 DialogFragment 实现、继承 Dialog 实现)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
驰羽28 分钟前
[GO]GORM中的Tag映射规则
开发语言·golang
Full Stack Developme32 分钟前
java.net 包详解
java·python·.net
非凡的世界1 小时前
深入理解 PHP 框架里的设计模式
开发语言·设计模式·php
小龙报1 小时前
《算法通关指南---C++编程篇(3)》
开发语言·c++·算法·visualstudio·学习方法·visual studio
一叶飘零_sweeeet1 小时前
深入 Spring 内核:解密 15 种设计模式的实战应用与底层实现
java·spring·设计模式
凤山老林1 小时前
排序算法:详解插入排序
java·开发语言·后端·算法·排序算法
彦楠1 小时前
IDEA实用快捷键
java·ide·intellij-idea
豆沙沙包?1 小时前
2025年--Lc197-077. 排序链表(链表,尾插法)--Java版
java·数据结构·链表