在JVM虚拟机中,内存部分大致可以分为以下几类:

  • Heap:堆
  • NonHeap:非堆
  • CodeCache:缓存编辑后的机器码的内存区域
  • CompressedClassSpace:类压缩空间
  • MetaSpace:元空间(其实就是永久代,1.7之前叫永久代,1.8之后叫元空间)
  • HeapedEnSpace:Eden区
  • HeapOldGen:老年代
  • HeapSurvivorSpace:S0和S1区
  • Direct:直接内存

贴上示意图:

这张图其实画的有些不对,在Heap区,Old和Young的比例应该是2:1,然后Eden和S0、S1的比例应该是8:1:1。

接下来主要来讨论下新生代,老年代和元空间(永久代)。

1. 新生代

新生代有Eden、From、To区域(From、To即S0、S1区域)。

Eden主要用于存放新创建的对象,它会在第一次GC发生时,将对其内部的存活的对象放入到From或者To区域。

From和To区域都是Survivor区域,主要用于GC时,在对象复制时提供作用(复制算法),以及承担新生代和老年代之间的缓冲作用。

也就是说,对于整个新生代而言,会发生频繁的GC操作(Young GC)。

2. 老年代

有以下几种情况,可以使对象进入到老年代中:

  1. 大对象:指一个占用大量连续存储空间的对象

  2. 生命周期较长的对象

    新生代中的每个对象都有一个年龄计数器,当新生代发生一次MinorGC后,存活下来的对象的年龄就加一,当年龄超过一定值时,就将超过该值的所有对象转移到老年代中去。

  3. 相同年龄的对象内存超过Survior内存一半的对象

    如果当前新生代的Survior中,年龄相同的对象的内存空间总和超过了Survior内存空间的一半,那么所有年龄相同的对象和超过该年龄的对象都被转移到老年代中去。无需等到对象的年龄超过MaxTenuringThreshold才被转移到老年代中去。

Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。老年代如果频繁GC,那肯定是存在问题,需要去排查。

3. 元空间

JDK1.8和1.7最大的区别就是:元空间取代了永久代(在1.7的时候,常量池从永久代移至了堆空间中)。

元空间本质和永久代类似,都是对方法区的实现,两者的区别在于:元空间并不在虚拟机中,而是使用本地内存。所以此时的JVM运行时内存区域应该是这样的(摘自别人的图):

JVM虚拟机 - 内存的更多相关文章

  1. 设置TOMCAT的JVM虚拟机内存大小

    你知道如何设置TOMCAT的JVM虚拟机内存大小吗,这里和大家分享一下,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 设置 ...

  2. JVM 虚拟机内存深入探究

    [<深入理解java虚拟机>-整理笔记] by  lijun JVM虚拟机内存逻辑模型: 方法区(全局变量 静态数据 常量等) 线程共享 堆栈区(对象实例 数组数据 new generat ...

  3. java中JVM虚拟机内存模型详细说明

    java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03|  分类: JAVA |  标签:java  jvm  堆内存  虚拟机  |举报|字号 订阅     JVM的内部结构 ...

  4. jvm 虚拟机内存模型

    来源:https://blog.csdn.net/A_zhenzhen/article/details/77917991?locationNum=8&fps=1    https://blog ...

  5. 面试官:别的我不管,这个JVM虚拟机内存模型你必须知道

    前言 说jvm的内存模型前先了解一下物理计算机的内存处理. 物理计算器上用户磁盘和cpu的交互,由于cpu读写速度速度远远大于磁盘的读写速度速度,所以有了内存(高速缓存区).但是随着cpu的发展,内存 ...

  6. JVM 虚拟机 内存说明

    Java虚拟机所管理的内存图: 1程序计数器: 该模块作用是记录线程执行字节码的位置,记录程序执行状态,以便该线程下次获得CPU时继续执行.程序里的每个线程程序计数器相互独立,互不影响,该内存区也称“ ...

  7. JVM虚拟机内存模型以及GC机制

    JAVA堆的描述如下: 内存由 Perm 和 Heap 组成. 其中 Heap = {Old + NEW = { Eden , from, to } } JVM内存模型中分两大块,一块是 NEW Ge ...

  8. JVM虚拟机内存溢出垃圾收集及类加载机制总结

    1.Java内存区域与内存溢出异常 虚拟机栈:为虚拟机执行Java方法服务 本地方法栈:为虚拟机使用到的native方法服务. Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一 ...

  9. 对jvm虚拟机 内存溢出的思考

    java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间

随机推荐

  1. Structuring Machine Learning Projects 笔记

    1 Machine Learning strategy 1.1 为什么有机器学习调节策略 当你的机器学习系统的性能不佳时,你会想到许多改进的方法.但是选择错误的方向进行改进,会使你花费大量的时间,但是 ...

  2. PullToRefresh------ListView的使用

    第一步 :写出布局文件的设置 <com.handmark.pulltorefresh.library.PullToRefreshListView android:id="@+id/pu ...

  3. service使用handler与Activity沟通的两种方法

    通过之前的学习,我们知道了在主线程中声明一个handler实例并实现了消息的处理方法之后,我可以在子线程中用此实例向主线程发消息,在处理方法中获取消息并更新UI. 那么,如果我们想用handler在s ...

  4. 使用LookAndFeel为界面更换皮肤

    ----------------siwuxie095                             在 Windows 系统中,默认的 Java 运行环境(JRE)会为当前的窗体程序 指定一 ...

  5. HTML5新增的结构元素

    HTML5的结构 一:新增的主体结构元素 在HTML5中,为了使文档的结构更加清晰明确,追加了几个与页眉,页脚内容区块等文档结构相关联的结构元素. 1.1article元素 article元素代表文档 ...

  6. 怎么查看Eclipse的版本信息

    工具/原料   Eclipse版本信息查看 第一种方法   1 找到Eclipse的解压目录就是你的Eclipse.exe 所在的目录 2 找到 .eclipseproduct 文件双击打开 3 如图 ...

  7. 《鸟哥的Linux私房菜》读书笔记5

    1.shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了; 2.shell script 其实就是纯文字文件 (ASCII) ,我们可以编辑这个档案, ...

  8. hdu1054

    /* [题意] 给定一棵树,标记一节点,则与该节点所连的边都被标记,问最少需要标记多少个节点使得所有边都被标记: 或者说给定一个树型城堡,在交叉路口放一个士兵,则与该路口相连的路都被守住, 问最少需要 ...

  9. Object—C 块在函数中作为参数时的分析

    暂时对这个有了一些粗浅的理解,记下来一边后面学习时学习,改正. 先举个例子: A类: .h文件: @interface A  : NSObject - (void)Paly1:(void (^)(do ...

  10. .net core 中的配置文件

    前言     在 .NET Core 项目中,配置文件有着举足轻重的地位:与.NetFramework 不同的是,.NET Core 的配置文件都以 .json 结尾,这表示一个标准的 json 格式 ...