JVM 的内存布局

这是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 的内存布局的更多相关文章
- JVM的内存布局
JVM的内存布局包括,其中: Java虚拟机在执行Java程序的过程中会把它所管理的内存(线程相关?)划分为若干个不同的数据区域.有些区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结 ...
- JVM(二)JVM内存布局
这几天我再次阅读了<深入理解Java虚拟机>之第二章"Java内存区域与内存溢出异常",同时也参考了一些网上的资料,现在把自己的一些认识和体会记录一下. (本文为博主 ...
- 基础篇:JVM运行时内存布局
目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...
- 深入理解Java虚拟机之JVM内存布局篇
内存布局**** JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的稳定高效运行.不同的JVM对于内存的划分方式和管理机制存在部分差异.结合JVM虚拟机规范,一起来 ...
- JVM——深入分析对象的内存布局
概述 一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的.Class本身就是一个对象,都以KB为单位,如果new Integer()为了表示一个数据就占用KB级别的内 ...
- jvm学习记录-对象的创建、对象的内存布局、对象的访问定位
简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...
- 【深入理解JVM】:Java对象的创建、内存布局、访问定位
对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...
- JVM内存布局及GC知识回顾
注:本文篇幅较长,且需要有一定的java基础,建议各位看官,备好瓜子.饮料.小板凳,摆个让自己舒服的姿势,慢慢细看^_^, 文中所有素材,均来自互联网,本人只是详细梳理了一遍,形成此文. 一.JVM运 ...
- 99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?
本文转载自公众号:石彬的架构笔记,阅读大约需要8分钟. 作者:李瑞杰 目前就职于阿里巴巴,资深 JVM 研究人员 在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我 ...
随机推荐
- 吴裕雄--天生自然 JAVASCRIPT开发学习: 闭包
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- tableau 和 R 的连接
1.安装R包Rserve 2.tableau帮助-管理外部服务连接,单击测试按钮出现成功连接即是通信成功. 3.创建新工作表,设置id字段,针对id记录数创建计算字段Rrand.将Rrand拖入行维度 ...
- awk 中 RS,ORS,FS,OFS 区别与联系
一,RS与ORS 1,RS是记录分隔符,默认的分隔符是\n,具体用法看下 [root@krlcgcms01 mytest]# cat test1 //测试文件 111 222 333 444 ...
- 关于图算法 & 图分析的基础知识概览
网址:https://learning.oreilly.com/library/view/graph-algorithms-/9781492060116/ 你肯定没有读过这本书,因为这本书的发布日期是 ...
- Json返回结果为null属性不显示解决
import java.io.IOException; import org.springframework.boot.autoconfigure.condition.ConditionalOnMis ...
- LINUX的ssh免密码配置
本篇将介绍LINUX的ssh免密码配置. 本篇中的有三台主机: 192.168.1.110 master.com.cn 主机192.168.1.111 salver1.com.cn192.168.1 ...
- Struts 2的流程
Struts 2的流程 一.Struts 2 的开发步骤: 在web.xml中定义核心的Filter来拦截用户的请求. 由于Web应用时基于请求/响应架构的应用,所以不管哪个MVC Web框架,都需要 ...
- c#学习笔记05——数组&集合
数组 声明数组 .一维数组的定义: 数据类型[] 数组名=new 数据类型[大小]; eg: ]; ,,,,}; ]; .多维数组的定义 ,];//定义二维数组 ,,];//定义三维数组 多维数组可以 ...
- Methyl-SeqDNA的甲基化图谱|DNase I-Seq|ChIP-Seq|3C-Seq|
生物医学大数据 Methyl-SeqDNA的甲基化图谱 DNase I-Seq全基因组染色质DNA的开放程度.非基因编码区的调控元件的分布 DNase I高敏感位点:基因处于转录活性状态时,其染色质结 ...
- CSP模拟赛游记
时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...