
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了程序员在学习Java编程开发语言的时候需要掌握的一些基础知识等内容,而本文我们就继续来学习一下,Java内存模型应用方法分享。
Java内存模型(JavaMemoryModelJMM)指的是JavaHotSpot(TM)VM虚拟机定义的一种统一的内存模型,将底层硬件以及操作系统的内存访问差异进行封装,使得Java程序在不同硬件以及操作系统上执行都能达到相同的并发效果。
Java内存模型对于内存的描述主要体现在三个方面:
描述程序各个变量之间关系,主要包括实例域,静态域,数据元素等。
描述了在计算机系统中将变量存储到内存以及从内存中获取变量的底层细节,主要包括针对某个线程对于共享变量的进行操作时,如何通知其他线程(涉及线程间如何通信)
描述了多个线程对于主存中的共享资源的安全访问问题。
一般来说,Java内存模型在对内存的描述上,我们可以依据是编译时分配还是运行时分配,是静态分配还是动态分配,是堆上分配还是栈上分配等角度来进行对比分析。
从JavaHotSpot(TM)VM虚拟机的整体结构上来看,内存区域可以分为线程私有区,线程共享区,直接内存等内容,其中:
线程私有区(ThreadLocal):主要包括程序计数器、虚拟机栈、本地方法区,其中线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁。
线程共享区(ThreadShared):主要包括JAVA堆、方法区,其中,线程共享区域随虚拟机的启动/关闭而创建/销毁。
直接内存(DriectMemory):不会受JavaHotSpot(TM)VM虚拟机中的GC影响,并不是JVM运行时数据区的成员。
根据线程私有区中包含的数据(程序计数器、虚拟机栈、本地方法区)来具体分析看,其中:
程序计数器(ProgramCounterRegister):一块较小的内存空间,是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,而且是一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。
虚拟机栈(VMStack):是描述Java方法执行的内存模型,在方法执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
本地方法区(NativeMethodStack):和JavaStack作用类似,区别是虚拟机栈为执行Java方法服务,而本地方法栈则为Native方法服务。
根据线程共享区中包含的数据(JAVA堆、方法区)来具体分析看,其中:
JAVA堆(Heap):是被线程共享的一块内存区域,创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进行垃圾收集的重要的内存区域。
方法区(MethodArea):是指JavaHotSpot(TM)VM虚拟机把GC分代收集扩展至方法区,JavaHotSpot(TM)VM的垃圾收集器就可以像管理Java堆一样管理这部分内存,而不必为方法区开发专门的内存管理器,其中这里需要注意的是:
在JDK1.8之前,使用永久代(PermanentGeneration),用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据.,即使用Java堆的永久代来实现方法区,主要是因为永久带的内存回收的主要目标是针对常量池的回收和类型的卸载,其收益一般很小。
在JDK1.8之后,永久代已经被移除,被一个称为“元数据区(MetadataArea)”的区域所取代。元空间(MetadataSpace)的本质和永久代类似,大的区别在于:元空间并不在虚拟机中,而是使用本地内存。默认情况下,元空间的大小仅受本地内存限制。类的元数据放入NativeMemory,字符串池和类的静态变量放入Java堆中,这样可以加载多少类的元数据由系统的实际可用空间来控制。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。