首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JVM内存区域划分

JVM内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ?...在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分?...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。 5.方法区 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域

96720

JVM 内存区域划分详解

4、常见jvm实现 JVM内存模型 运行时数据区 运行时数据区的定义 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域JVM 中, JVM 内存主要分为堆...同时按照与线程的关系也可以这么划分区域: 线程私有区域: 一个线程拥有单独的一份内存区域。 线程共享区域: 被所有线程共享, 且只有一份。...另外程序计数器也是 JVM 中唯一不会 OOM(OutOfMemory)的内存区域。...空间大小 栈的内存要远远小于堆内存 总结 本文讲解了 JVM 内存区域划分,要掌握 JDK 8 实现方式,JDK 1.7了解即可,JVM 内存区域包括程序计数器、虚拟机栈、本地方法栈、堆、元空间、直接内存...,掌握内存划分,对后续学习垃圾回收算法很有必要!

23420
您找到你想要的搜索结果了吗?
是的
没有找到

JVM内存区域划分

学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?   ...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ?   ...在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分?   ...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。 5.方法区   方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域

68540

【JAVA】JVM 内存区域划分

本篇博文的重点是,谈谈 JVM 内存区域划分,哪些区域可能发生 OutOfMemoryError?...概述 通常可以把 JVM 内存区域分为下面几个方面,其中,有的区域是以线程为单位,而有的区域则是整个 JVM 进程唯一的。 首先,程序计数器(PC,Program Counter Register)。...理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,最有名的就是新生代、老年代的划分。 第四,方法区(Method Area)。...另外,还额外划分出了直接内存区域。 这张图反映了实际中 Java 进程内存占用,与规范中定义的 JVM 运行时数据区之间的差别,它可以看作是运行时数据区的一个超集。...后记 以上就是 【JAVA】JVM 内存区域划分 的所有内容了; 介绍了主要的内存区域,以及在不同版本 Hotspot JVM 内部的变化,并且分析了各区域是否可能产生 OutOfMemoryError

17030

快速串讲——JVM内存区域划分

目的 快速定位JVM内存泄漏或者溢出等问题。 面试基础题,加分项。 程序计数器(Program Counter Register) 记录当前线程所执行的字节码的行号。...Java 虚拟机规范中唯一没有规定内存溢出的区域。 “线程私有”的内存区域。 虚拟机栈(Virtual Machine Stacks) 其生命周期与线程相同。...“线程私有”的内存区域。 堆(Java Heap) 用于存放对象实例,是JVM占用内存最大一块区域。 垃圾收集器管理的主要区域。...“线程共享”的内存区域,线程共享的堆中又可能划分出多个线程私有的分配缓存区(Thread Local Allocation Buffer,TLAB)。...本地方法栈:本地方法执行的内存模型,和虚拟机栈非常相似,其区别是本地方法栈为 JVM 使用到的 Native 方法服务。 堆:用于存储对象实例,是垃圾收集器管理的主要区域

33830

JVM笔记-运行时内存区域划分

概述 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。...JVM 运行时内存区域 2.1 程序计数器 程序计数器(Program Counter Register),可以看做当前线程所执行的字节码的行号指示器(其实就是记录代码执行到了哪里)。...特点: 线程共享 虚拟机启动时创建 PS: "新生代"、"老年代"、"Eden 区"等一系列对堆的区域划分,只是部分垃圾收集器的一些共性或设计风格,而非虚拟机的固有内存布局,更非《Java 虚拟机规范》...的划分。...从上面几张图可以看出永久代和元空间的主要区别有以下两点: 存储位置不同 永久代是 JVM 内存的一部分,元空间在本地内存中(JVM 内存之外); 永久代使用不当可能导致 OOM,元空间一般不会。

97820

深入理解JVM内存区域划分

在整个执行过程中, JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称为运行时数据区(Runtime Data Area),也就是我们常说的JVM内存。...二、了解了java程序的执行原理,下面我们就要针对于运行时数据区进行深入理解; 运行时数据区就是我们平常所说的JVM内存,首先我们先了解一下JVM内存区域划分: 1.内存区域:可以划分为线程共享和非线程共享...这也是为什么把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域...2.堆   在C语言中,堆这部分空间是唯一一个程序员可以管理的内存区域。程序员可以通过malloc函数和free函数在堆上申请和释放空间。那么在Java中是怎么样的呢?   ...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。 3.方法区   方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域

46340

谈谈JVM内存区域划分,哪些区域可能发生 OutOfMemoryError?

第三,堆(Heap),它是 Java 内存管理的核心区域,用来放置 Java 对象实例,几乎所有创建的 Java 对象实例都是被直接分配在堆上。...理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,最有名的就是新生代、老年代的划分。 第四,方法区(Method Area)。...这也是所有线程共享的一块内存区域,用于存储所谓的元 (Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等。...对象实例都是分配在堆上 我们来看看什么是 OOM 问题,它可能在哪些内存区域发生?...首先,OOM 如果通俗点儿说,就是 JVM 内存不够用了,javadoc 中对OutOfMemoryError的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存

72900

JVM: JVM 内存划分

了解 JVM 内存的各个区域将有助于我们深入了解它的管理机制,避免出现内存相关的问题和高效的解决问题。...进一步划分的目的是跟好地回收内存,或者更快地分配内存。 ? 方法区 方法区也是线程共享的内存区域,用于存储已经被虚拟机加载的类信息、常量、静态变量等等。...我们称这个区域为永久代。它也是 JVM 垃圾回收作用的区域。...分配内存:在类加载检查通过后,接下来虚拟机将会为新生对象分配内存。对象所需的内存大小在类加载完毕后便可以确定了,为对象分配空间的任务相当于把一块确定大小的内存从 Java 堆中划分出来。...TLAB:为每一个线程预先在 Eden 分配一块内存JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,如果不够,使用 CAS 进行分配。

71121

Jvm内存划分

在Java开发中我们不用考虑对内存的管理,是因为Jvm帮我们做了很多工作。Jvm为了满足不同的用途将内存大体划分了下面几部分。如下图: ? 下面我们详细介绍一下每一块的具体的功能。...只不过不同的是,这个计数器不是针对程序来说的,而是真对线程来说的,因为每一个线程可能执行的逻辑是不一样的,所以Jvm就要知道每一个线程在上一次的执行位置。所以程序计数器,每一个线程都是独立的。...堆:Jvm中管理内存的最大的地方。它的作用是存储对象的实例。我们可以通过设置-Xmx和-Xms控制堆大小。堆也是Jvm中垃圾回收器回收的主要地方。并且堆内存是所有线程所共享的区域。...方法区:和堆一样也是所有线程共享的内存区域,不同是的是它主要存储被虚拟机加载的类信息、常量、静态变量等信息。 运行时常量池:常量池存放在方法区中,主要保存编译时生成的字面量和符号引用。

59420

JVM内存划分

HotSpot虚拟机 3.1 内存划分 3.2 对象的创建、内存布局、访问定位 3.2.1 对象的创建 3.2.2 对象的内存布局 3.2.3 对象的访问定位 4....运行时数据区域 Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。...HotSpot虚拟机 3.1 内存划分 根据JVM规范,内存可分为:虚拟机栈,本地方法栈,堆,方法区,程序计数器五个部分。 但是各种虚拟机HotSpot,JRockit实现却与JVM不尽相同。...如下为JDK8的内存划分: 其中,元空间(Metaspace)的本质和永久代类似,都是对JVM规范中方法区的实现。 不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。...此外还有对象创建的并发问题: (1)堆分配内存空间的动作进行同步处理–采用CAS配上失败重试的方式保证更新操作的原子性; (2)把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存

77320

JVM 札记】JVM 内存划分

为什么进行内存划分 既然需要了解 JVM内存划分,那么就先说说 JVM 为什么要进行内存划分呢?这个其实比较好理解,因为这种划分区域的方式可以说随处可见。...当然了,虽然这是事实,但是也并不说明内存按属性划分的管理方式有问题) JVM 内存大致划分 JVM 作为虚拟机的存在可以被认为是一台独立的机器,.class 作为 JVM 上的可执行文件,因此,JVM...也会划分不同的内存区域来管理 .class 文件在执行时的状态。...JDK 8 的内存区域划分与之前 JDK 版本有所不同,大体是移除了持久代,而改用了元空间。...JDK 8 的 JVM 内存区域划分大体如下: 在图中,可以看到内存大体划分为:方法区、堆、虚拟机栈、本地方法栈、程序计数器和直接内存。 这里大体来介绍一下这些内存区域的作用。

10610

JVM内存区域

Java运行时内存区域 Java虚拟机在启动时会根据JVM参数向操作系统申请内存,并将申请到的内存划分为不同的区域。...这些区域的作用各不相同,有的区域JVM启动时就已初始化并一直存在,有的区域则依赖于用户线程的启动和结束而建立和销毁。...JVM内存区域包含以下几个运行时数据区(图摘自深入理解JAVA虚拟机第三版)。...Java虚拟机运行时数据区.png 方法区 方法区(Method Area)是共享的内存区域,它用于保存JVM加载过的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。...程序计数器 JVM的程序计数器和操作系统的计数器很类似,可以看作是当前线程所执行的字节码的行号指示器。程序计数器只占很小的一块空间,而且不会出现扩容的情况,是JVM里唯一不会OOM的内存区域

90600

JVM内存区域

JVM内存区域 数据区域 ?...此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError内存溢出情况的区域。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。...,并更新列表上的记录,这种分配方式称为“空闲列表”; 并发创建对象(非线程安全) 方案1:对分配内存空间的动作进行同步处理--实际上JVM采用CAS配上失败重试的方式保证更新操作的原子性 方案...对象的内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

1K30

java内存区域划分详解

概述:这篇将从概念上介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题。...Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁时间,称之为运行时数据区域。...程序计数器可能出现的异常:此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutofMemory区域的地方,一般遇到OOM问题,不会是这里。...在这块区域内,可能出现的异常,当在堆中没有内存可以完成实例对象的分配时,堆也无法再扩展时,会出现OutOfMemoryError错误信息。...由于直接内存不属于Java虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,JDK1.4中新加入了NIO类,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native函数库直接分配对外内存

70941

JVM内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为多个区域,这些区域各有自己的用途以及独特的创建和销毁时间,今天就来揭开这些不同的数据区域的神秘面纱 先来一张最经典的图: ?...栈 本地方法栈和虚拟机栈可以统称为栈,由于本地方法栈是jvm调用操作系统native方法所使用的栈且它们的作用是非常相似的,所以这里重点看一下虚拟机栈。...它描述的java方法执行的内存模型 为什么是Java方法执行的内存模型呢? 在虚拟机中,每一次方法调用都会创建栈帧,这个栈帧的生命周期就伴随着这个方法的执行周期。...关于堆的更多内容请持续关注博客更新 方法区 方法区同样是各个线程共享的内存区域,它主要存储已经被虚拟机加载的类信息 类信息 类的全限定名 父类的全限定名 直接实现接口的全限定名 类型标志 类的访问描述符...Class.forName获取的引用 方法表 非抽象类、非接口的类才会有,一个保存类中所有的方法的数组,数组中每个每个元素是对每个方法的直接引用 运行时常量池 当类和接口被加载到JVM

96240

JVM内存区域

博主:java_wxid 社区:幕后大佬 @TOC 本文的大概内容: JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 与Buffer 的 IO 方式, 它可以使用 Native函数库直接分配堆外内存...这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError 情况的区域。...堆(Heap-线程共享)-运行时数据区 线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域

71210

JVM内存区域

---- @TOC ---- 本文的大概内容: JVM内存区域 ---- JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 与Buffer 的 IO 方式, 它可以使用 Native函数库直接分配堆外内存...这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError 情况的区域。...堆(Heap-线程共享)-运行时数据区 线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域

41810

JVM内存区域划分以及垃圾回收机制详解

本篇博客,我们先简单聊一下JVM区域划分,然后在此基础上介绍一下JVM的垃圾回收机制。...一、JVM内存区域划分简述 当然本部分简单的聊一下JVM内存区域划分,为下方垃圾回收机制内容的展开进行铺垫。当然对JVM内存区域划分的内容网上有好多详细的内容,请自行Google。...根据JVM内存区域划分,简单的画了下方的这个示意图。区域主要分为两大块,一块是堆区(Heap),我们所New出的对象都会在堆区进行分配,在C语言中的malloc所分配的方法就是从Heap区获取的。...二、常见的内存回收算法简介 上面我们简单的了解的JVM内存区域划分,接下来我们就来看一下几种常见的内存回收算法。...因为retainCount不为零,所以这2块内存区域是不会被释放的,2不会被释放,那么自然而然的3块内存区域也不会被释放,但是这块内存区域有不会再被使用到了,所以就会造成“内存泄露”的情况。

1K70

JVM内存区域认识

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 几乎所有的对象实例都在这里分配内存。...从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。...不论如何划分,都与存放的内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好的回收内存,或者更快地分配内存 根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中...这个区域内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说,这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是必要的 根据Java虚拟机规范的规定...直接内存(Direct Memory) 直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域

17440
领券