JVM 运行时数据区(二)

时间:2022-12-12 13:58:07

@

运行时数据区

JVM 运行时数据区主要分为5块

  • 方法区 JDK1.8以后叫做元数据区(Metaspace)
  • 堆区
  • 虚拟机栈区
  • 本地方法栈区
  • 程序计数器

方法区和堆都是线程共享的,在JVM启动时创建,在JVM停止时销毁,而Java虚拟机栈、本地方法栈、程序计数器是线程私有的,随线程的创建而创建,随线程的结束而死亡。

graph TB

subgraph 线程A
X((线程A))
C[虚拟机栈]
D[本地方法栈]
E[程序计数器]
end

subgraph 线程B
Y((线程B))
H[虚拟机栈]
I[本地方法栈]
J[程序计数器]
end

subgraph 线程共享区
K((线程共享))
A[方法区]
B[堆区]
end
X-->K
Y-->K

JDK1.7 -JVM运行时数据区

graph TB
subgraph 物理内存
subgraph JVM
subgraph 共享区
A[方法区]
B[堆区]
end
subgraph 隔离区
C[虚拟机栈区]
D[本地方法栈区]
E[程序计数器]
end
end
end

JDK1.8 -JVM运行时数据区

graph TB

subgraph 物理内存
subgraph JDK1.8 -JVM运行时数据区
B[堆区]
subgraph 非共享区域
C[虚拟机栈区]
D[本地方法栈区]
E[程序计数器]
end
end
A[元数据区]
end

共享区

在JVM运行时数据区中,方法区和堆区 是各个线程内共享的内存区域

堆区

堆区 主要是存储运行时创建的对象,以及运行时常量池对象等

方法区

方法区 主要存放类的信息,常量,静态变量,运行时常量池以及JIT编译后代码等,JDK1.7以后把常量池里面的对象存放到了堆中,方法区里面存放的时候其引用地址

隔离区

虚拟机栈

栈是一种数据结构,特点是FILO

每当启动一个新的线程后,java虚拟机都会为它分配一个java栈。java以栈帧为单位保存线程的运行状态。虚拟机只会对java栈执行2中操作,以栈帧我单位的入栈和出栈。

抛出的异常2种

  • OutOfMemoryError 表述虚拟机空间不足,没法申请到空间
  • *Error 线程请求的深度>大于虚拟机允许的深度

栈帧

栈帧部分组成:局部变量表,操作数栈,栈数据,动态链接,返回地址等。

graph TB
subgraph 虚拟机栈
subgraph 栈帧
A[局部变量表]
B[操作数栈]
X((栈帧))
C[动态链接]
D[方法出口]
end

subgraph 栈帧
E[局部变量表]
F[操作数栈]
Y((栈帧))
H[动态链接]
I[方法出口]
end
X-->Y
end

  • 局部变量用于保存函数的参数已经局部变量的引用,局部变量表中的变量只是在当前的函数中有效,当函数调用结束后,跟随着函数栈帧的销毁,局部变量表也会随之销毁。局部变量表在编译期间就确定了大小。局部变量表的存储单位是以Variable Slot 为最小的单位,每个变量槽都可以存储32位长度的内存空间。
  • 操作数栈 主要用于保存计算过程中间结果,同时作为计算过程中变量临时存储。只支持出栈入栈的操作
  • 动态链接 每个栈帧都包含一个指向运行时常量池中该栈帧的所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接,在类的加载阶段中的解析过程会将符号引用转化为直接引用,这种转化也称为静态解析。另外一部分将在运行时转化为直接引用,这个部分称之为动态链接
  • 方法执行后 只有2中退出方法,一是方法返回指令,二是异常退出。

本地方法栈

这个个虚拟机栈一样,只不过这个是运行本地方法的内存模型。运行本地方法的时候也会去创建栈帧等一些列操作

程序计数器

程序计数器是一块较小的内存空间,维护着当先线程所执行的字节码行号,以便在CPU切换调度的时候能知道当先线程执行到了什么位置。如果当先线程正在执行本地方法(Native method)那么程序计数器是为空。

程序计算器主要有2个作用:

  • 字节码的解释器可以通过修改程序计数器值来读取下一个指令,从而达到代码的流程控制,比如我们代码中创建的循环,异常处理等
  • 在多线程的情况下,程序计数器是用来保持当前线程执行的位置,当CPU切换执行时间片,切换回来的时候任然能继续执行上次执行的位置
  • 程序计数器 是唯一一个不会出现OOM的区域

JVM 运行时数据区(二)的更多相关文章

  1. JVM运行时数据区(二)

    4.本地方法栈 本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务. 与Java虚拟机栈一样本地 ...

  2. Jvm运行时数据区

    一:运行时数据区 Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域.这些区域有着各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户 ...

  3. JVM运行时数据区和垃圾回收机制

    最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...

  4. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

  5. JVM 运行时数据区 (三)

    JVM运行时数据区 运行时数据区由 程序计数器.java虚拟机栈.本地方法栈.堆.方法区 组成: 1.程序计数器 每一个Java线程都有一个程序计数器,用于保存程序执行到当前方法的哪一个指令,它是线程 ...

  6. JVM总结(一):概述--JVM运行时数据区

    大三下,趁着寒假重温一遍JVM,准备在一个系列来总价一下学习JVM的整个过程.争取在接下来的一个星期内更新完这一个系列,然后回家过年. JVM运行时数据区 线程私有的数据区 程序计数器 虚拟机栈 本地 ...

  7. JVM运行时数据区与JVM堆内存模型小结

    前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...

  8. Jvm运行时数据区 —— Java虚拟机结构小记

    关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...

  9. Java中的字符串常量池和JVM运行时数据区的相关概念

    什么是字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池 工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量 ...

随机推荐

  1. 开启MSDTC

    DOS方式以运行中输入cmd 然后输入下面命令: 停止MSDTC: net stop msdtc 开启MSDTC: net start msdtc 卸载MSDTC: msdtc -uninstall ...

  2. 获取某月第一天,最后一天的sql server脚本

    本文来自:http://blog.csdn.net/chaoowang/article/details/9167969 这是计算一个月第一天的SQL 脚本:   SELECT DATEADD(mm, ...

  3. Nginx简单配置,部分来源于网络

    nginx.conf listener监听端口 server_name监听域名 location{}是用来为匹配的 URI 进行配置,URI 即语法中的“/uri/”.location  / { }匹 ...

  4. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  5. Codeforces&period;1082E&period;Increasing Frequency&lpar;思路&rpar;

    题目链接 \(Description\) 给定\(n\)个数.你可以选择一段区间将它们都加上或减去任意一个数.求最终序列中最多能有多少个数等于给定的\(C\). \(n\leq5\times10^5\ ...

  6. Bulma - 基于 Flexbox 的现代化的 CSS 框架

    Bulma 是一个基于 Flexbox 的现代化的 CSS 框架,设计的初衷就是移动优先(Mobile First),模块化设计,可以轻松用来实现各种简单或者复制的内容布局,浏览器支持:浏览器支持:C ...

  7. &lt&semi;a&gt&semi;标签中的href如何调用js代码

    在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动链接 ...

  8. RowFilter遇上特殊字符&ast;&percnt;&&num;39&semi;&lbrack;&rsqb;&bsol;

    开发时,时不时需要分析DataView的数据.计算,过滤等 .但是处理的值有可能会遇上是带有特殊字符*.%.'.[.]和\ .需要手动在表达式中,处理这些特殊字符,需要再使用"[" ...

  9. 动态时间规整DTW

    动态时间规整DTW 1 概述 动态时间规整是一个计算时间序列之间距离的算法,是为了解决语音识别领域中语速不同的情况下如何计算距离相似度的问题. 相对于用经典的欧式距离来计算相似度而言,DTW在数据点个 ...

  10. 不使用flash实现复制文字&lpar;图片&rpar;到剪贴板

    <div>这里是待复制的文字或图片</div> var range = document.createRange(); var referenceNode = document ...