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 语句之外,我 ...
随机推荐
- vim里设置tab及自动换行
今天在使用vim编辑器时发现默认的tab键是8个字符,于是就想到把它设为四个空格,经过百度,得到了以下方法: 首先进入~/.vimrc 然后在文档末尾加上以下代码: set tabstop=4 ...
- UML-什么是用例实现(场景实现)?
1.总览图 解释: 用例--->领域模型 用例+领域模型--->设计模型(仅基于领域层的交互图) 2.什么是用例实现? 基于协作对象,如何在设计模型中实现某个用例.更确切的说是实现某个用例 ...
- codeblocks无法找到编译器问题的三个原因
出现如下提示: 查看了网上的资料, 1.编译器选择错误 查看路径:setting→compiler Selected compiler选取你已经安装且准备使用的编译器. 2.工程创建时配置错误 查看路 ...
- Jetson TX2入门学习之Ubuntu默认密码
在使用TX2开发板时进行软件更新时需要身份验证,TX2默认有两个登录身份,一个是ubuntu 一个是nvidia 登录其中的哪一个都可以更新 两个身份的密码和登录名是一样的用户:ubuntu 密码 ...
- 2019杭电暑假多校训练 第六场 Snowy Smile HDU - 6638
很多题解都是简单带过,所以打算自己写一篇,顺便也加深自己理解 前置知识:线段树.线段树维护最大字段和.二维坐标离散化 题解: 1.很容易想到我们需要枚举所有子矩阵来得到一个最大子矩阵,所以我们的任务是 ...
- Aras Innovator客户端批量下载关联文件
<button onclick="btnDownload();" id="downfilebtn">批量下载关联文件</button> ...
- Win 10 Ctrl + Space 冲突
1. 说明 在IDE里面Ctrl + space 会与 Windows 输入法相互冲突,并且用Ctrl + Space 切换中英文也很不常用(常用直接shift切换). 2. 操作 控制面板——时钟. ...
- iOS 添加view的分类(更加方便的设置view的位置)
点击创建UIView的分类category,这里命名为 PLExtension(为了和下面对应) view分类.h文件 #import <UIKit/UIKit.h> @interface ...
- MyBatis从入门到精通(第4章):MyBatis动态SQL【if、choose 和 where、set、trim】
(第4章):MyBatis动态SQL[if.choose 和 where.set.trim] MyBatis 的强大特性之一便是它的动态 SQL.MyBatis 3.4.6版本采用了功能强大的OGNL ...
- [原]CreateFile中的dwShareMode
原 总结 API 一直对CreateFile的参数dwDesiredAccess和dwShareMode有什么不同不是很清楚,今天重读 windows核心编程的时候终于豁然开朗了. 真是书读百遍,其 ...