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

JVM内存区域

JVM内存区域 数据区域 ?...因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。...此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError内存溢出情况的区域。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。...这区域内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收有时又确实是必要的。

1K30

JVM内存区域

Java运行时内存区域 Java虚拟机在启动时会根据JVM参数向操作系统申请内存,并将申请到的内存划分为不同的区域。...这些区域的作用各不相同,有的区域在JVM启动时就已初始化并一直存在,有的区域则依赖于用户线程的启动和结束而建立和销毁。...JVM的内存区域包含以下几个运行时数据区(图摘自深入理解JAVA虚拟机第三版)。...直接内存 直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中 定义的内存区域。但是这部分内存也被频繁的使用,而且也会导致OOM异常。...-Xmx等参数信息,但经常会忽略掉直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而引起OutOfMemoryError异常。

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

JVM内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为多个区域,这些区域各有自己的用途以及独特的创建和销毁时间,今天就来揭开这些不同的数据区域的神秘面纱 先来一张最经典的图: ?...它描述的java方法执行的内存模型 为什么是Java方法执行的内存模型呢? 在虚拟机中,每一次方法调用都会创建栈帧,这个栈帧的生命周期就伴随着这个方法的执行周期。...动态链接 在虚拟机运行的时候,运行时常量池会保存每个方法的间接引用,如果栈帧A的方法想调用栈帧B的方法,那么这个虚拟机的方法调用指令就会以B方法的符号引用作为参数,但是因为符号引用并不是直接指向代表B方法的内存位置...关于堆的更多内容请持续关注博客更新 方法区 方法区同样是各个线程共享的内存区域,它主要存储已经被虚拟机加载的类信息 类信息 类的全限定名 父类的全限定名 直接实现接口的全限定名 类型标志 类的访问描述符

96240

Java内存区域

2 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 ? 这些组成部分一些事线程私有的,其他的则是线程共享的。...另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。...2.4 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。....html 2.7 直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。...3.2 对象的内存布局 在 Hotspot 虚拟机中,对象在内存中的布局可以分为3快区域:对象头、实例数据和对齐填充。

1.2K20

【JVM内存区域

博主:java_wxid 社区:幕后大佬 @TOC 本文的大概内容: JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError 情况的区域。...堆(Heap-线程共享)-运行时数据区 线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。...永久代 内存的永久保存区域,主要存放 Class 和 Meta(元数据)的信息。 Class在被加载的时候被放入永久区域,它和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。

71210

【JVM内存区域

---- @TOC ---- 本文的大概内容: JVM内存区域 ---- JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError 情况的区域。...堆(Heap-线程共享)-运行时数据区 线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。...永久代 内存的永久保存区域,主要存放 Class 和 Meta(元数据)的信息。 Class在被加载的时候被放入永久区域,它和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。

41810

Java内存区域

Java运行时数据区域 Java虚拟机所管理的内存包括以下几个运行时数据区域,如下图: 程序计数器   程序计数器(Program Counter Register)是一块较小的内存区域,是当前线程执行的字节码的行号指示器...程序计数器是一块私有的内存区域,每个线程都有一个独立的程序计数器。...程序计数器所在的内存区域是唯一一个在Java虚拟机没有OOM(OutOfMemoryError)情况的区域。...上面三个内存数据区域(程序计数器、Java虚拟机栈、本地方法栈)都是私有的,那么我们来看一下内存线程共享的数据区域。 Java堆   Java堆是所有线程共享的一个内存区域,在虚拟机启动时创建。...该区域也是人们常说的“永久代”,但是也会被GC回收,该区域内存回收主要是针对常量池的回收和对类的卸载。当方法区无法满足内存分配时也会抛出OOM异常。

25630

Java内存区域详解

一.概述 Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区域。JDK1.8和之前版本略有不同。...注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。...2.4 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。...直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。...3.2 对象的内存布局 在 Hotspot 虚拟机中,对象在内存中的布局可以分为 3 块区域:对象头、实例数据和对齐填充。

40940

静态内存区域解析

一、内存四区建立流程讲解 如上图所示,首先操作系统要把物理硬盘代码加载到内存中,加载完成后,操作系统会将代码分成四个区域,即堆区、栈区、全局区和常量区。最后,操作系统会找到main函数入口执行程序。...这就是内存四区执行流程的说明。 二、内存四区存储说明 栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。 堆区:由程序员动态申请与释放内存,通常用于存放new/malloc关键字创建的值。...全局变量和静态变量存储在一起,初始化的全局变量和静态变量在同一块区域,未初始化的存储在相邻的另一区域内。 程序代码区:存放函数体的二进制代码,由操作系统管理。...这就是p1指针的内存解析说明。 在编译程序时,若编译器检测到全局区有两个同样的值,它就会代码进行优化,在内存中只保留一份。...这就是静态内存区域的全部解析。

75760

JVM内存区域认识

故称该内存区域为“线程私有”的内存。 如果线程正在执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。...如果正在执行的是Native方法,这个计数器值为空(Undefined) 该内存区域是唯一一个在Java虚拟机中没有规定任何OutOfMemoryError情况的区域。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 几乎所有的对象实例都在这里分配内存。...这个区域内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说,这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是必要的 根据Java虚拟机规范的规定...直接内存(Direct Memory) 直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域

17440

内存区域 - gc详解

s1中的所有内存,完成垃圾回收。...并且现在的虚拟机中将新生代分为eden区、from s1、to s2三块区域,他们之间默认的比例是8:1:1。...· 标记整理算法 该算法主要用在存活对象多,垃圾对象少的区域 —— 老年代。在老年代如果依然使用复制算法,由于存活对象较高,复制的成本也会比较大。...· 分代收集算法 分代收集算法是指根据内存区域的特点选择对应的算法来进行垃圾回收,在新生代中会发生垃圾对象远远多于存活对象的现象,那么就选择效率较高,又不会造成空间碎片的复制算法。...按照工作的内存区间可分为,新生代垃圾回收器和老年代垃圾回收器。新生代垃圾回收器只处理新生代内存区域,老年代垃圾回收器只处理老年代内存区域

64720

JVM 内存区域方面

二、运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK. 1.8 和之前的版本略有不同,下面会介绍到。 JDK 1.8之前: ?...另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。...注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。...2.4 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。...3.2 对象的内存布局 在 Hotspot 虚拟机中,对象在内存中的布局可以分为3块区域:对象头、实例数据和对齐填充。

35020

Java内存区域总结

(写在前面(常见面试题) 下面是面试官可能在“Java内存区域”知识点问你的问题,快拿出小本本记下来! 基本问题: 介绍下Java内存区域(运行时数据区)。...2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。 ? 这些组成部分一些事线程私有的,其他的则是线程共享的。...2.4 堆 Java虚拟机所管理的内存中最大的一块,Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。....html 2.7 直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。...3.2 对象的内存布局 在Hotspot虚拟机中,对象在内存中的布局可以分为3快区域:对象头、实例数据和对齐填充。

41450

Java 内存区域详解

例如Java内存区域到底是怎么样的?程序是怎么跑的?对象是怎么存放的?这些都影响了我对自己的程序运行的熟悉程度。 一. 运行时数据区域 ?...Java虚拟机在执行java程序的过程中,会把它所管理的内存划分成若干个不同的数据区域(每当运行一个java程序都会启动一个虚拟机)。...这个区域是用来存放对象实例的,几乎所有对象实例都会在这里分配内存,虚拟机规范中讲:所有对象的实例以及数组都要在堆上分配。...最后还有一个直接内存,在JDK1.4版本中加入了NIO类,引入了基于通道(Channel)与缓冲区(Buffer)的I/O方式,也就是说通过这种方式,不会在运行时数据区域分配内存,这样就避免了在运行时数据区域来回复制数据...对象的内存布局 对象在堆中的布局分为三个区域:对象头,实例数据,对齐填充。

40620

Java 内存区域详解

二 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 JDK 1.8 和之前的版本略有不同,下面会介绍到。...另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。...2.4 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。...,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。...3.2 对象的内存布局 在 Hotspot 虚拟机中,对象在内存中的布局可以分为 3 块区域:对象头、实例数据和对齐填充。

43220

Java内存区域内存溢出异常

Java内存区域内存溢出异常 运行时数据区 方法区(Method Area) 虚拟机栈(VM Stack) 本地方法栈(Native Method Stack) 堆(Heap) 程序计数器(PC) ?...Undefined) 虚拟机栈(VM Stack) 重点: 线程创建会同步创建Stack Frame(存储局部变量表[基本数据类型、对象引用]) 方法的调用和执行对应栈帧再虚拟机栈中入栈和出栈的过程 这个内存区域内规定的两类异常状况...本地方法栈(类似VM Stack) Java堆 重点: 线程共享 存放对象实例(包括数组) 垃圾收集器管理的区域(分代收集理论) 分配缓冲区(Thread Local Allocation Buffer...,TLAB 提升对象分配时的效率) 不要求物理上连续的内存空间 可扩展(通过参数-Xmx和-Xms设定) 这个内存区域可能产生的异常状况: OutofMenoryError **产生原因:**Java堆中没有内存完成实例分配...,在类加载后将这些数据存放到运行时常量池 直接内存(不了解) 总结 掌握java内存区域布局,以及每一块的作用,知道每个内存区域时干什么的

2.2K60

Java 内存区域内存溢出异常

[JVM] Java 内存区域内存溢出异常 @TOC 手机用户请 横屏获取最佳阅读体验, REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。...程序计数器 一块较小的内存区域,可以看做是当前线程所执行的字节码的行号指示器。...此内存区域是Java虚拟机规范中唯一一个没有规定任何 OutOfMemoryError情况的区域。 Java 虚拟机栈 虚拟机栈描述的是Java方法执行的内存模型。和程序计数器一样,也是 线程私有的。...该区域和虚拟机栈抛出的异常情况一样。 Java 堆 Java 堆是Java虚拟机所管理的内存中最大的一块。被所有线程共享的一块区域,几乎所有的对象实例都在这里分配内存。...直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域

1.7K30

java内存区域划分详解

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

70941

JVM的内存区域划分

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

68540
领券