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

JVM的内存区域划分

JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ?...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分?...4.堆 在C语言中,堆这部分空间是唯一一个程序员可以管理的内存区域。程序员可以通过malloc函数和free函数在堆上申请和释放空间。那么在Java是怎么样的呢?...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM只有一个堆。 5.方法区 方法区在JVM也是一个非常重要的区域,它与堆一样,是被线程共享的区域

98920

java内存区域划分详解

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

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

    JVM 内存区域划分详解

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

    33820

    JVM的内存区域划分

    学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?   ...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ?   ...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分?   ...4.堆   在C语言中,堆这部分空间是唯一一个程序员可以管理的内存区域。程序员可以通过malloc函数和free函数在堆上申请和释放空间。那么在Java是怎么样的呢?   ...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM只有一个堆。 5.方法区   方法区在JVM也是一个非常重要的区域,它与堆一样,是被线程共享的区域

    70840

    【JAVA】JVM 内存区域划分

    本篇博文的重点是,谈谈 JVM 内存区域划分,哪些区域可能发生 OutOfMemoryError?...理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,最有名的就是新生代、老年代的划分。 第四,方法区(Method Area)。...在 Oracle Hotspot JVM ,本地方法栈和 Java 虚拟机栈是在同一块儿区域,这完全取决于技术实现的决定,并未在规范强制。...另外,还额外划分出了直接内存等区域。 这张图反映了实际 Java 进程内存占用,与规范定义的 JVM 运行时数据区之间的差别,它可以看作是运行时数据区的一个超集。...后记 以上就是 【JAVA】JVM 内存区域划分 的所有内容了; 介绍了主要的内存区域,以及在不同版本 Hotspot JVM 内部的变化,并且分析了各区域是否可能产生 OutOfMemoryError

    23430

    Java虚拟机--内存区域划分

    Java虚拟机在执行Java程序时,会把它所管理的内存划分为若干个数据区域,这些区域各有各的用途。运行时数据区有五部分:程序计数器、虚拟机栈、本地方法栈、方法区、堆。...此内存区域是唯一一个在Java虚拟机规范没有规定任何OutOfMemoryError情况的区域。 Java虚拟机栈: 此块内存也是“线程私有”的,它的生命周期与线程相同。...Java堆: Java堆是虚拟机所管理的内存中最大的一块,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这块区域是“线程共享”的。...直接内存: 直接内存并不是虚拟机运行时数据区的一部分,Java虚拟机规范也没有定义该区域。但这部分内存也被频繁使用,也可能导致OutOfMemoryError异常,所以放在一起对比理解。...这样在一些场景避免了在Java堆和Native堆来回复制数据,显著提高性能。 显然直接内存分配不会受到Java堆的限制,但肯定会受到本机内存的限制。

    52440

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

    Java 虚拟机规范唯一没有规定内存溢出的区域。 “线程私有”的内存区域。 虚拟机栈(Virtual Machine Stacks) 其生命周期与线程相同。...“线程私有”的内存区域。 堆(Java Heap) 用于存放对象实例,是JVM占用内存最大一块区域。 垃圾收集器管理的主要区域。...在HotSpot虚拟机,通过-Xmx和-Xms控制堆的大小,通过-Xmn控制新生代的大小。 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。...“线程共享”的内存区域,线程共享的堆又可能划分出多个线程私有的分配缓存区(Thread Local Allocation Buffer,TLAB)。...JDK7 永久代的字符串常量池被移出。 JDK8 使用元空间实现方法区。 “线程共享”的内存区域。 总结 程序计数器:当前线程所执行的字节码的行号指示器。

    35730

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

    在 JVM 规范,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。...栈帧存储着局部变量表、操作数(operand)栈、动态链接、方法正常退出或者异常退出的定义等。...理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,最有名的就是新生代、老年代的划分。 第四,方法区(Method Area)。...在 Oracle Hotspot JVM ,本地方法栈和 Java 虚拟机栈是在同一块儿区域,这完全取决于技术实现的决定,并未在规范强制。 ?...对象实例都是分配在堆上 我们来看看什么是 OOM 问题,它可能在哪些内存区域发生?

    76200

    深入理解JVM的内存区域划分

    二、了解了java程序的执行原理,下面我们就要针对于运行时数据区进行深入理解; 运行时数据区就是我们平常所说的JVM内存,首先我们先了解一下JVM内存区域划分: 1.内存区域:可以划分为线程共享和非线程共享...这也是为什么把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域...2.堆   在C语言中,堆这部分空间是唯一一个程序员可以管理的内存区域。程序员可以通过malloc函数和free函数在堆上申请和释放空间。那么在Java是怎么样的呢?   ...因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM只有一个堆。 3.方法区   方法区在JVM也是一个非常重要的区域,它与堆一样,是被线程共享的区域。...: http://blog.csdn.net/ns_code/article/details/17565503 http://www.cnblogs.com/sunada2005/p/3577799.html

    51640

    【JVM】JVM执行流程和内存区域划分

    Java 字节码JVM 执行流程编程语言可以分为:编译型语言:先将高级语言转换成二进制的机器指令,再由 CPU 去直接执行解释型语言:一边去转换,一边去执行这样的说法放单今天,硬件不适用了按照上述这种经典的划分方式...对上(给 java 层面上提供的内容)是统一一致的内存区域划分JVM 其实也是一个进程(任务管理器中看到的 java 进程)图片进程运行过程,要从操作系统这里车身轻一些资源(内存就是其中的典型资源),...,又会根据实际的使用用途,来划分出不同的空间,这就是所谓的“区域划分”图片堆代码 new 出来的对象,都是在堆里。...这里的是两块区域程序计数器这个区域比较小,专门用来存储下一条要执行的 Java 指令的地址元数据区“元数据”是计算机的一个常见术语(meta data),往往指的是一些辅助性质的,描述性质的属性。...),栈和程序计数器可能有 n 份(和线程相关,每个线程都有自己的程序计数器和栈(每个线程有自己的执行流))经典笔试题在下面代码,t、n、m 分别处于 JVM 内存的哪个区域

    6210

    【JVM】JVM执行流程和内存区域划分

    执行流程 编程语言可以分为: 编译型语言:先将高级语言转换成二进制的机器指令,再由 CPU 去直接执行 解释型语言:一边去转换,一边去执行 这样的说法放单今天,硬件不适用了 按照上述这种经典的划分方式...对上(给 java 层面上提供的内容)是统一一致的 内存区域划分 JVM 其实也是一个进程(任务管理器中看到的 java 进程) 进程运行过程,要从操作系统这里车身轻一些资源(内存就是其中的典型资源...,又会根据实际的使用用途,来划分出不同的空间,这就是所谓的“区域划分” 堆 代码 new 出来的对象,都是在堆里。...这里的是两块区域 程序计数器 这个区域比较小,专门用来存储下一条要执行的 Java 指令的地址 元数据区 “元数据”是计算机的一个常见术语(meta data),往往指的是一些辅助性质的,描述性质的属性...(所有线程共享一份),栈和程序计数器可能有 n 份(和线程相关,每个线程都有自己的程序计数器和栈(每个线程有自己的执行流)) 经典笔试题 在下面代码,t、n、m 分别处于 JVM 内存的哪个区域

    13310

    Java 虚拟机内存区域划分详解(1)

    二、Java运行时数据区域 我们一般在开发认为JVM不过有堆和栈两部分组成,但是实际的Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。...经常有人把 Java 内存区分为堆内存( Heap)和栈内存( Stack),这种分法比较粗糙, Java 内存区域划分实际上远比这复杂。...这种划分方式的流行只能说明大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块。其中所指的“堆”在后面会专门讲述,而所指的“栈”就是现在讲的虚拟机栈,或者说是虚拟机栈的局部变量表部分。...不过,无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。...在本章,我们仅仅针对内存区域的作用进行讨论, Java 堆的上述各个区域的分配 和回收等细节将会是下一章的主题。

    49840

    Java的内存管理机制之内存区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范(第2版)》规定,Java虚拟机所管理的内存包括以下几个运行区域。...程序记数器 (线程私有,内存区域唯一在Java虚拟机规范没有规定任何OutOfMemoryError情况的区域) 它可以看做是当前线程所执行的字节码的行号指示器。...每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机从入栈到出栈的过程。 局部变量表存放的是啥?...从内存分配的角度看,线程共享的Java堆可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。...直接内存 直接内存(Direct Memory)并不是虚拟机运行时的一部分,也不是Java虚拟机规范定义的内存区域,但是这部分也被频繁的使用,而且也可能导致OutOfMemoryError异常出现。

    49220

    【CC++教学】关于CC++各个区域内存的划分,你知道多少?

    其中代码是放在代码区, 而数据根据类型和功能 的不同, 又放在不同的区域。 那么关于这些区域是怎么划分的呢? 今天带你一探究竟。 01 代码区 顾名思义, 代码区就是存储程序代码的区域。...像其中func函数的变量a,变量b, main函数里面的变量val 等局部变量 以及调用func函数传入的参数200等, 这些都是存放在栈区的,...03 堆区 前面说的, 栈区是放局部变量的区域, 大小有限。 那么实际开发, 要从硬盘中加载一个几GB的大数据文件, 用到更多的内存空间时怎么办? 这时候你就可以用到堆区了!...malo函数结束后, 通过malloc申请的100个字节的内存 并不会被回收, 这一块内存则是从堆区申请的。...尾声 看了上面的介绍 是不是对内存区域划分更加清楚了呢 是不是觉得自己的肚子里的墨水又多了呢 小编觉得答案毋庸置疑了>-<

    72510

    Java虚拟机内存区域划分以及作用详解

    4、堆 所有线程共享的一块内存区域。Java虚拟机所管理的内存中最大的一块,因为该内存区域的唯一目的就是存放对象实例。...几乎所有的对象实例度在这里分配内存,也就是通常我们说的new对象,该对象就会在堆开辟一块内存来存放对象的一些信息,比如属性呀什么的。同时堆也是垃圾收集器管理的主要区域。...就在堆创建一块区域,用于存放创建出来的实例对象,地址为0X001.其中有两个属性值 color和num。...空闲列表:有一个列表,其中记录哪些内存块有用,在分配的时候从列表中找到一块足够大的空间划分给对象实例,然后更新列表的记录。...句柄访问:Java堆中会划分出一块内存来作为句柄池,引用变量存储的就是对象的句柄地址,而句柄包含了对象实例数据和类型数据各自的具体地址信息 ?

    87300

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

    本篇博客,我们先简单聊一下JVM的区域划分,然后在此基础上介绍一下JVM的垃圾回收机制。...一、JVM内存区域划分简述 当然本部分简单的聊一下JVM的内存区域划分,为下方垃圾回收机制内容的展开进行铺垫。当然对JVM内存区域划分的内容网上有好多详细的内容,请自行Google。...根据JVM内存区域划分,简单的画了下方的这个示意图。区域主要分为两大块,一块是堆区(Heap),我们所New出的对象都会在堆区进行分配,在C语言中的malloc所分配的方法就是从Heap区获取的。...二、常见的内存回收算法简介 上面我们简单的了解的JVM内存区域划分,接下来我们就来看一下几种常见的内存回收算法。...在左边的栈的a、b、c三个引用分别指向堆的不同区域块。在堆的内存区域,该区域有一个强引用时,其retainCount就会加1。而在弱引用时,就retainCount就不会加1。

    1.2K70
    领券