《2022年深入Java虚拟机Java内存模型探讨一宣贯 .pdf》由会员分享,可在线阅读,更多相关《2022年深入Java虚拟机Java内存模型探讨一宣贯 .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在上一篇探讨 String类型创建对象的注意事项时,笔者蜻蜓点水的提到了一点 Java内存模型 。关于这一点, 笔者发现弥漫在市场上的各类 Java 辅导书竟然没有一本能够深入浅出讲解Java 内存模型,只有在孙鑫老师的 Java 学习无难事视频教程中略有涉及。然而真正介绍此概念的书,是一本早已停版,在市场上几乎已经绝迹了的骨灰级宝典深入 Java 虚拟机(笔者认为堪与葵花宝典相媲美哈)。下图是 Java 虚拟机的结构框图,包括在规范中描述的主要子系统和内存区。每个Java 虚拟机都有一个类装载器子系统,它根据给定的全限定名来装入类型(类或接口),同样,每个Java 虚拟机都有一个执行引擎,它
2、负责执行那些包含在被装载类的方法中的指令。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页 - - - - - - - - - 当 Java 虚拟机运行一个程序时,它需要内存来存储许多东西,例如,字节码,从已装载的class 文件中得到的其他信息,程序创建的对象,传递给方法的参数, 返回值,局部变量,以及运算的中间结果等等,Java 虚拟机把这些东西组织到“ 运行时数据区 ” 中,以便于管理。每个 Java虚拟机实例都有一个方法区以及一个堆,它们是由该虚拟机实例中所
3、有线程共享的。当虚拟机装载一个class 文件时,他会从这个 class 文件包含的二进制数据(即字节码)中解析类型信息。然后,它把这些类型信息放到方法区中。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。如下图所示。当每一个新线程被创建时,它都将得到它自己的PC 寄存器 (又叫程序计数器),以及一个Java栈,如果线程正在执行一个Java 方法(非本地方法,本地方法这里不予讨论),那么PC 寄存器的值将总是指示下一条将被执行的指令, 而它的 Java 栈则总是存储该线程中Java方法调用的状态 包括它的 局部变量 ,被调用时 传进来的参数 ,它的名师资料总结 - - -精品资
4、料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 3 页 - - - - - - - - - 返回值 ,以及运算中的 中间结果 等等。Java 栈是由许多栈帧( stack frame)组成的,一个栈帧包含一个 Java 方法调用的状态。当线程调用一个Java 方法时,虚拟机压入一个新的栈帧到该线程的Java 栈中,当该方法返回时,这个栈帧从Java 栈中弹出并抛弃。注意: 我们常说的堆栈庸俗约定指的是Java 栈, 不要与堆搞混淆了哈。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -