首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏JVMGC

    JVM内存模型

    总览 [image-20201021222746282] JVM标准中的五个组成部分 方法区 堆 程序计数器 本地方法栈 虚拟机栈 JDK1.7的运行时数据区 [image-20201021224100216 之后字符串常量池被移动到堆区 JDK1.8的运行时数据区 [image-20201021224342226] jdk1.8去掉了永久代 引入了元数据区 Jdk1.7中的运行时常量池移动到元数据区 元数据区存在于直接内存中 为什么移除永久代 方法区大小难以设定,容易发生内存溢出。 促进HotSpot VM和JRockit VM融合,JRockit VM没有方法区 什么是元空间 元空间和永久代类似都是对JVM规范中方法区的实现。 区别在于元空间不在JVM虚拟机中,因此元空间的空间受本地内存制约。

    71500发布于 2020-12-02
  • 来自专栏JAVA基础知识

    JVM内存模型

    JVM内存可以分为程序计数器、虚拟机栈、本地方法栈、java堆,各区域的用途可由下图简单概括: 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,线程私有的 在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 虚拟机栈 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”。 直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError

    33211编辑于 2024-10-12
  • 来自专栏武培轩的专栏

    JVM内存模型

    运行时数据区域 Java虚拟机(Java Virtual Machine,简称JVM)在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 Java虚拟机栈(JVM Stacks) 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。 而在JDK1.8中, 永久区已经被彻底移除, 取而代之的是元数据区(Metaspace)(这一点在查看GC日志和使用jstat -gcutil查看GC情况时可以观察到),元空间的本质和永久代类似,都是对JVM

    1.2K52发布于 2018-04-18
  • 来自专栏java技术学习之道

    JVM初探 -JVM内存模型

    JVM 内存区域 JVM会将Java进程所管理的内存划分为若干不同的数据区域. 这些区域有各自的用途、创建/销毁时间: ? 一. Program Counter Register(程序计数器): 一块较小的内存空间, 作用是当前线程所执行字节码的行号指示器(类似于传统CPU模型中的PC), PC在每次指令执行后自增, 维护下一个将要执行指令的地址 在JVM模型中, 字节码解释器就是通过改变PC值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖PC完成(仅限于Java方法, Native方法该计数器值为undefined Java Stack(虚拟机栈) 虚拟机栈描述的是Java方法执行的内存模型: 每个方法被执行时会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息. 直接内存 直接内存并不是JVM运行时数据区的一部分, 但也会被频繁的使用: 在JDK 1.4引入的NIO提供了基于Channel与Buffer的IO方式, 它可以使用Native函数库直接分配堆外内存,

    1.1K40发布于 2018-07-02
  • 来自专栏大数据进阶

    jvm(1):jvm内存模型

    身为一个职业的Java程序员,每天打交到最多的就是jvm,那么套用孙子的一句话“知己知彼方能百战不殆”,熟悉jvm也就意味着是我们进阶路上必过之槛,下面先来张图,大概说明下jvm内存分布 ? 从图上可以看出Java内存主要分5个部分,下面会针对这5个部分分别进行说明 方法区:主要是保存的信息是类的元数据。方法区与堆空间类似,是被JVM中所有的线程共享的区域。 Java堆:堆在JVM规范里是一种通用性的内存池,用于存放所有的Java对象。堆是一个运行时数据区,类的对象从中分配空间,堆的优势是可以动态地分配内存大小,生存周期也不需要事先告诉编译器。 栈是一种快速有效的分配存储方法,访问速度仅次于寄存器,堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。 由于Java虚拟机需要预先去生成相应的内存空间,所以但我们尝试运行程序的时候,Java虚拟机必须知道被存储在栈内的所有数据的确切大小和生命周期,以便按照上面陈述的分配存储方法通过上下移动堆栈指针来动态调整内存空间

    1K30发布于 2019-09-17
  • 来自专栏振兴的Android修炼手册

    JVM内存模型

    前一段时间写过一篇关于 JVM虚拟机之类加载的过程 的文章,其中讲述了Java虚拟机对类的处理。 最近听了一次部门内部有关JVM的分享,自己也顺便回顾了之前阅读《深入理解JVM虚拟机》一书中所讲述的Java虚拟机对内存的管理,再次将自己理解的JVM内存模型分享给大家。 JVM内存模型 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 ? java-memory-model 程序计数器 当前线程所执行的字节码文件的行号指示器。 每个线程都有一个程序计数器 不会发生OOM Java虚拟机栈 虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接 StackOverflowError (单线程,栈帧太大,还是虚拟机栈容量太小) OutOfMemoryError (创建线程太多) 本地方法栈 同Java虚拟机栈类型,只不过是native方法执行的内存模型

    52530发布于 2020-05-29
  • 来自专栏TimeFriends

    JVM内存模型

    无论底层操作系统/硬件是大端还是小端,每个 JVM 都以大端顺序(高字节在前)存储和使用内存中的数据。 注意:有时,JVM 实现的行为与另一个不同,但通常是相同的。 为了避免磁盘 I/O,字节码由运行时数据区域之一中的类加载器加载到 JVM。这段代码一直保留在内存中,直到 JVM 停止或类加载器(加载它的)被销毁。 加载的代码然后由执行引擎**解释**和执行。 清理内存的策略取决于 JVM 的实现(例如,Oracle Hotspot 提供了多种算法)。 堆可以动态扩展或收缩,并且可以具有固定的最小和最大大小。 换句话说,当一个类、方法或字段被引用时,JVM 通过运行时常量池在内存中搜索实际地址。它还包含常量值,如字符串文字或常量原语。 关于JVM内存模型,你学废了么?

    1.2K40编辑于 2022-07-14
  • 来自专栏全栈程序员必看

    JVM内存模型

    # JVM JDK版本:1.8 # 1、JVM内存区域 JVM在执行应用程序的过程中会将它管理的内存分为若干个不同的区域。其中一部分是线程私有的,一部分是线程共享的。 Java内存区域也叫做运行时数据区。JVM内存内存结果如下图所示: ---- # 2、Java代码执行流程 Java源码文件通过Java编译器生成字节码文件。 ---- # 3、JVM的架构模型 Java编译器输入的指令流一种是基于栈的指令架构,另外一种指令集架构则是寄存器的指令集架构。 ---- # 5、JVM内存架构 方法区:存放常量信息,类信息,方法信息。 LV(Local Variables):局部变量表。 OS(Operand Stack):操作数栈。 JVM的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。

    40510编辑于 2022-09-01
  • 来自专栏java 成神之路

    JVM内存模型

    内存划分 java虚拟机按照运行时内存使用区域划分如图: Paste_Image.png 区域 是否线程共享 是否会内存溢出 程序计数器 否 不会 java虚拟机栈 否 会 本地方法栈 否 会 堆 是 ,减少内存的使用量来提高系统的并发量。 当堆中分配的对象实例过多,且大部分对象都在使用,就会报内存溢出异常(OutOfMemoneyError)。 六:直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError ,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。

    979100发布于 2018-05-18
  • 来自专栏程序猿~

    JVM内存模型

    内存模型分区 简介 线程持有 概述 程序计数器 线程私有 当前线程所执行的字节码的行号指示器 Java虚拟机栈 线程私有 方法执行的时候创建栈帧用于存储局部变量表、操作数栈、动态连接 (Native Memory) 从JDK1.7到1.8,方法区的实现由永久代变成了元空间,元空间的部分数据分配在本地内存中。 Java8内存模型—永久代(PermGen)和元空间(Metaspace) 特殊: 直接内存(Direct Memory) 也叫堆外内存,JDK1.4加入了NIO,涉及到堆外内存分配。 可以通过 -XX:MaxDirectMemorySize 参数来设置最大可用直接内存,如果启动时未设置则默认为最大堆内存大小,即与 -Xmx 相同。 即假如最大堆内存为1G,则默认直接内存也为1G,那么 JVM 最大需要的内存大小为2G多一些。当直接内存达到最大限制时就会触发GC,如果回收失败则会引起OutOfMemoryError。

    42320编辑于 2022-05-13
  • 来自专栏落叶飞翔的蜗牛

    JVM内存模型

    虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。 堆的大小可以通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,默认大小学为操作系统物理内存的1/64但小于1G,-Xmx为JVM可申请的最大内存,默认大小为物理内存的 1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空余堆内存大于70%时,JVM会减小heap 6.总结 名称 特征 作用 配置参数 异常 程序计数器 占用内存小,线程私有,生命周期与线程相同 大致为字节码行号指示器 无 无 虚拟机栈 线程私有,生命周期与线程相同,使用连续的内存空间 Java 方法执行的内存模型 10.内存分配过程 1、JVM 会试图为相关Java对象在Eden Space中初始化一块内存区域。 2、当Eden空间足够时,内存申请结束;否则到下一步。

    77440发布于 2021-01-14
  • 来自专栏Java开发

    JVM内存模型

    一:什么是JVM   JVM又称为虚拟机,是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。 ------------来自 百度百科  二:JVM内存结构 内存结构是JVM中比较重要的存储结构,是硬盘和cpu之间的桥梁,JVM内存结构规定了程序在运行过程中的内存的申请,分配,管理等一系列策略 因为本人的JDK为1.8版本,因此我去百度了一下Java8的内存结构图,如下:  在Java8的内存结构图中,我们可以看出JVM内存主要由 堆,栈,程序计数器,方法区(元空间)等基本结构构成! JVM内存模型的设计可以提供内存管理和线程安全的机制,同时也保证了Java程序的跨平台性。不同的内存区域有不同的作用和访问规则,合理地管理和利用这些内存区域可以提高Java程序的性能和稳定性。 最后附上Java1.7的内存模型图供大家参考学习

    25510编辑于 2024-10-21
  • 来自专栏码字搬砖

    JVM内存模型

    先磨磨肩擦擦掌,小二很早就听说jvm内存很是奇特,今日一看果然不同凡响。下面且听小二一一道来。 一、.jvm可以看做是对操作系统的模拟,看过《操作系统》或者《深入理解操作系统》这本书的人都知道(虽然我没有看完),操作系统博大精深,jvm想要很好的模拟出操作系统实属不易 二、一次编译到处运行,虽然现在看来很普通 当时的设计者既然都考虑到让jvm仅仅作为一个平台,支持更多的语言。我觉得这在我们开发程序时是很有借鉴意义的,解耦性、扩展性 好了,下面上干货! 三、.jvm内存模型 ? 1.程序计数器PC 线程私有 跟操作系统的PC寄存器有点像,不过jvm中的PC是软件模拟的,并且功能远远比操作系统的PC(硬件)强大的多。像分支、循环、跳转等都需要依赖这个计数器来完成。 2.JVM内存模型之java虚拟机栈 3.JVM内存模型之方法区 4.JVM内存模型之堆 5.JVM内存模型之直接内存 6.JVM内存模型之运行时常量池

    76250发布于 2018-10-24
  • 来自专栏零卡

    JVM内存模型

    jvm组成.jpg 0x01:程序计数器(Program Counter Register) 程序计数器(Program Counter Register)是一块较小的内存空间,是当前线程所执行的字节码的行号指示器 在虚拟机概念模型里(概念模型,各种虚拟机可能会通过一些更高效的方式实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令:分支、跳转、循环、异常处理、线程恢复等基础操作都会依赖这个计数器来完成 所以它是一个“线程私有”的内存区域。此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。 0x02:虚拟机栈(VM Stack) JVM栈是线程私有的内存区域。 它描述的是java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

    44450编辑于 2022-04-03
  • 来自专栏Linyb极客之路

    jvm内存模型

    JVM定义了若干个程序执行期间使用的数据区域。这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁。而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁。 JVM大体分为底下几个模块 1、类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间。 3、Java堆:再java虚拟机启动的时候建立Java堆,它是java程序最主要的内存工作区域,几乎所有的对象实例都存放到Java堆中,堆空间是所有线程共享的。 4、直接内存:Java的NIO库允许Java程序使用直接内存,从而提高性能,通常直接内存速度会优于Java堆。读写频繁的场合可能会考虑使用。

    89890发布于 2018-03-27
  • 来自专栏java一日一条

    JVM初探 -JVM内存模型

    虽然java不需要开发人员显示的分配和回收内存,这对开发人员确实降低了不少编程难度,但也可能带来一些副作用: 1. 有可能不知不觉浪费了很多内存 2. JVM花费过多时间来进行内存回收 3. 二、JVM内存空间管理 根据JVM规范,JVM内存划分了如下几个区域: 1. 方法区 2. 堆区 3. 本地方法栈 4. 虚拟机栈 5. 在JVM所管理的内存中,堆区是最大的一块,堆区也是JavaGC机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建。 对于堆区大小,可以通过参数-Xms和-Xmx来控制,-Xms为JVM启动时申请的最新heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于 三、JVM内存分配 Java对象所占用的内存主要在堆上实现,因为堆是线程共享的,因此在堆上分配内存时需要进行加锁,这就导致了创建对象的开销比较大。

    1.2K20发布于 2018-09-14
  • 来自专栏程序员云帆哥

    JVM】剖析JVM内存模型

      JVM在执行java程序时的过程中会把它所管理的内存划分为若干个不同的数据区域。 1、方法区(元数据空间)   方法区与Java堆一样,是各个线程共享的内存区域。方法区是jvm的元数据区域,类比成为一张表,一个class文件的信息都是表的一条数据存储在内存中。 对象头 对象实例数据 对齐填充 3、Java虚拟机栈   Java虚拟机栈也是线程私有的,它描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接 当常量池无法在申请到内存时将抛出OutOfMenoryError错误。 6、直接内存   直接内存并不是JVM虚拟机运行时数据区的一部分,也不是JVM虚拟机规范中定义的内存区域。 此区域是JVM规范中没有规定任何OutOfMenoryError的区域。

    89830编辑于 2022-05-12
  • 来自专栏全栈程序员必看

    Jmm内存模型_java jvm内存模型

    目录 一、JMM内存模型产生的背景? 二、什么是JMM内存模型? 三、JMM内存模型用来解决什么问题? 四、JMM内存模型JVM内存模型有什么关系? ---- 一、JMM内存模型产生的背景? JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问 6)对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作) 四、JMM内存模型JVM内存模型有什么关系? 2、JVM是运行时内存模型JVM内部使用java内存模型内存氛围线程栈和堆,Java 虚拟机中运行的每个线程都有自己的线程堆栈。线程堆栈包含有关线程调用哪些方法以到达当前执行点的信息。 3、JMM内存模型JVM运行时内存模型的关系 Java运行时内存模型和计算机物理内存结构是不一样的。计算机物理内存结构并不区分栈和堆。在物理内存结构中,栈和堆都位于主存中。

    68010编辑于 2022-10-02
  • 来自专栏程序员备忘录

    JVM内存模型浅析

    看见别人就想抱大腿,最后运维说他不懂java,最后怀着紧绷的心态查阅日志,最后在tomcat的启动脚本中发现有人将java虚拟机的堆内存设为1024M,而引发OOM的原因是获取公司员工信息的大JSON, 因为机器上部署的应用很多,内存较多。当时设置堆大小为4G,至今该项目再没出现过类似的问题。 然而最近云服务版本,却出现了OOM现象。目前累计出现两次。 其实jvm调优有很多参数,包括垃圾回收算法和一些上限条件。这块作者还没有做深入的学习。虽然还没读过JVM调优的书籍,但是这块肯定是相当重要的。 这里对JVM内存结构进行简单的说明。 1.堆 我们知道java创建对象是保存在堆上的,堆是线程共享的。也就是多线程问题的根源,而我们在内存调优的时候设置的年轻代和老年代就是堆的划分。

    32420编辑于 2022-08-11
  • 来自专栏洁癖是一只狗

    JVM内存模型详解

    在Java中,JVM内存模型主要分为堆,方法区,程序计数器,虚拟机栈,本地方法栈,如下图 ? 今天我们就分别讲解一下这几个区域的作用 堆 堆是JVM内存中最大的一块内存,该内存是被多有线程共享,几乎所有的对象和数组都在堆上分配,堆被划分为新生代和老年代,新生代又分为Eden和Survivor区, HotSpot虚拟机使用永久代实现方法区,但是在其他虚拟机中,例如Oracle的JRockit,IBM的J9就不存在永久代的说法,可以说,HotSpot虚拟机中,设计人员使用永久代实现JVM内存模型的方法区 (final修饰的变量) 符号应用则包括类和方法的权限定名,字段的名称和描述以及方法的名称和描述符 同时类加载到内存之后,JVM将class文件的常量池放到了运行时常量池,在解析阶段,JVM会把符号引用替换为直接引用 JVM的非堆内存中,但是在java8版本,使用元空间替代了永久代,除了静态变量和运行时常量还放在堆中,其余在方法区的信息都迁移到了元空间,而元空间是本地内存.

    62620发布于 2021-01-18
领券