这是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. No module named cv2 报错处理

    运行python脚本出现“No module named cv2 ”,这时我们安装下opencv-python依赖即可 python3 -m pip install opencv-python

  2. UML-对象设计要迭代和进化式

    1.在<如何面向对象设计>和<如何进行对象设计?>中,对如何迭代和进化式的设计对象做些总结: 1).轻量+简短 2).快速进入编码+测试 3).不要试图在UML中细化所有事物 ...

  3. 寒假day11

    毕设数据抽取部分还有一点问题,正在修改中

  4. ccs-基础-阴影

    1.html代码 <div class="demo demo1">假如生活欺骗了你</div> <div class="demo demo2 ...

  5. 计算机ASCII码对照表

    ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ! 65 A 97 a 2 ST ...

  6. catalina.out日志膨胀问题解决实例,日志门面commons-logging的实践

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 笔者在公司的时候,遇到一个问题,2个模块A.B Tomcat中的catalina.out及catalina ...

  7. Maven--传递性依赖和依赖范围

    依赖范围不仅可以控制依赖与三种 classpath 的关系,还对传递性依赖产生影响. 假设 A 依赖于 B,B依赖于 C,我们说 A 对于 B 是第一直接依赖,B 对于 C 是第二直接依赖,A 对于 ...

  8. protobuf使用遇到的坑

    在这里具体的使用我不写了,可以参考下面接个连接,我只记录自己遇到的问题. https://www.cnblogs.com/autyinjing/p/6495103.html(此博客很详细,不过最好不要 ...

  9. C++ 进程和匿名管道使用学习

    平台 Windows10 + VS2015 学习内容 进程的创建使用(CreateProcess方式) 父子进程间匿名管道通信 相关函数及参数介绍 CreatePipe函数:该的原型为 CreateP ...

  10. 吴裕雄--天生自然TensorFlow高层封装:解决ValueError: Invalid backend. Missing required entry : placeholder

    找到对应的keras配置文件keras.json 将里面的内容修改为以下就可以了