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

内存篇:JVM内存结构

Java8相对之前的版本,JVM结构发生了较大的变化,取消了永久代,新增了元空间,同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。...下面,以Java8为例,对JVM结构做一番总结。 1 JVM结构详解 首先,看下最新的JVM结构图: ?...Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。也就是说堆的内存是一块块拼凑起来的。...很多开发人员会把Java内存分为堆内存(Heap)和栈内存(Stack),这种划分的流行只能说明大多数开发人员最关注、与对象内存分配关系最密切的内存区域是这两块,其中所指的“堆”在后面会讲到,而所指的“...小结 经过上面的讲解,想必大家已经了解到JVM内存结构的基本情况。下面对照脑图,归纳总结一下,看你能说出来多少。 ?

5.4K30

JVM内存结构

**主要结构:**堆内存、方法区、栈(说明:基于JDK1.7) 堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor...在虚拟机规范中对本地方法栈中方法使用的语言、使用方式 与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。...此内存区域的唯一目的就 是存放对象实例,几乎所有的对象实例都在这里分配内存。...七、直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规 范中定义的内存区域。...服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略 直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制), 从而导致动态扩展时出现OutOfMemoryError

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

    JVM 内存结构

    Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。 ? 这些区域中,一些是线程私有的,一些是线程共享的。...线程私有的:程序计数器、虚拟机栈、本地方法栈 线程共享的:堆、方法区、直接内存 1、程序计数器 一块较小的内存空间,用于标记当前线程所执行字节码的行号。...所有实例和数组都在这里分配内存,也是线程共享的内存区域。 -Xms 设置最小值;-Xmx 设置最大值。 堆内存分配会另写一篇文章介绍。...6、直接内存 直接内存并不是虚拟机内存的一部分,也不是 Java 虚拟机规范中定义的内存区域。...jdk1.4 中新加入的 NIO,引入了通道与缓冲区的 IO 方式,它可以调用 Native 方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

    47720

    jvm内存结构

    JVM内存结构概览 先来看一张图: jvm主要分,堆、方法区、java栈、本地方法栈、程序计数器五个区域,其中方法区和堆区是线程共享的 堆区域 堆内存是JVM中最大的一块由新生代和老年代组成,而新生代内存又被分成三部分...TLAB仍然分配在堆上,结构比较简单,start、end就是起止地址,top表示已经分配到那里了,top与end相遇的时候,代表该缓存已经满了,JVM会试图再从Eden中分配一块 老年代 (old)..., 这样在一些场景中显著提升内存, 避免了在java堆和native堆中来回复制数据 直接内存的分配不受java堆大小的限制, 但是配置虚拟机参数的时候要考虑到直接内存的存在, 不能让各个内存区域的总和大于物理机的内存...内存泄露: memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光 内存泄露处理方式 如果是内存泄露,可用...具体可以参考分析内存泄露的一般办法 内存溢出的处理方式 如果内存不泄露,也就是说,就是内存中的对象确实都还必须都活着,则: 检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否还可以调大。

    83120

    JVM:内存结构

    JVM的内存结构大概分为: ? 通过一张图来了解如何通过参数来控制各区域的内存大小 ? 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的是存放对象实例。Java世界里"几乎"所有的对象实例都在这里分配内存。所有的对象实例以及数组都应当在堆上分配。...直接内存(堆外内存) 直接内存并不是虚拟机运行时数据区的一部分,也经常被频繁的使用,而且也可能导致OutOfMemoryError 异常。...直接内存的分配不受Java堆大小的限制,但是,既然是内存则肯定还是会受到本机总内存的限制。...服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError异常。

    74821

    JVM内存结构

    按照Java虚拟机规范的规定, JVM自动管理的内存将包括以下几个运行时的数据区域: ?...下面分别对几个数据区域进行说明: 1.程序计数器 程序计数器是JVM中一块较小的内存区域, 保存着当前线程执行的虚拟机字节码指令的内存地址....所有虚拟机栈也是"线程私有"的内存区域....这个栈中对应多个栈帧, 每调用一个方法就会往栈中创建并压入一个栈帧, 栈帧是用来存储方法数据和部分过程结果的数据结构, 每一个方法从调用到最终返回结果的过程, 就对应一个栈帧从入栈到出栈的过程...., 就会出现OOM 3.本地方法栈 本地方法栈和虚拟机栈的作用相似, 只是虚拟机栈是为Java方法服务的, 而本地方法栈是为Native方法服务的. 4.方法区 方法区是用来存储类结构信息(包括常量池、

    36720

    JVM 内存结构

    对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的delete/free 操作,不容易出现内存泄漏和内存溢出问题。...进一步划分的目的是更好地回收内存,或者更快地分配内存。 ?...Java 栈可用类比数据结构中栈,Java 栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入Java栈,每一个函数调用结束后,都会有一个栈帧被弹出。...直接内存 ---- 直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 异常出现。...本机直接内存的分配不会收到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。

    35720

    JVM内存结构

    说到java内存结构,不得不说下java内存模型,面试中可能经常会混淆,面试官问你的JAVA内存模型,可能人家想听到的是堆、栈、方法区等此类的关键词,只不过表述的有些问题,进而影响你的回答,所以在回答问题之前...,一定先问清楚是内存结构内存模型。...主要区别,java内存结构是对内存的具体划分,java内存模型是解决多线程下工作线程和主线程数据不一致问题而提出的抽象规则。...java内存结构简单划分如下图所示,以下结构是java8之前版本,在java8里元空间取代了之前版本的方法区 可以看到java内存主要划分线程共享(堆、方法区),线程私有(程序计数器、虚拟机栈、...对象作为这块内存的引用,避免在Java堆中和直接内存来回复制数据,实现零拷贝,显著提高性能

    26930

    CPU内存结构

    开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 ? ?...缓存某个缓存行和主存数据的不一致,该缓存行需要在未来某个时间点回写主存,回写之后状态变为(exclusive 独享) E:(exclusive 独享)CPU缓存中的某个缓存行和主存数据一致,处于这个状态的可以被其他CPU读取内存时变成...总线锁 MESI协议之前,解决缓存一致性方案是总线锁机制,这种方案比较低效,锁期间,其他CPU无法访问内存。 CPU乱序 多核时代,处理器为提高运算速度,可能作出违背代码原有初衷的行为。...解决这种问题的方式就是内存屏障,简单点说是不同的处理器架构提供了不同指令集用来建立内存屏障,这样控制不可乱序。

    1.8K10

    JVM 内存结构

    JVM 内存结构Java 虚拟机的内存空间分为 5 个部分:程序计数器Java 虚拟机栈本地方法栈堆方法区图片JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。...分离对象或标量替换:有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在 CPU 寄存器中。...图片直接内存(堆外内存) 直接内存是除 Java 虚拟机之外的内存,但也可能被 Java 使用。操作直接内存在 NIO 中引入了一种基于通道和缓冲的 IO 方式。...直接内存与堆内存比较直接内存申请空间耗费更高的性能直接内存读取 IO 的性能要优于普通的堆内存直接内存作用链: 本地 IO -> 直接内存 -> 本地 IO堆内存作用链:本地 IO -> 直接内存 ->...非直接内存 -> 直接内存 -> 本地 IO 服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError

    16030

    JVM 内存结构

    直接内存(堆外内存) 直接内存是除 Java 虚拟机之外的内存,但也可能被 Java 使用。 操作直接内存 在 NIO 中引入了一种基于通道和缓冲的 IO 方式。...直接内存的大小不受 Java 虚拟机控制,但既然是内存,当内存不足时就会抛出 OutOfMemoryError 异常。...直接内存与堆内存比较 直接内存申请空间耗费更高的性能 直接内存读取 IO 的性能要优于普通的堆内存。...直接内存作用链:本地 IO -> 直接内存 -> 本地 IO 堆内存作用链:本地 IO -> 直接内存 -> 非直接内存 -> 直接内存 -> 本地 IO 服务器管理员在配置虚拟机参数时,会根据实际内存设置...-Xmx等参数信息,但经常忽略直接内存,使得各个内存区域总和大于物理内存限制,从而导致动态扩展时出现OutOfMemoryError异常。

    58820

    JVM 内存结构

    Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。 ? 这些区域中,一些是线程私有的,一些是线程共享的。...线程私有的:程序计数器、虚拟机栈、本地方法栈 线程共享的:堆、方法区、直接内存 1、程序计数器 一块较小的内存空间,用于标记当前线程所执行字节码的行号。...所有实例和数组都在这里分配内存,也是线程共享的内存区域。 -Xms 设置最小值;-Xmx 设置最大值。 堆内存分配会另写一篇文章介绍。...6、直接内存 直接内存并不是虚拟机内存的一部分,也不是 Java 虚拟机规范中定义的内存区域。...jdk1.4 中新加入的 NIO,引入了通道与缓冲区的 IO 方式,它可以调用 Native 方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小。

    85230

    CPU内存结构

    开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 ? ?...缓存某个缓存行和主存数据的不一致,该缓存行需要在未来某个时间点回写主存,回写之后状态变为(exclusive 独享) E:(exclusive 独享)CPU缓存中的某个缓存行和主存数据一致,处于这个状态的可以被其他CPU读取内存时变成...总线锁 MESI协议之前,解决缓存一致性方案是总线锁机制,这种方案比较低效,锁期间,其他CPU无法访问内存。 CPU乱序 多核时代,处理器为提高运算速度,可能作出违背代码原有初衷的行为。...解决这种问题的方式就是内存屏障,简单点说是不同的处理器架构提供了不同指令集用来建立内存屏障,这样控制不可乱序。

    1.2K20

    JVM之JVM运行时内存结构, JDK1.7 JVM内存结构, JDK1.8 JVM内存结构, JVM堆内存结构

    1 JDK1.7结构 1.1 JVM内存图 程序计数器: 线程私有的(每个线程都有一个自己的程序计数器), 是一个指针. 代码运行, 执行命令....方法区: 线程共享的(所有的线程共享一份), .class的信息, 类的信息, 方法的定义, 常量池, 静态变量等. 1.2 JDK1.7 堆内存结构 Young 年轻区(代) Young区被划分为三部分...PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题...JDK1.8 结构 2.1 JVM运行时内存图 JDK1.8和JDK1.7的jvm内存最大的区别是, 在1.8中方法区是由元空间(元数据区)来实现的,常量池移到堆中. 1.8不存在方法区,将方法区的实现给去掉了...元空间: 存储.class 信息, 类的信息,方法的定义,静态变量等.而常量池放到堆里存储 2.2 JDK1.8堆内存结构 由上图可以看出,jdk1.8的内存模型是由2部分组成, 年轻代+年老代.

    79210

    JVM内存结构概述

    本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍。...JVM内存结构概览 我们先看下下面这张图(这张图非常重要!非常重要!非常重要!)...栈帧是Java方法运行时的基础数据结构,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟栈中从入栈到出栈的过程(说人话就是要执行一个方法,将该方法的栈帧压入栈顶,方法执行完成其栈帧出栈)。...Java虚拟机栈的结构如下图所示:Java虚拟机栈的生命周期与线程一致,一个方法对应一块栈帧内存区域,栈帧中包含局部变量表、操作数栈、动态链接、方法出口等信息。...关于JVM的内存结构本节先做了一个大概的介绍,其中还有很多细节没有介绍:栈帧中的各个组成部分分别是干什么用的,堆内存的划分,对象是如果从新生代到老年代的,为什么要分代收集,垃圾收集算法有哪些,垃圾收集器有哪些

    24620

    JVM 内存结构解析

    JVM内存结构 (1) JDK1.7的JVM内存结构 ? JVM内存结构主要有三大块:堆内存、方法区和栈。...方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆) 栈又分为java虚拟机栈和本地方法栈主要用于方法的执行 (2) JDK1.8以后的JVM内存结构...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。...因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。...虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。

    1.5K20

    JVM内存结构详解

    文章目录 一、你了解JVM内存结构吗 在这之前需要知道 JVM内存结构图——JDK1.8 1.1、程序计数器 1.2、虚拟机栈(JVM Stack) 1.1.1、java.lang.StackOverflowError...——内存分配策略 需要先了解 区别 四、元空间、堆、线程独占部分间的联系——内存角度 五、不同JDK版本之间的intern()方法的区别——JDK6 VS JDK6+ 一、你了解JVM内存结构吗 在这之前需要知道...内存寻址过程 地址空间划分 内核空间是用于连接硬件,调度程序联网等服务 用户空间,才是java运行的系统空间 我们知道JVM是内存中的虚拟机,主要使用内存进行存储,所有类、类型、方法,都是在内存中...JVM内存结构图——JDK1.8 线程私有:程序计数器、虚拟机栈、本地方法栈 线程共享:MetaSpace、Java堆 下面我们会对图中五个部分进行详细说明 1.1、程序计数器 当前线程所执行的字节码行号指示器...堆存储的是数组和对象,存储结构复杂,所需空间更多,哪怕是实体中的一个属性数据消失,这个实体也不会消失。

    38720
    领券