运行时数据区
- Java虚拟机在执行Java程序的过程中,会把所有它管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途。
备注:有些人也会称为Java虚拟机内存模型,但无法考证。要注意的是,Java虚拟机内存模型跟Java内存模型有所不同。

一、运行时数据区概括图

二、运行时数据区各个模块介绍
- 方法区:属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码的等数据。可以理解为已经编译好的代码储存区。
- 堆:这块区域是JVM所管理的内存中最大的一块区域,线程共享,主要存放对象实例和数组。
- 虚拟机栈:线程私有,生命周期和线程一致。主要存储基本数据类型,以及对象的引用。
- 本地方法栈:区别于Java虚拟机栈的是,java虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
- 程序计数器:内存中间小,线程私有。它可以看做是当前线程所执行的字节码的行号指示器。也就是说,线程主要是执行任务,而执行到哪里,需要使用程序计数器来记录。
备注:
(1)创建线程对哪块JVM内存区域有影响?
方法区跟堆是线程共享数据区域,创建线程不会对其产生太多影响。但虚拟机栈、本地方法栈、程序计数器是线程私有的,每个线程里的数据是不一样的,而且都需要虚拟机栈、本地方法栈、程序计数器,因此每创建一个线程都要为该线程创建虚拟机栈、本地方法栈、程序计数器。也就是说创建线程对JVM内存区域中的虚拟、本地方法栈、程序计数器有影响。
(2)Object obj = new Object();发生了什么?
代码左边的Object obj等于在虚拟机栈的本地变量表中创建一个变量,是一个引用类型。
代码右边的new Object()等于在堆中给他创建一个对象(分配内存)变量,存储了Object类型的所有实例数据值。
代码中间的 = 符号则是将new Object对象的内容可通过虚拟机栈中obj进行访问。
在java中都是通过引用来操纵对象的。
更多java基础总结(适合于java基础学习、java面试常规题):
总结篇(9)---字符串及基本类 (1)字符串及基本类之基本数据类型
总结篇(10)---字符串及基本类 (2)字符串及基本类之java中公共方法及操作
总结篇(12)---字符串及基本类 (4)Integer对象
总结篇(14)---JVM(java虚拟机) (1)JVM虚拟机概括
总结篇(15)---JVM(java虚拟机) (2)类加载器
总结篇(16)---JVM(java虚拟机) (3)运行时数据区
总结篇(17)---JVM(java虚拟机) (4)垃圾回收
总结篇(18)---JVM(java虚拟机) (5)垃圾回收算法
总结篇(19)---JVM(java虚拟机) (6)JVM调优
总结篇(24)---Java线程及其相关(2)多线程及其问题
总结篇(25)---Java线程及其相关(3)线程池及其问题
总结篇(26)---Java线程及其相关(4)ThreadLocal
总结篇(27)---Java并发及锁(1)Synchronized
总结篇(31)---JUC工具类(1)CountDownLatch
本文详细介绍了Java虚拟机(JVM)的运行时数据区,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器的功能与作用。同时,通过示例解释了创建线程和对象对JVM内存的影响。

被折叠的 条评论
为什么被折叠?



