这是jdk7以后的版本

  1. Heap(堆区)

  Heap OOM 障最主要的发源地, 它存储着几乎所有的实例对象, 堆由垃圾收集器自动回收, 堆区由各子线程共享使用。通常情况下 它占用的空间是所有内存 区域中最大的,但如     果无节制地创建大量对象,也容易消耗完所有的空间。堆的内存 空间既可以固定大小, 也可以在运行时动态地调整,通过如下参数设定初始值和最大值,比如 -Xms256M                  -Xmxl024M ,其中 -X 表示它是 JVM 运行参数, ms是 memory start 的简称, mx是 memory max 的简称,分别代表最小堆容量和最大堆容量。但是 在通常情况下,服务器在运        行过程中,堆空间不断地扩容与回缩,势必形成不必要的系统压力, 所以在线上生产环境中 JVM ms mx 设置成 样大小,避免在GC 后调整堆大小时带来的额外压力。

    堆分成两大块 新生代和老年代。对象产生之初在新生代 步入暮年时进入老年代,
     但是老年代也接纳在新生代无法容纳的超大对象。新生代= 1个 Eden区+2个Survivor区。
     绝大部分对象在 Eden 区生成,当Eden区装填满的时候,会触发 Young
    Garbage Collection 即YGC 。垃圾回收的时候,在Eden 区实现清除策略, 没有被引用的对象则直接回收。
   依然存活的对象会被移送到 Survivor区,这个区真是名副其实的存在。 Survivor 区分为 so和Sl两块内存空间,
   送到哪块空间呢?每次 YGC的时候,
  全清除 交换两块空间的使用状态。如果 YGC 要移送的对象大于 Survivor 区容量的上限 ,则直接移交给老年代。假如一些没有进取心的对象以为可以一直在新生代的
  Survivor 区交换来交换去,那就错了。每个对象都有 个计数器,每次 YGC 都会加1。-XX:MaxTenuringThreshold 参数能配置计数器的值到达某个阐值的时候 对象从
   新生 晋升至老年代。如果该参数配置为 ,那么从新生代的 Eden 区直接移至老年代。

看一下直观的流程图

如果 Survivor 区无法放下,或者超大对象的闹值超过上限,则 尝试在老年代中进行分配 如果老年代也无法放下,贝lj 会触发 Full Garbage Collection,

即FGC。如果依然无法放下, 则抛出 OOM。堆内存出现 OOM 的概率是所有内存耗尽异常中最高的。出错时的堆内信息对解决问题非常有帮助 所以给 NM 设置运行参

数 -XX:+HeapDumpOnOutOfMemoryError ,让口瓜 遇到 OOM 异常时能输出堆内信息,特别是对相隔数月才出现的 OOM 异常尤为重要。

在不同的 NM 实现及不同的回收机制中 堆内存的划分方式是不一样的。

2. Metaspace (元空间)

早 在JDK8  版本中,无空间的前身 Perm 区已经被淘汰。在 JDK7 及之前的版本中,只有 Hotspot 才有 Perm 区(在方法区内),译为永久代 它在启动时固定大小,很难进行调优,并且  FGC 时会移动类无信息。在某些场景下,如果动态加载类过多,容易产生 Perm 区的 OOM。比如某个实际 We 工程中,因为功能点比较多,在运行过程中,要不断动态加载 很多的类,经常出现致命错误。

"exception in thread 'dubbo client x.x connector' java.lang.OutO emoryE or PennGen space"

为了解决该问题 需要设定运行参数 XX: MaxPermSize= 1280m ,如果部署到新机器上,往往会因为 NM 参数没有修改导致故障再现。不熟悉此应用的人排查问题时往往苦不堪 言,除此之外,永久代在垃圾回收过程中还存在诸多问题。所以, JDK8 使用元空间替换永久代。在 JDK8 及以上版本中,设定 MaxPermSize数, NM 在启动时并不会报锚,但是会提示 Java HotSpot 64Bit Server VM warning: ignoring option MaxPem1Size=2560m; support was removed i11 8.0。

区别于永久代 元空间在本地内存中分配。在 JDK8 里, Perm区中的所有 内容中字符串常量移至堆内存,其他内容包括类元信息、字段、静态属性、方法、常量等都移动至无空间    内, 中的 Object 元信息、静态属性 System.out 、整型常量 10000000 等。图 4-10 中显示在常量池中的 trir毡, 其实际对象是被保存在堆内存中的。

JVM 的内存布局的更多相关文章

  1. JVM的内存布局

    JVM的内存布局包括,其中: Java虚拟机在执行Java程序的过程中会把它所管理的内存(线程相关?)划分为若干个不同的数据区域.有些区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结 ...

  2. JVM(二)JVM内存布局

    这几天我再次阅读了<深入理解Java虚拟机>之第二章"Java内存区域与内存溢出异常",同时也参考了一些网上的资料,现在把自己的一些认识和体会记录一下.  (本文为博主 ...

  3. 基础篇:JVM运行时内存布局

    目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...

  4. 深入理解Java虚拟机之JVM内存布局篇

    内存布局**** ​ JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的稳定高效运行.不同的JVM对于内存的划分方式和管理机制存在部分差异.结合JVM虚拟机规范,一起来 ...

  5. JVM——深入分析对象的内存布局

    概述 一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的.Class本身就是一个对象,都以KB为单位,如果new Integer()为了表示一个数据就占用KB级别的内 ...

  6. jvm学习记录-对象的创建、对象的内存布局、对象的访问定位

    简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...

  7. 【深入理解JVM】:Java对象的创建、内存布局、访问定位

    对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...

  8. JVM内存布局及GC知识回顾

    注:本文篇幅较长,且需要有一定的java基础,建议各位看官,备好瓜子.饮料.小板凳,摆个让自己舒服的姿势,慢慢细看^_^, 文中所有素材,均来自互联网,本人只是详细梳理了一遍,形成此文. 一.JVM运 ...

  9. 99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?

    本文转载自公众号:石彬的架构笔记,阅读大约需要8分钟. 作者:李瑞杰 目前就职于阿里巴巴,资深 JVM 研究人员 在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我 ...

随机推荐

  1. Jetson TX2入门学习之Ubuntu默认密码

    在使用TX2开发板时进行软件更新时需要身份验证,TX2默认有两个登录身份,一个是ubuntu 一个是nvidia 登录其中的哪一个都可以更新   两个身份的密码和登录名是一样的用户:ubuntu 密码 ...

  2. mysql字符集配置&mysql中文乱码

    问题描述 这两天重置了下自己的电脑系统,一个ubuntu,另外一个当然就是windows. 不过在运行程序的时候发现,出现了很多的"????",也就是乱码字符.毫无疑问,这定然是m ...

  3. D10 基本数据类型(各种职业的技能分析) 主要为 int 和 str

    在python中具有魔法的  职业  类型 召唤每种职业  在pychar 中 打出该职业的名称 按住Ctrl 光标在该职业名称上 点击就能看该职业的技能 1   数字   int a = " ...

  4. 3.react 基础 - JSX 语法

    1.最基础的 JSX 语法 普通javaScript中 引入 标签 let html = '<h1>hello</h1>'; jsx语法 let JSX_html = < ...

  5. 刷题33. Search in Rotated Sorted Array

    一.题目说明 这个题目是33. Search in Rotated Sorted Array,说的是在一个"扭转"的有序列表中,查找一个元素,时间复杂度O(logn). 二.我的解 ...

  6. Linux 下载安装

    安装教程:https://www.runoob.com/linux/linux-install.html Linux图形界面与命令行界面切换https://blog.csdn.net/ab522628 ...

  7. Python dict 和 list 转换

    这里有个dict d1 = { 'en':'英语', 'cn':'中文', 'fr':'法语', 'jp':'日语' } 使用d1.keys()或 d1.values() 可以提取出values 和k ...

  8. win10 python 3.7 pip install tensorflow

    环境: ide:pyCharm 2018.3.2 pyhton3.7 os:win10 64bit 步骤: 1.确认你的python有没有装pip,有则直接跳2.无则cmd到python安装目录下ea ...

  9. Django专题之ORM

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  10. JVM学习思维导图