Java内存区域

JVM架构图


(2)运行时数据区(我们核心关注这里的栈、堆、方法区)【这里面所存放的是类加载加载后的一些数据】

(3)执行引擎---是从内存中(可以任务是运行时数据区)获取相关数据来执行,执行后在把数据返还到内存中

         1.解释器 :运行字节码文件

         2. 编译器:把字节码文件(.class文件)编译成根据当前操作系统能够执行的文件,他决定跨平台

         3. 垃圾回收器:会把内存中产生的垃圾数据进行回收清理,进行释放内存,清空时会根据jvm中垃圾回收算法进行回收,且自动进行回收,我们主要调优就是调这里,通过合适的算法进行对jvm的优化处理,避免出现卡顿,内存溢出等情况,尽可能的高效运行

         4.JIN:(java本地接口)—怎么调用C语言的这些代码

         5.本地方法库:本地方法栈为虚拟机使用到的 native 方法服务



类加载子系统

        类加载器子系统---执行.class编译后的文件,载入到jvm的体系中,然后进行初始化的操作,把相关的数据放到内存中的某些区域,做具体的内存分配的操作。


运行时数据区

  概述:


运行时数据区概述

详细分析:

程序计数器(pc register):

        PC计数器是一块较小的空间,它可以看做是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基本功能都需要依赖这个计数器来完成。

        java虚拟机采用的是线程轮流切换、分配处理执行时间的方式来实现多线程的运行,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能够恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计时器互不影响,为线程私有。

        如果线程执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果是一个本地方法,这个计数器值应该为空(undefined)

Java虚拟机栈:

        和pc计数器一样,栈也是线程私有的,它的生命周期和线程相同。每个方法执行时,虚拟机会同时创建一个栈帧用于存储局部变量表、操作数栈,动态链接、方法出口等信息。

        

栈帧内存结构模型

局部变量表

        局部变量表是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量表。在文件被编译时,方法的code属性中的max_locals数据项就确定了该方法所需分配的局部变量表的最大容量。

        局部变量表的容量以变量槽(Variable Slot)为最小单位,其中boolean、byte、char、short、int、float、reference或者return Address类型的数据,这8中占一个Slot。而double、long则采用两个Slot。

        当一个方法被调用时,Java虚拟机会使用局部变量表来完成参数值到参数变量列表的传递过程,即实参到形参的传递。如果执行的方法是实例方法(没有被static修饰的方法),那么局部变量中第0位索引的变量槽默认是用于传递所属方法所属对象实例的引用,可以通过关键字“this”来访问这个隐含的参数。其余参数则按照参数表顺序排列,占用从1开始的变量槽。

操作数栈:

        操作数栈主要用于保存计算过程的中间过程,同时作为计算过程中变量临时的存储空间。         操作数栈中元素的数据类型不许与字节码指令的序列严格匹配,如:在计算过程中不能出现一个long和一个float使用iadd命令相加的情况。

动态链接:

        1、每一个栈帧当中都包含以个指向运行时常量池重该栈帧所属方法的引用(invokedynamic指令)

        2、在java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里;比如:描述一个方法调用的另外的其它方法时,就是通过常量池中指向该方法的符号引用来表示,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。



Java堆:


堆结构图

        java世界里“几乎“”所有的对象实例都在这里分配内存。《java虚拟机规范》中的描述为:“所有的对象实例以及数组都应当在堆上分配”。堆也是垃圾收集器管理的内存区域,也可称为“GC堆”。

        根据《java虚拟机规范》中的规定,java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。

方法区:

        方法区和堆一样,是各个线程所共享的内存区域,它用于存储:①被虚拟机加载的类型信息、②常量、③静态变量、④及时编译后的代码缓存。这个区域的内存回收的主要是针对常量池的回收和对类型的卸载。

Hotspot方法区的变化


方法区内存模型图

静态常量池和运行时常量池

1)所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。

2)而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。


使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址?

        因为cpu需要不停的切换各个线程,这个时候切换回来之后,就得直到接着从哪儿开始继续执行。

        JVM的字节码解释器就是通过改变PC寄存器的值来明确下一条指令应该执行什么样的字节码指令。


堆、栈、方法区的交互关系


栈、堆、方法区的交互图

对象的实例化和访问定位:

对象的实例化


对象的内存布局

对象的定位访问:


通过句柄访问对象


通过直接指针访问对象

句柄池中的句柄地址稳定,当对象的引用发生改变时,变化的只有句柄中的指针地址。

直接指针访问方式的速度很快,直接指向了对象的实例,节省了一次指针定位的时间开销。(Hotspot默认对象访问定位方式)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269