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

JVM: JVM 内存划分

如果你使用 Java 语言去开发,你就会发现大多数情况下你不用去关心无用对象的回收与内存的管理,因为这一切 JVM 虚拟机已经帮我们做好了。...了解 JVM 内存的各个区域将有助于我们深入了解它的管理机制,避免出现内存相关的问题和高效的解决问题。...直接内存 直接内存并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区域,但是却是NIO 操作时会直接使用的一块内存,虽然不受虚拟机参数限制,但是还是会受到本机总内存的限制,会抛出...它也是 JVM 垃圾回收作用的区域。...TLAB:为每一个线程预先在 Eden 分配一块内存JVM 在给线程中的对象分配内存时,首先在 TLAB 分配,如果不够,使用 CAS 进行分配。

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

    JVM 彻底搞懂JVM内存区域及直接内存

    B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1rg411v7rw 面试题:直接内存会导致OOM么?...本地方法栈 本地方法栈和虚拟机方法栈作用类似,不过它是为执行native方法服务 堆 堆是被线程共享的一个内存区域,大部分对象都在堆上分配,少部分允许在栈上分配(通过逃逸分析)。...方法区 方法区也是一块内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。也包括运行时常量池。...jdk8以前主要通过永久代实现方法区 jdk8开始 通过元空间实现方法区 通过本地内存实现 直接内存 直接内存和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理...传统BIO 访问 直接内存访问

    80020

    JVM内存模型之直接内存

    直接内存 又称堆外内存,也就是说这不是jvm运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但这部分也会被频繁的使用,而且也可能导致OOM。 堆外内存有什么优点呢?...1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作 2 可以提高性能,避免java堆和native堆(直接内存)来回复制数据。...使用场景 1.在JDK1.4之后加入了NIO,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native库函数直接分配堆外内存,然后通过DirectByteBuffer对象作为这块内存的引用来进行操作...,jvm会自动对这部分的堆外内存进行回收。...2.使用jdk内部未对外公开的unsafe来直接使用堆外内存,但不会被JVM回收 例子 /** * Created by shengjk1 on 2017/8/8 * 会自动回收的 */ //-verbose

    68630

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

    1 JDK1.7结构 1.1 JVM内存图 程序计数器: 线程私有的(每个线程都有一个自己的程序计数器), 是一个指针. 代码运行, 执行命令....在Eden区间变满的时候, GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到Tenured区间。...Perm 永久区 Perm代主要保存class,method,filed对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMemoryError...PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题...JDK1.8 结构 2.1 JVM运行时内存图 JDK1.8和JDK1.7的jvm内存最大的区别是, 在1.8中方法区是由元空间(元数据区)来实现的,常量池移到堆中. 1.8不存在方法区,将方法区的实现给去掉了

    80510

    JVM内存区域

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

    99140

    Jvm内存划分

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

    62420

    JVM内存区域】

    博主:java_wxid 社区:幕后大佬 @TOC 本文的大概内容: JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 与Buffer 的 IO 方式, 它可以使用 Native函数库直接分配堆外内存...由于现代JVM采用分代收集算法, 因此 Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。...方法区/永久代(线程共享) 永久代(Permanent Generation), 用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    75110

    JVM内存结构

    **主要结构:**堆内存、方法区、栈(说明:基于JDK1.7) 堆内存JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor...空间,默认情况下年轻代按照8:1:1的比例来分配; 方法区存储类信息、常量、静态变量等数据,是线程共享的区域,为与Java堆区分,方法区还有一个别名Non-Heap(非堆); 栈又分为java虚拟机栈和本地方法栈主要用于方法的执行...参数设置: -Xms:设置在JVM启动时的堆内存初始大小; -Xmx:设置堆区允许的最大内存 如果堆区内存超过-Xmx设置大小,则抛出OutOfMemoryError异常。...七、直接内存 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规 范中定义的内存区域。...服务器管理员在配置虚拟机参数时,会根据实际内存设置-Xmx等参数信息,但经常忽略 直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制), 从而导致动态扩展时出现OutOfMemoryError

    28820

    JVM内存区域

    JVM内存区域 数据区域 ?...此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError内存溢出情况的区域。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。...为对象分配空间的任务等同于把一块确定大小的内存从堆中划分出来 指针碰撞:假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离...,并更新列表上的记录,这种分配方式称为“空闲列表”; 并发创建对象(非线程安全) 方案1:对分配内存空间的动作进行同步处理--实际上JVM采用CAS配上失败重试的方式保证更新操作的原子性 方案

    1.1K30

    JVM内存模型

    前一段时间写过一篇关于 JVM虚拟机之类加载的过程 的文章,其中讲述了Java虚拟机对类的处理。...最近听了一次部门内部有关JVM的分享,自己也顺便回顾了之前阅读《深入理解JVM虚拟机》一书中所讲述的Java虚拟机对内存的管理,再次将自己理解的JVM内存模型分享给大家。...Java运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区。...JVM内存模型 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 ? java-memory-model 程序计数器 当前线程所执行的字节码文件的行号指示器。...及之后版本的JVM已经将运行时常量池从方法区中移了出来,在Java 堆(Heap)中开辟了一块区域存放运行时常量池。

    36530

    JVM内存模型

    无论底层操作系统/硬件是大端还是小端,每个 JVM 都以大端顺序(高字节在前)存储和使用内存中的数据。 注意:有时,JVM 实现的行为与另一个不同,但通常是相同的。...为了避免磁盘 I/O,字节码由运行时数据区域之一中的类加载器加载到 JVM。这段代码一直保留在内存中,直到 JVM 停止或类加载器(加载它的)被销毁。 加载的代码然后由执行引擎**解释**和执行。...桌面/服务器 (x86) 处理器和以前的 android 虚拟机 Dalvik 使用这种基于寄存器的架构。 字节码 由于 JVM 解释字节码,因此在深入之前了解它是有用的。...换句话说,当一个类、方法或字段被引用时,JVM 通过运行时常量池在内存中搜索实际地址。它还包含常量值,如字符串文字或常量原语。...关于JVM内存模型,你学废了么?

    81040

    JVM内存区域

    简介 JVM虚拟机,也就是虚拟的计算机,它有自己虚拟的CPU、虚拟的内存等等,当然还有大名鼎鼎的垃圾回收器。第一篇我们来讲解一下JVM的虚拟内存。...Java运行时内存区域 Java虚拟机在启动时会根据JVM参数向操作系统申请内存,并将申请到的内存划分为不同的区域。...JVM内存区域包含以下几个运行时数据区(图摘自深入理解JAVA虚拟机第三版)。...堆是JVM中最大的一块内存空间,也是最容易发生OOM的内存空间。我们常说的垃圾回收器就是用来管理堆的,而垃圾回收器的算法又与JVM的响应时间和吞吐量密切相关,可以说堆是JVM中最重要的一块内存区。...直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数时,会根据实际内存去设置

    94900

    JVM内存模型

    # JVM JDK版本:1.8 # 1、JVM内存区域 JVM在执行应用程序的过程中会将它管理的内存分为若干个不同的区域。其中一部分是线程私有的,一部分是线程共享的。...Java内存区域也叫做运行时数据区。JVM内存内存结果如下图所示: ---- # 2、Java代码执行流程 Java源码文件通过Java编译器生成字节码文件。...---- # 3、JVM的架构模型 Java编译器输入的指令流一种是基于栈的指令架构,另外一种指令集架构则是寄存器的指令集架构。...---- # 5、JVM内存架构 方法区:存放常量信息,类信息,方法信息。 LV(Local Variables):局部变量表。 OS(Operand Stack):操作数栈。...JVM的笔记,鉴于本人技术有限,文中难免出现一些错误,感谢大家批评指正。

    24710

    JVM内存管理

    一:  首先弄明白两个概念:物理内存和虚拟内存   物理内存:通常所说的RAM(随机存储器),有一个存储单元寄存器,存储计算单元执行指令的中间结果。...物理内存是真实存在的,例如:内存条   虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘被称作交换空间。虚拟内存保证多个线程同时执行时可以共享同一块物理内存。...三:内部溢出和内存泄漏   内部溢出:程序再申请内存时,如果没有足够的内存空间,就会抛出out of memory          内存泄漏:  应该被垃圾回收的对象,却没有被回收,导致内存空间被浪费...内存泄漏可能导致内存溢出。   ...检查代码,找出可能发生内存溢出的代码,就行修改        四:JVM内存分配策略   静态内存分布:在编译时就可以确定对象需要的空间大小,在编译的过程中就一次性分配内存空间,        堆内存分布

    49730

    jvm内存结构

    JVM内存结构概览 先来看一张图: jvm主要分,堆、方法区、java栈、本地方法栈、程序计数器五个区域,其中方法区和堆区是线程共享的 堆区域 堆内存JVM中最大的一块由新生代和老年代组成,而新生代内存又被分成三部分...JVM会随意选取一个Survivor作为to区域,然后会在GC过程中,将Eden中存活下来的对象和from中的对象拷贝到to这个区域, 防止内存碎片化,进一步清理无用对象 对Eden区域继续划分, Hotspot...GC,这将导致遍历整个Java堆,这称为提升失败(Promotion Failure) 堆参数设置 -Xmx: 最大堆体积 -Xms: 最小堆体积 -XX:NewRatio=value 老年代和新生代的比例...(默认是2,即新生代是堆区域的 1/3) -XX:XX:SurvivorRatio=value 新生代 eden 和 survivor 的比例,默认是8,也就是说 eden 是 from 或 to 的8...] JVM自动内存管理机制 Java永久代去哪儿了

    84620

    JVM 内存结构

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

    47920

    jvm内存泄漏

    内存泄漏和内存溢出的关系 内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。...内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。...从定义上可以看出内存泄露是内存溢出的一种诱因,但是不是唯一因素。...可以使用Runtime.getRuntime().freeMemory()进行内存泄漏查询 Runtime.getRuntime().freeMemory()表示当前还有多少空闲内存 package com.one.util...所以我们经常在网上看到在连接调用结束的时候要进行调用close()进行关闭,这样可以回收不用的内存对象,增加可用内存

    1.5K20
    领券