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

java 内存划分

概述 java 虚拟机在 java 程序执行过程中会将内存划分为若干个不同的数据区域,如下图所示: 程序计数器 程序计数器是一块较小的内存空间,他存储了正在执行的虚拟机字节码指令的地址。...这块内存被每个线程私有,且是唯一不会抛出 OutOfMemoryError 的内存区域。...虚拟机栈空间中的局部变量表以 Slot 为单位进行内存的分配,每个 Slot 32bit,他在编译期间完成内存的分配。...java 堆中还可细分为新生代和老年代,甚至进一步细分为很多空间,从分配角度划分,java 堆可以划分出多个线程私有的分配缓冲区(TLAB) 按照 java 虚拟机规范,java 堆处于物理上不连续的内存空间中...,在逻辑上他是连续的整块内存

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

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 内存划分

在使用 C 或者 C++ 编程时,程序员需要手动的去管理和维护内存,就是说需要手动的清除那些不需要的对象,否则就会出现内存泄漏与内存溢出的问题。...了解 JVM 内存的各个区域将有助于我们深入了解它的管理机制,避免出现内存相关的问题和高效的解决问题。...进一步划分的目的是跟好地回收内存,或者更快地分配内存。 ? 方法区 方法区也是线程共享的内存区域,用于存储已经被虚拟机加载的类信息、常量、静态变量等等。...直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区域,但是却是NIO 操作时会直接使用的一块内存,虽然不受虚拟机参数限制,但是还是会受到本机总内存的限制,会抛出...分配内存:在类加载检查通过后,接下来虚拟机将会为新生对象分配内存。对象所需的内存大小在类加载完毕后便可以确定了,为对象分配空间的任务相当于把一块确定大小的内存从 Java 堆中划分出来。

71121

【JVM 札记】JVM 内存划分

为什么进行内存划分 既然需要了解 JVM 的内存划分,那么就先说说 JVM 为什么要进行内存划分呢?这个其实比较好理解,因为这种划分区域的方式可以说随处可见。...当然了,虽然这是事实,但是也并不说明内存按属性划分的管理方式有问题) JVM 内存大致划分 JVM 作为虚拟机的存在可以被认为是一台独立的机器,.class 作为 JVM 上的可执行文件,因此,JVM...也会划分不同的内存区域来管理 .class 文件在执行时的状态。...JDK 8 的 JVM 内存区域划分大体如下: 在图中,可以看到内存大体划分为:方法区、堆、虚拟机栈、本地方法栈、程序计数器和直接内存。 这里大体来介绍一下这些内存区域的作用。...程序计数器相当于 CPU 中的 IP 寄存器,即指令指针寄存器,32 位的 CPU 被称为 EIP,64 位的 CPU 称为 RIP。它的作用是保存了下一条要执行的指令的地址。

10610

JVM 内存区域划分详解

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

23420

JVM的内存区域划分

JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ?...因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分?...讲到这里,大家就应该会明白为什么 在 使用 递归方法的时候容易导致栈内存溢出的现象了以及为什么栈区的空间不用程序员去管理了(当然在Java中,程序员基本不用关系到内存分配和释放的事情,因为Java有自己的垃圾回收机制

96720

java内存区域划分详解

概述:这篇将从概念上介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题。...Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁时间,称之为运行时数据区域。...堆可以处于物理上不连续的内存空间,只要逻辑上是连续的即可。...由于直接内存不属于Java虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,JDK1.4中新加入了NIO类,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native函数库直接分配对外内存...直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,肯定会受到本机总内存大小和处理器寻址空间的限制。

70941

JVM的内存区域划分

学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?   ...由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: ?   ...因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。   ...在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢? 一.运行时数据区包括哪几部分?   ...讲到这里,大家就应该会明白为什么 在 使用 递归方法的时候容易导致栈内存溢出的现象了以及为什么栈区的空间不用程序员去管理了(当然在Java中,程序员基本不用关系到内存分配和释放的事情,因为Java有自己的垃圾回收机制

68540

【JAVA】JVM 内存区域的划分

本篇博文的重点是,谈谈 JVM 内存区域的划分,哪些区域可能发生 OutOfMemoryError?...理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进行进一步的细分,最有名的就是新生代、老年代的划分。 第四,方法区(Method Area)。...另外,还额外划分出了直接内存等区域。 这张图反映了实际中 Java 进程内存占用,与规范中定义的 JVM 运行时数据区之间的差别,它可以看作是运行时数据区的一个超集。...首先,OOM 如果通俗点儿说,就是 JVM 内存不够用了,javadoc 中对 OutOfMemoryError 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。...后记 以上就是 【JAVA】JVM 内存区域的划分 的所有内容了; 介绍了主要的内存区域,以及在不同版本 Hotspot JVM 内部的变化,并且分析了各区域是否可能产生 OutOfMemoryError

17330

Java虚拟机内存管理(一)—内存划分

1、内存划分 内存是计算机中运行系统和软件的场所,而内存划分是 Java 虚拟机管理内存中人为添加的概念,是为了更好的描述 Java 虚拟机对内存的管理。...下图中的的运行时数据区域即是 Java 虚拟机所管理的内存区域。 ? 内存划分.png 1.1 程序计数器 在 CPU 的寄存器中有指令计数器,而在 Java 虚拟机内存管理中也有类似的程序计数器。...1.2 Java 虚拟机栈 我们常在程序运行的内存划分为堆区和栈区,但是在 Java 中,这样的划分是很粗糙的,Java 虚拟机中栈有 Hava虚拟机栈和本地方法栈。...1.6 直接内存 直接内存并不在 Java 虚拟机管理的内存区域内,也不是 Java 虚拟机规范中定义的内存区域。...直接内存是 Java 程序不经过 Java 虚拟机分配,直接使用主机的物理内存,在一些场景(如文件赋值)中可以提高性能,但是直接在使用直接内存中也要注意主机内存大小的限制(包括物理和系统级的限制),否则也会抛出

83351

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

先从Java虚拟机的内存开始吧。 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。...因此为了线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序技术器,各条线程之间的计数器互不影响,独立存储,这类内存区域为“线程私有”的内存。...从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。...直接内存 直接内存(Direct Memory)并不是虚拟机运行时的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分也被频繁的使用,而且也可能导致OutOfMemoryError异常出现。...那什么是直接内存

47120

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

Java虚拟机在执行Java程序时,会把它所管理的内存划分为若干个数据区域,这些区域各有各的用途。运行时数据区有五部分:程序计数器、虚拟机栈、本地方法栈、方法区、堆。...其中64位长度的long和double会占用2个局部变量空间,其他数据类型只占用一个。...Java堆: Java堆是虚拟机所管理的内存中最大的一块,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这块区域是“线程共享”的。...当运行时常量池无法再申请到内存时,将会抛出OutOfMemoryError异常。 直接内存: 直接内存并不是虚拟机运行时数据区的一部分,Java虚拟机规范中也没有定义该区域。...显然直接内存分配不会受到Java堆的限制,但肯定会受到本机内存的限制。

49840

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

Java 虚拟机规范中唯一没有规定内存溢出的区域。 “线程私有”的内存区域。 虚拟机栈(Virtual Machine Stacks) 其生命周期与线程相同。...“线程私有”的内存区域。 堆(Java Heap) 用于存放对象实例,是JVM占用内存最大一块区域。 垃圾收集器管理的主要区域。...堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。 没有内存完成实例分配时,抛出 OutOfMemoryError 。...“线程共享”的内存区域,线程共享的堆中又可能划分出多个线程私有的分配缓存区(Thread Local Allocation Buffer,TLAB)。...“线程共享”的内存区域。 总结 程序计数器:当前线程所执行的字节码的行号指示器。 虚拟机栈:Java方法执行的内存模型,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

33830

Java 运行时的内存划分

Java 运行时的内存划分 ? image 程序计数器 记录当前线程所执行的字节码行号,用于获取下一条执行的字节码。 当多线程运行时,每个线程切换后需要知道上一次所运行的状态、位置。...直接内存 直接内存又称为 Direct Memory(堆外内存),它并不是由 JVM 虚拟机所管理的一块内存区域。...它是通过在堆内存中的 DirectByteBuffer 对象操作的堆外内存,避免了堆内存和堆外内存来回复制交换复制,这样的高效操作也称为零拷贝。 既然是内存,那也得是可以被回收的。...值得注意的是:由于堆外内存也是内存,是由操作系统管理。如果应用有使用堆外内存则需要平衡虚拟机的堆内存和堆外内存的使用占比。避免出现堆外内存溢出。 常用参数 ?...常见的如下: -Xms64m 最小堆内存 64m. -Xmx128m 最大堆内存 128m. -XX:NewSize=30m 新生代初始化大小为30m.

1.1K20

Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 procmeminfo 文件 | procmeminfo 重要字段解析 )

文章目录 一、查看 x86_64 架构体系内存分布 二、/proc/meminfo 重要字段解析 一、查看 x86_64 架构体系内存分布 ---- 执行 cat /proc/meminfo 命令 ,...可以查看 " x86_64 架构体系内存分布 " ; 执行结果参考 : root@ubuntu:~/kernel/linux-5.6.14# cat /proc/meminfo MemTotal:...DirectMap4k: 159552 kB DirectMap2M: 2985984 kB DirectMap1G: 3145728 kB root@ubuntu:~/kernel/linux...: 2312852 kB 空余内存 , 这些内存还没有使用 MemAvailable: 3009516 kB 真正可用的内存 , 比 MemFree 大一些 , 这是因为一些内存虽然已经使用了 , 但是可以回收...不活跃文件使用的内存 Unevictable: 48 kB 不可释放的内存页 Mlocked: 48 kB 允许程序在 " 物理内存 " 上 锁住 " 地址空间 " SwapTotal: 0 kB 交换空间总内存大小

1.5K30

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

因此,在java中我们常说内存管理就是针对这段空间的管理。 2.原理图: ?...二、了解了java程序的执行原理,下面我们就要针对于运行时数据区进行深入理解; 运行时数据区就是我们平常所说的JVM内存,首先我们先了解一下JVM内存区域的划分: 1.内存区域:可以划分为线程共享和非线程共享...事实上,Java栈是Java方法执行的内存模型。为什么这么说呢?下面就来解释一下其中的原因。...讲到这里,大家就应该会明白为什么 在 使用 递归方法的时候容易导致栈内存溢出的现象了以及为什么栈区的空间不用程序员去管理了(当然在Java中,程序员基本不用关系到内存分配和释放的事情,因为Java有自己的垃圾回收机制...由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

46340

linux aarch64启动不了,引导AArch64 Linux

这篇文章基于Russell King所写的《the ARM booting document》,并与AArch64 Linux kernel的所有公开版本相关。...在本文中,我们使用术语“boot loader”来简单地定义在控制权传递给Linux kernel之前,在CPU上执行的所有软件,这可能包括Secure Monitor和hypervisor代码,或者仅仅是一小段预备好最小引导环境的指令代码...该基地址一下的内存目前Linux并没有使用,因此强烈建议基地址就是于RAM的开始地址,从映像开始,必须保证有image_size大小可用空间给kernel映像使用。...– 具有“spin-table” enable-method属性的CPU必须在其cpu节点上有一“cpu-release-addr”属性,该属性标识64-bit自然对齐的已经初始化为0的内存位置。...这些CPU应在kernel外的一保留内存区域(该保留内存区域通过设备树的memreserve节点传递给kernel)自旋轮询它们在保留内存区域上各自的cpu-release-addr地址。

4.7K10
领券