课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言是目前大多数程序员都在学习和使用的一种编程开发语言,而本文我们就通过案例分析来简单了解一下,Java编程内存区域划分都有哪些类型。
从线程隔离角度,可以把这些内存区域分成两部分:线程私有的区域、以及线程共享的区域。顾名思义,线程私有区域的数据是各线程独享的,因此,存储在线程私有区域的数据不会有线程安全问题。线程共享区域的数据是要在不同线程间共享的,这部分数据才有可能引起线程安全问题。
程序计数器
程序计数器(ProgrameCounterRegister)是属于线程私有区域的数据区。
程序计数器数据区基本是程序员不需要关心的区域。
程序计数器是为了控制程序运行、用来记录需要执行的字节码的地址的,为了准确记录多线程环境下每一条线程的执行指令地址,程序计数器数据区必须是线程私有的区域。
方法区
方法区(MethodArea)是线程共享的数据区域。
方法区用来存储虚拟机加载的类信息,包括类的元数据、常量、静态变量等。
大家可以反过头来想想,为什么静态变量可以在类的不同实体对象之间共享?也正因为如此,静态变量使用不当的话也很容易引起线程安全问题。
另外,Strings=newString(“12345”),那么s是否会存储在方法区?s.intern()呢?
本地方法栈
本地房发展(NativeMethodStack)属于线程私有的数据区。
本地方法栈是为JAVA使用到的本地(Native)方法服务的,由于《JAVA虚拟机规范》没有对本地方法栈做硬性规定,所以,有些虚拟机比如HotSpot把本地方法栈和虚拟机栈合二为一了。
虚拟机栈
虚拟机栈(VMStack)是线程私有的数据区。
虚拟机栈和堆是程序员打交道多的数据区,也是程序员需要关心的内容。
JAVA虚拟机栈用于存储局部变量,比如java方法内定义的变量、方法返回等。每一个JAVA方法执行的时候,JAVA虚拟机都会同步创建一个栈帧(StackFrame),JAVA方法的执行过程对应着局部变量的进栈出栈过程。
JAVA栈保存的是JAVA基本类型或对象引用(refrence),保存在虚拟机栈的局部变量表中,以变量槽(slot)来表示。
堆
堆(JAVAHeap)是线程共享的数据区。
JAVA堆是存放JAVA对象的内存区域,几乎所有的JAVA对象都存储在JAVA堆中。
JAVA堆也是JAVA垃圾回收器(GC)的主要工作对象,不同的垃圾回收器或者垃圾回收算法,会按照不同的方式划分JAVA堆,比如新生代、老年代、永久代...等等,不管怎么划分,这样的划分仅仅是为了垃圾回收服务的,并不是JAVA堆内存必须按照这样的方式进一步细致划分。
存储在线程共享的数据区中的数据,才有可能存在线程安全性问题。也就是说,方法区、堆内的数据,有可能存在系统安全性。但是方法区中存储的主要是类的元数据信息以及静态变量,从线程安全角度来看,应用需要重点关注的是静态变量。而内存堆中存储的是JAVA对象,在多线程高并发应用中,是引起线程安全问题的主要数据存储区域、因此,也是程序员应该关注的地方。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。