首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏一直在努力的Java菜鸡er

    JVM运行时数据-方法

    JVM运行时数据-方法 方法和Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、域信息、方法信息、常量、静态变量、即时编译器编译后的代码等数据。 很多人都更愿意把方法称为“永久代”(Permanent Generation)。 方法主要存放Class,堆主要存放实例化的对象。 在JDK1.8中,永久代已经不存在,存储类型信息、域信息、方法信息、运行时常量池都已经从永久代搬迁到了元空间。 方法同堆一样,也是线程共享的内存区域。 方法与堆一样随JVM虚拟机启动被创建,以处于物理上不连续的内存空间,只需逻辑上连续即可。 局部变量表的大小以及异常表在方法中。

    56910编辑于 2022-09-08
  • 来自专栏用户4480853的专栏

    运行时数据

    运行时数据 官方解读 Chapter 2.  方法拥有以下特点: 方法是各个线程共享的内存区域,在虚拟机启动时创建 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器变异后的代码等数据 对染 Java 虚拟机规范把方法描述为堆的一个逻辑部分 JDK6 和 7 中式 Perm Space 运行时常量池属于方法的一部分在方法中进行分配 方法是线程安全的。 由于所有的线程都共享方法,所以,方法区里的数据访问必须被设计成线程安全的。 例如,同时有两个线程都访问方法中的同一个类,而这个类还没有被装入 JVM ,那么只允许一个线程去装载它,而其它线程会被阻塞 运行时常量池 A run-time constant pool is a

    42820编辑于 2023-01-13
  • 来自专栏Lixj's Blog

    JVM运行时数据

    了解一下JVM运行时数据 image.png 1).程序计数器 程序计数器是一块较小的内存空间,可以看做是字节码解释器的行号指示器。 运行时常量池是方法的一部分。 JDK1.7及之后版本的 JVM 已经将运行时常量池从方法中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。 推荐阅读:《Java 中几种常量池的区分》: https://blog.csdn.net/qq_26222859/article/details/73135660 7).直接内存 直接内存并不是虚拟机运行时数据的一部分 E7%AF%87%E6%96%87%E7%AB%A0.md Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/jvm运行时数据

    36720编辑于 2022-06-10
  • 来自专栏龙首琴剑庐

    JVM运行时数据

    所有线程共享的数据 线程共享区域随虚拟机JVM的启动/关闭而创建/销毁。 Heap(堆): 我们常说用于存放对象的区域,1.7之后字符串常量池移到这里。 Method Area(方法): 存储已被虚拟机加载的类信息、静态变量、编译后代码等数据。并使用永久代来实现方法,1.8后被元空间替代,元空间并不在虚拟机中,而是使用本地内存。 每个线程私有的数据 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁。 延伸 Class对象 Class对象是存放在堆的,不是方法。 Class对象是加载的最终产品,类的元数据, 包括类的方法代码,变量名,方法名,访问权限,返回值等等才是存在方法的。 也就是字符串常量池从运行时常量池分离出来了。 ?

    89430发布于 2020-04-24
  • 来自专栏董亮亮的开发笔记

    JVM - 运行时数据

    事实上在JVM中是用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据),也就是我们常说的JVM内存。 一、运行时数据区域包括哪些 ? 根据《Java虚拟机规范》的规定,运行时数据通常包括这几个部分: 程序计数器(Program Counter Register):线程私有的,记录当前线程的行号指示器,为线程的切换提供保障; Java 方法理论上来说是堆的逻辑组成部分;运行时常量池是方法的一部分,用于存放编译期生成的各种字面量和符号引用; 堆(Heap):所有线程共享的,主要用来存储对象。 这些都在常量池的 UTF-8 表中(逻辑上的划分); 运行时常量池 运行时常量池是方法的一部分,是一块内存区域。Class 文件常量池将在类加载后进入方法运行时常量池中存放。

    50420发布于 2020-06-15
  • 来自专栏爱生活爱编程

    JVM运行时数据

    下图是显示JVM在运行时数据。 ? 每个线程的数据 从图中可以看出,每个Thread(线程)都有program counter register(程序计数器),JVM Stack(JVM栈),和Native Method Stack(本地方法栈 这三个区域都是基于每一个线程的,这些数据在其所属的线程创建时初始化。 程序计数器:用来控制当前线程的执行。 JVM栈:存放Frame(栈帧)(如下图所示)。  所有的线程共享数据 所有的线程共享数据区有Heap和Method Area。 Heap(堆):是与我们平时编程最直接打交道的区域。它存放所有的数组和对象。在JVM启动时创建。 Method Area(方法):存储每一个类的结构,如运行时常量池,field(字段)和方法的数据;方法和构造方法的代码。 

    32020发布于 2021-01-14
  • 来自专栏阿伟的个人博客

    JVM运行时数据

    Java程序运行时JVM会把内存分为如下图所示的几个区域,其中包括线程所共享的堆、方法以及线程所独有的虚拟机栈、本地方法栈和程序计数器。 ? v2; } } 局部变量表以变量槽(variable slot)为最小单位,每个变量槽都能存放一个boolean、byte、char、short、int、float、reference类型的数据 32位数据类型所占栈容量为1,64位数据类型所占的栈容量为2。 当一个方法开始执行时,该方法的操作数栈为空,方法执行过程中会有各种字节码指令对操作数栈进行出栈、入栈处理。 五、方法 方法(Method Area)也是各个线程共享的内存区域,用于存储已经被虚拟机加载了的类信息,常量,静态变量等。 《Java虚拟机规范》中对方法的约束是非常宽松的,除了和Java堆一样不需要连续的内存和可以选择固定大小或可扩展外,甚至可以选择不实现垃圾回收。

    42610发布于 2020-08-05
  • 来自专栏技术博文

    JVM 运行时数据

    本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/109 不同虚拟机的运行时数据可能略微有所不同,但都会遵从 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的; Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存; 方法( Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据

    23730发布于 2021-09-10
  • 来自专栏allsmallpi博客

    Jvm运行时数据

    一:运行时数据   Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域。 (在JDK1.7发布的HotSpot中,已经把字符串常量池移除方法了。) 6.常量池:   运行时常量池是方法的一部分。 运行时常量池有个重要特性是动态性,Java语言不要求常量一定只在编译期才能产生,也就是并非预置入class文件中常量池的内容才能进入方法运行时常量池,运行期间也有可能将新的常量放入池中,这种特性使用最多的是 既然运行时常量池是方法的一部分,自然受到方法区内存的限制。当常量池无法再申请到内存时会抛出outOfMemeryError异常。 2018.10.20 修改: 以上信息主要讲述的就是JVM运行时数据的内存划分情况,但是你有没有想过他们是如何创建的?如何布局的?如何访问的?现在我们就来带着这些问题往下继续深入。

    57620发布于 2021-02-25
  • 来自专栏技术小黑屋

    JVM运行时数据

    理解JVM运行时数据是Java编程中的进阶部分。 我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时数据的工作机制,那么前面的问题就会迎刃而解。 在这片文章中,我们将简单了解JVM中有哪些运行时数据以及这些数据的工作机制。 每个线程都私有这三个数据,这些数据在其所属的线程创建时初始化,并随着所属线程结束被销毁。 多个线程共享 属于这一种的数据包含 堆内存,方法运行时常量池。 The Structure of the Java Virtual Machine 注:本文介绍JVM运行时数据相对比较概括,以后会有更加详细的针对单个数据的介绍。

    56730发布于 2018-09-05
  • 来自专栏一直在努力的Java菜鸡er

    JVM运行时数据-堆

    JVM运行时数据-堆 核心概念: 可以处于物理上不连续的内存空间,只需逻辑上连续即可。 也就是堆内存是被线程共享的,但其中一小块区域TLAB(私有缓存)是线程私有的,我在后面详细学习哈。 在JVM启动的时候被创建,其大小也就被确定了。 堆的构成: JDK1.8之前新生代-老年代 新生代又分为:Eden和Survivor Survivor区分为:Survivor From和Survivor TO(或者s0、s1) 频繁的对象创建和回收

    23820编辑于 2022-09-08
  • 来自专栏云霄雨霁

    JVM--运行时数据

    运行时数据 Java虚拟机在执行Java程序时,会把它所管理的内存划分为若干个数据区域,这些区域各有各的用途。 运行时数据区有五部分: 程序计数器 虚拟机栈 本地方法栈 方法 堆 1  程序计数器 特点: 线程私有 占用内存空间较小 程序计数器是一块较小的内存空间。 2  Java虚拟机栈 *Java数据最重要的就是堆和栈,这两个区域会详细介绍。 Java栈详细介绍 特点: 线程私有 描述的是Java方法执行的内存模型 关键知识点:栈帧 每个方法执行时会创建一个栈帧(栈帧是方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态链接、方法出口等信息 6  另外:直接内存 特点: 并不是Java运行时数据的一部分 直接内存并不是虚拟机运行时数据的一部分,Java虚拟机规范中也没有定义该区域。

    56920发布于 2019-03-12
  • 来自专栏JVM学习

    一、JVM运行时数据

    JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它并不等同于对象本身 这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,一个Solt长度是32,long和double会占用两个变量槽。 4、方法 方法(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。 5、运行时常量池 运行时常量池(Runtime Constant Pool)是方法的一部分。

    51350发布于 2020-09-08
  • 来自专栏余林丰

    JVM入门——运行时数据

    下面将围绕这张图对JVM的运行时数据做一个简单介绍。 ☆方法(Method Area)   对于JVM的方法,可能听得最多的是另外一个说法——永久代(Permanent Generation),呼应堆的新生代和老年代。 方法和堆的划分是JVM规范的定义,而不同虚拟机有不同实现,对于Hotspot虚拟机来说,将方法纳入GC管理范围,这样就不必单独管理方法的内存,所以就有了”永久代“这么一说。 方法和操作系统进程的正文段(Text Segment)的作用非常类似,它存储的是已被虚拟机加载的类信息、常量(从JDK7开始已经移至堆内存中)、静态变量等数据。 现设置JVM参数为”-XX:MaxPermSize=20M”(方法最大内存为20M)。

    72350发布于 2018-01-12
  • 来自专栏Java后端技术

    JVM 运行时数据详解

    一、运行时数据   Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域。      Java虚拟机所管理的内存将会包括以下几个运行时数据区域 ? 注:以上三个数据区属于各个线程单享的,每个线程创建时都会创建此三个数据。各个线程之间相互隔离,互不影响。 4.方法(Method Area) 方法是可供各条线程共享的运行时内存区域。 运行时常量池是方法的一部分。每一个运行时常量池都分配在JVM的方法中,在类和接口被加载到JVM后,对应的运行时常量池就被创建。 ) 在JVM中,堆是可供各条线程共享的运行时内存区域,也是供所有类实例和数据对象分配内存的区域。

    52230发布于 2018-08-09
  • 来自专栏软件测试架构师俱乐部

    JVM(一)运行时数据

    在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据),也就是我们常说的JVM内存。 | JAVA内存区域分布与概述 运行时数据包括 线程共享数据:方法、堆 线程隔离数据:虚拟机栈、本地方法栈、堆、程序计数器 根据《Java虚拟机规范》的规定,运行时数据通常包括这几个部分:程序计数器 在JVM规范中虽然规定了程序在执行期间运行时数据应该包括这几部分,但是至于具体如何实现并没有做出规定,不同的虚拟机厂商可以有不同的实现方式。 ? 在方法中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。 不过自从JDK7之后,Hotspot虚拟机便将运行时常量池从永久代移除了。 并非数据进入了方法就如永久代的名字一样"永久"存在了。这区域的内存回收目标主要是针对常量池的回收和对类型的卸载。

    64820发布于 2020-09-04
  • 来自专栏Java后端技术栈cwnait

    JVM系列——运行时数据

    运行时数据的介绍是: The Java Virtual Machine defines various run-time data areas that are used during execution 具体说一说一下每个区域: Method Area(方法) 方法是各个线程共享的内存区域,在虚拟机启动时创建。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 当方法无法满足内存分配需求时,将抛出OutOfMemoryError异常,也就所谓的OOM。 此时回看装载阶段中将这个字节流所代表的静态存储结构转化为方法运行时数据结构。 ,还有一项信息就是常量池,用于存放编译时期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法运行时常量池中存放。 此时回看装载阶段中,会在JVM堆中生成一个代表这个类的java.lang.Class对象,作为对方法中这些数据的访问入口。

    50750发布于 2020-04-18
  • 来自专栏技术碎碎念

    探究JVM——运行时数据

    Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示: ? 2.方法(Method Area)   用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。    相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法就如永久代的名字一样“永久”存在了。 3.运行时常量池(Runtime Constant Pool)   运行时常量池是方法的一部分。 除此之外,还有一部分内存区域: 直接内存(Direct Memory)   直接内存并不是虚拟机运行时数据的一部分,也不是Java虚拟机规范中定义的内存区域,字面上的意思,是本机的直接内存。

    79270发布于 2018-04-11
  • 来自专栏爬蜥的学习之旅

    jvm运行时数据表示

    image.png 方法的概念 根据JVM的规范,方法用来存储类的结构,比如运行时常量池,字段和方法数据,方法和构造函数的代码,以及类和实例初始化,接口初始化中使用的一些特殊方法。 规范把方法从逻辑上看做是属于堆的一部分,不同的实现可以选择是否要对这块代码做垃圾回收和压缩,但是虚拟机规范本身并不强制规定方法的位置(JDK 7 规范 JDK 8 规范 JDK 9 规范 JDK 10 如果这个堆是从广义上讲java heap的定义:哪儿存储了java对象,哪儿就是 java heap,那它就是在堆中 (java.lang.String的一些实例会存在这里) 如果堆指的是运行时数据中 表示类文件中每个类或者每个接口运行时的表示,它包括编译时已知的数字常量到必须在运行时解析的方法和字段引用 jdk8 对PermGen 的改进 hotspot中移除了PermGen,使用Metaspace ,可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize配置 permGen,“heap”,常量池之间的关系参考 栈帧 帧用来存储数据和部分结果,包括动态连接、方法返回值和打包异常

    55320发布于 2019-07-09
  • 来自专栏每天学Java

    Java底层-运行时数据

    前面的文章中,我们了解了Javac编译器、并模拟Javac命令实现了一个MyJavac命令,然后以HotSpot为例,了解了JVM的结构、类加载器以及类加载过程, 所以这一篇文章接着类加载子系统开始对运行时数据相关概念进行学习 在前面关于HotSpot组成中提到,运行时数据就类似一个工厂,是Java程序运行所在的内存区域,这个区域被JVM所管理,按照虚拟机规范的规定将其划分为:方法、堆、程序计数器,虚拟机栈、本地方法栈五个部分 元空间替代永久代作为方法的实现,虽然OOM的可能性降低,但方法仍然是GC回收的区域(一般都伴随着Full GC进行内存释放) 堆 在Java虚拟机运行时数据中,堆内存是各类区域中内存中最大的一块, 线程的程序计数器的作用很简单:存放执行指令,因为其存储数据仅仅就是下一个需要待执行的命令的地址,所以它是运行时数据中唯一一个不会发生OOM的地方, 那么程序计数器有什么意义呢? 而虚拟机栈实际上是栈的数据结构,它的操作只有压栈和出栈两种,每当我们执行一个方法的时候,就为这个方法创建对应的栈帧,并放到栈中(PUSH), 当方法执行完就出栈(POP),栈帧中存储了方法的局部变量表、

    80110发布于 2020-07-07
领券