JVM内存区域 数据区域 ?...此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError内存溢出情况的区域。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。...这区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收有时又确实是必要的。...,并更新列表上的记录,这种分配方式称为“空闲列表”; 并发创建对象(非线程安全) 方案1:对分配内存空间的动作进行同步处理--实际上JVM采用CAS配上失败重试的方式保证更新操作的原子性 方案
Java运行时内存区域 Java虚拟机在启动时会根据JVM参数向操作系统申请内存,并将申请到的内存划分为不同的区域。...这些区域的作用各不相同,有的区域在JVM启动时就已初始化并一直存在,有的区域则依赖于用户线程的启动和结束而建立和销毁。...JVM的内存区域包含以下几个运行时数据区(图摘自深入理解JAVA虚拟机第三版)。...Java虚拟机运行时数据区.png 方法区 方法区(Method Area)是共享的内存区域,它用于保存JVM加载过的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。...程序计数器 JVM的程序计数器和操作系统的计数器很类似,可以看作是当前线程所执行的字节码的行号指示器。程序计数器只占很小的一块空间,而且不会出现扩容的情况,是JVM里唯一不会OOM的内存区域。
博主:java_wxid 社区:幕后大佬 @TOC 本文的大概内容: JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 与Buffer 的 IO 方式, 它可以使用 Native函数库直接分配堆外内存...这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError 情况的区域。...堆(Heap-线程共享)-运行时数据区 线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为多个区域,这些区域各有自己的用途以及独特的创建和销毁时间,今天就来揭开这些不同的数据区域的神秘面纱 先来一张最经典的图: ?...栈 本地方法栈和虚拟机栈可以统称为栈,由于本地方法栈是jvm调用操作系统native方法所使用的栈且它们的作用是非常相似的,所以这里重点看一下虚拟机栈。...它描述的java方法执行的内存模型 为什么是Java方法执行的内存模型呢? 在虚拟机中,每一次方法调用都会创建栈帧,这个栈帧的生命周期就伴随着这个方法的执行周期。...关于堆的更多内容请持续关注博客更新 方法区 方法区同样是各个线程共享的内存区域,它主要存储已经被虚拟机加载的类信息 类信息 类的全限定名 父类的全限定名 直接实现接口的全限定名 类型标志 类的访问描述符...Class.forName获取的引用 方法表 非抽象类、非接口的类才会有,一个保存类中所有的方法的数组,数组中每个每个元素是对每个方法的直接引用 运行时常量池 当类和接口被加载到JVM
---- @TOC ---- 本文的大概内容: JVM内存区域 ---- JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 与Buffer 的 IO 方式, 它可以使用 Native函数库直接分配堆外内存...这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError 情况的区域。...堆(Heap-线程共享)-运行时数据区 线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。
故称该内存区域为“线程私有”的内存。 如果线程正在执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。...如果正在执行的是Native方法,这个计数器值为空(Undefined) 该内存区域是唯一一个在Java虚拟机中没有规定任何OutOfMemoryError情况的区域。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 几乎所有的对象实例都在这里分配内存。...这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说,这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是必要的 根据Java虚拟机规范的规定...直接内存(Direct Memory) 直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
二、运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK. 1.8 和之前的版本略有不同,下面会介绍到。 JDK 1.8之前: ?...2.4 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。...JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。 ?...•TLAB: 为每一个线程预先在Eden区分配一块儿内存,JVM在给线程中的对象分配内存时,首先在TLAB分配,当对象大于TLAB中的剩余内存或TLAB的内存已用尽时,再采用上述的CAS进行内存分配 ③...3.2 对象的内存布局 在 Hotspot 虚拟机中,对象在内存中的布局可以分为3块区域:对象头、实例数据和对齐填充。
B站搜索“乐哥聊编程“有本篇文章配套视频 https://www.bilibili.com/video/BV1rg411v7rw 面试题:直接内存会导致OOM么?...本地方法栈 本地方法栈和虚拟机方法栈作用类似,不过它是为执行native方法服务 堆 堆是被线程共享的一个内存区域,大部分对象都在堆上分配,少部分允许在栈上分配(通过逃逸分析)。...方法区 方法区也是一块内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。也包括运行时常量池。...jdk8以前主要通过永久代实现方法区 jdk8开始 通过元空间实现方法区 通过本地内存实现 直接内存 直接内存和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理...传统BIO 访问 直接内存访问
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢? ...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ? ...在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分? ...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。 5.方法区 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。
运行时数据区域 JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,都有着各自的用途以及创建和销毁时间。包括以下几个如图所示的运行时数据区域: ?...关于异常 此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。...常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),此分法比较粗糙,其流行只能说明大多数程序员最关注的,与对象内存分配关系最密切的内存区域是这两块。...关于异常 JVM规范规定: 1、Java堆可以处于物理上不连续的内存空间,只要逻辑上是连续的即可,就像我们磁盘一样。...存在于.class文件中的常量池,在运行期间被jvm装载,并且可以扩充。
,JVM也是一个虚拟化的操作系统,处理虚拟指令外,还需要虚拟化的内存,而这个虚拟化的内存就是JVM的内存区域。...学习JVM首先从内存结构开始。 JVM的内存区域 jvm内存区域图: ?...JVM 是Java虚拟机,类似一个操作系统,class就是指令,比如一个操作系统有8G的内存,其中3G为虚拟内存(运行时数据区)剩下的5G可以理解为JVM的直接内存,这个虚拟内存就是JVM的运行时数据区域...运行时数据区域 运行时数据区域:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 线程私有区域 虚拟机栈 本地方法栈 程序计数器 线程共享区 运行时常量池 方法区 堆...(直接引用) 堆 堆是JVM上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。
JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ?...在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分?...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。 5.方法区 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。
Java中虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为若干不同的数据区域。下面来介绍几个运行时数据区域。 ?...1.3.2 异常情况 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。...2.2.2 操作数栈 操作数栈中存放方法执行时的一些中间变量,JVM 在执行方法时压入或者弹出这些变量。...4.2 作用 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。...Java编译器、JVM、解释器 3. Java程序编译和运行的过程
4、常见jvm实现 JVM内存模型 运行时数据区 运行时数据区的定义 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域 在 JVM 中, JVM 内存主要分为堆...同时按照与线程的关系也可以这么划分区域: 线程私有区域: 一个线程拥有单独的一份内存区域。 线程共享区域: 被所有线程共享, 且只有一份。...另外程序计数器也是 JVM 中唯一不会 OOM(OutOfMemory)的内存区域。...堆 堆是JVM 上最大的内存区域, 我们申请的几乎所有的对象, 都是在这里存储的。 我们常说的垃圾回收, 操作的对象就是堆。 堆空间一般是程序启动时, 就申请了, 但是并不一定会全部使用。...空间大小 栈的内存要远远小于堆内存 总结 本文讲解了 JVM 内存区域划分,要掌握 JDK 8 实现方式,JDK 1.7了解即可,JVM 内存区域包括程序计数器、虚拟机栈、本地方法栈、堆、元空间、直接内存
1 运行时数据区域 想要了解jvm,那对其内存分配管理的学习是必不可少的;java虚拟机在执行java程序的时候会把它所管理的内存划分成若干数据区域。...java虚拟机所分配管理的内存区域如图1所示 图1:jvm内存分配 1.1 程序计数器 程序计数器是一块比较小的内存空间,它可以看做是当前线程所执行的字节码的执行位置的指针。...此内存区域是唯一一个在jvm规范中没有规定任何OutOfMemoryerror情况的区域 1.2 java虚拟机栈 java虚拟机栈为线程私有的内存,其生命周期与线程相同。...1.4 java堆区 java堆是虚拟机所管理的内存中最大的一块,它是被所有线程共享的一块内存区域,该区域在虚拟机启动的时候创建。这个区域的唯一目的就是存放对象实例。...小结 该篇对jvm内存只能算一个概览,给小伙伴们介绍了一些概念性的东西,很多地方是值得去深入研究的,比如具体一个对象实例是如何被分配到堆内存的,类的加载过程,方法执行时方法栈的入栈与出栈的具体过程
一、内存分配概述 ? 二、JVM的内存区域划分 1、方法区 方法区主要是在JDK1.8 之前的版本,代表JVM中的一块区域。...在JDK1.8以后,这块区域的名字改成了"Metaspace",可以认为是 元数据空间的意思。当然这里主要还是存放我们自己写的各种类相关的信息。...主要是存放从".class"文件中加载进来的类,还会有一些类似常量池的东西在这个区域里面。...2、程序计数器 当JVM加载类信息到内存之后,实际就会使用自己的字节码执行引擎,去执行我们写的代码编译出来的代码指令,在执行直接指令的时候,JVM里就需要一个特殊的内存区域,这个就是程序计数器。...4、Java堆内存 Java堆内存区域里会放入类似ReplicaManager的对象,然后我们因为在main方法里创建了ReplicaManager对象的,那么在线程执行main方法代码的时候,就会在main
,要是申请不到足够的内存,此时就会抛出OOM异常了 本地方法栈 本地方法栈是线程私有的,存储Native方法的信息,这个内存区域也会抛出StackOverflowError和OOM异常 Java堆 Java...对象实例就存储在Java堆中,obj引用指向Java堆中实例的地址,Java堆是垃圾回收管理的主要区域,Java堆的内存空间不需要物理上的连续,只需要逻辑上的连续即可,Java堆也会抛出StackOverflowError...和OOM异常 方法区 方法区是线程共享的内存区域,它用来存储已经被虚拟机加载的类信息(类名,类字段,方法名等),常量(final修饰),静态变量(static修饰)等,此区域也会抛出OOM异常 运行时常量池...,即用过的内存都在一边,空闲的内存在另一边,那么此时的内存分配就是把指针指向空闲内存空间挪动一段于对象大小相同的距离;第二种是“空闲列表”,当Java堆中使用内存和空闲内存相互交错的时候,此时JVM必须维护一个列表...reference直接存的就是对象地址,reference直接指向JVM堆中的对象,这么做的好处就是访问对象速度快,要是对象被频繁的访问,那指针访问的方式将有明显的效率提升 内存溢出 Java堆内存溢出
本篇博文的重点是,谈谈 JVM 内存区域的划分,哪些区域可能发生 OutOfMemoryError?...概述 通常可以把 JVM 内存区域分为下面几个方面,其中,有的区域是以线程为单位,而有的区域则是整个 JVM 进程唯一的。 首先,程序计数器(PC,Program Counter Register)。...另外,还额外划分出了直接内存等区域。 这张图反映了实际中 Java 进程内存占用,与规范中定义的 JVM 运行时数据区之间的差别,它可以看作是运行时数据区的一个超集。...尽管,在 JVM 工程师的眼中,并不认为它是 JVM 内部内存的一部分,也并未体现 JVM 内存模型中。...后记 以上就是 【JAVA】JVM 内存区域的划分 的所有内容了; 介绍了主要的内存区域,以及在不同版本 Hotspot JVM 内部的变化,并且分析了各区域是否可能产生 OutOfMemoryError
java内存区域 ? ...;而java栈、本地方法栈和程序员计数器是运行时线程私有的内存区域。 ...此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 ...JVM参数配置 JVM启动模式 Client模式:启动速度较快,但运行时性能和内存管理效率不高 Server模式:启动比Client模式慢10%,但运行时性能和内存管理效率较高 在JVM...此算法需要暂停整个应用,同时,会产生内存碎片。 碎片太多可能引发另一次GC ? 复制(Copying): 此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。
先来看看JVM运行时候的内存区域 ? ...3.Heap Heap(堆)是JVM的内存数据区。Heap 的管理很复杂,是被所有线程共享的内存区域,在JVM启动时候创建,专门用来保存对象的实例。...7.直接内存区 直接内存区并不是 JVM 管理的内存区域的一部分,而是其之外的。该区域也会在 Java 开发中使用到,并且存在导致内存溢出的隐患。...小结: 在此,你对JVM的内存区域有了一定的理解,JVM内存区域可以分为线程共享和非线程共享两部分,线程共享的有堆和方法区,非线程共享的有虚拟机栈,本地方法栈和程序计数器。...每一个应用程序都对应唯一的一个JVM实例,每一个JVM实例都有自己的内存区域,互不影响。并且这些内存区域是所有线程共享的。这里提到的栈和堆都是整体上的概念,这些堆栈还可以细分。
领取专属 10元无门槛券
手把手带您无忧上云