Java内存区域与内存溢出异常

运行时数据区域

程序计数器当前线程所执行的字节码的行号指示器

当前线程私有

不会出现OutOfMemoryError情况

java虚拟机栈线程私有,生命周期与线程相同

java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧,存储局部变量表(基本类型、对象引用)、操作数栈、动态链接、方法出口等信息

StackOverflowError异常:当线程请求的栈深度大于虚拟机所允许的深度

OutOfMemoryError异常:如果栈的扩展时无法申请到足够的内存

本地方法栈

与虚拟机栈相似,主要为虚拟机使用到的Native方法服务,在HotSpot虚拟机中直接把本地方法栈与虚拟机栈二合一

Java堆(Java Heap)

java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此区域的唯一目的就是存储对象实例。java堆是垃圾收集器管理的主要区域。java堆还可以细分为:新生代与老年代。在细一点有Eden空间、Form Survivor空间、To Survivor空间等。

可以通过-Xmx和-Xms控制堆的大小

OutOfMemoryError异常:当在堆中没有内存完成实例分配,且堆也无法再扩展时。

方法区线程间共享

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

OutOfMemoryError异常:当方法区无法满足内存的分配需求时

运行时常量池方法区的一部分

用于存放编译期生成的各种字面量与符号引用

OutOfMemoryError异常:当常量池无法再申请到内存时

直接内存NIO可以使用Native函数库直接分配堆外内存,堆中的DirectByteBuffer对象作为这块内存的引用进行操作

大小不受Java堆大小的限制,受本机(服务器)内存限制

OutOfMemoryError异常:系统内存不足时

HotSpot虚拟机

对象的创建

虚拟机遇到一条new指令时,首先将去检查这个对象的参数是否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,必须先执行类的加载过程。

在类加载检查通过后,虚拟机将为新生对象分配内存。对象所需内存大小再类加载完成后便可确定。内存分配可以采用“指针碰撞”与“空闲列表”的方式。

对象的访问定位

java程序需要通过栈上的reference数据来操作堆上的具体对象。访问方式有使用句柄和直接指针两种。

句柄访问 java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息

直接指针访问 java堆对象的布局中必须考虑如何放置访问类型数据的相关信息,reference中存储的就是对象地址

OOM异常的解决思路

生成Dump快照文件:

通过jvm参数—XX:-HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出是Dump出当前的内存转储快照

用jmap生产dump文件,win通过任务管理器查看tomcat的进程pid,linux用ps命令查看进程pid,然后用jmap命令

先通过内存映像分析工具(如Eclipse的Memory Analyzer)进行分析,常见的情况有:

内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;

内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。

OOM异常示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22package oom;

import java.util.ArrayList;

import java.util.List;

/**

* VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

* @ClassName: HeapOOM

*

*/

public class HeapOOM {

static class OOMObject{

}

public static void main(String[] args) {

List list = new ArrayList();

while(true){

list.add(new OOMObject());

}

}

}

参考

《深入理解java虚拟机 JVM高级特性与最佳实践》

捐赠

如何觉得本文章对你有帮助,欢迎捐赠

java heap 内存_深入理解jvm之内存区域与内存溢出相关推荐

  1. java 句柄池_深入理解JVM之Java对象的创建、内存布局、访问定位详解

    本文实例讲述了深入理解JVM之Java对象的创建.内存布局.访问定位.分享给大家供大家参考,具体如下: 对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含 ...

  2. linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)

    本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...

  3. 内存详解-理解 JVM 如何使用 Windows 和 Linux 上的本机内存

    内存详解 理解 JVM 如何使用 Windows 和 Linux 上的本机内存 Java™ 堆耗尽并不是造成 java.lang.OutOfMemoryError 的惟一原因.如果本机内存 耗尽,则会 ...

  4. java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践

    本文转自: https://juejin.im/post/59e6c1f26fb9a0451c397a8c 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...

  5. 怎么把虚拟机清空内存_深入理解java虚拟机1——内存管理机制与回收机制

    文中涉及JVM底层知识大多来自<深入理解Java虚拟机>第2版,内容枯燥乏味,如果看,认真看.跟着撸一遍也可以受益良多. 1.JVM:是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  6. jvm对于java的意义_谈谈对JVM的理解

    JVM可谓是学习JAVA基础中的基础了,但仍有不少同学对JVM概念还是比较模糊,甚至没有听说过,对java的理解也只是在基础语法 层面,本文就将对JVM进行初步介绍,因篇幅所限,只能介绍JVM基础,如 ...

  7. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  8. java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  9. java 内存跟踪_详解JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

最新文章

  1. 微信正在用的深度学习框架开源!支持稀疏张量,基于C++开发
  2. AOP 中必须明白的概念-目标对象(Target Object)
  3. prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)
  4. mysql内部时区_一文解决MySQL时区相关问题
  5. Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例
  6. linux rpm安装zabbix,CentOS 7上安装Zabbix Server 3.0 图文详解
  7. 互联网岗位介绍和成长
  8. php在哪改缩略图的大小,修改缩略图大小的方法
  9. ubuntu全局配置文件
  10. 【51nod】1227 平均最小公倍数
  11. PHP获取数组中重复值的键值
  12. android 自定义加载圈,Android自定义加载控件实现数据加载动画
  13. 规则引擎实现生产调度系统
  14. 虚拟机下搭建一个dns服务器,虚拟机下DNS服务器配置.doc
  15. html中body写什么,HTML中body内常用标签
  16. 百度面试题--度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同,度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?
  17. 铁是这样炼成的——IT项目经理的职业生涯
  18. .Net Web微信H5鱼虾蟹网站开发搭建技术栈
  19. 支付宝当面付打shang系统源码分享
  20. Python----数据分析-使用scikit-learn构建模型实训(wine数据集、wine_quality数据)

热门文章

  1. 超级好用的C++十六进制、十进制字符串转十进制数字
  2. Qt将【十六进制的字符串】与【原数据字符串】互转
  3. 解决了:无法加载文件或程序集'stdole, Version=7.0.3300.0'
  4. k8s环境搭建-集群模式
  5. Apk通过安卓修改大师加固的内部逻辑揭秘
  6. PAT L3-021 神坛
  7. sql查询 找出重复数据,并且只保留一条.
  8. 深入了解MD4,MD5,SHA哈希密码算法与破解技术
  9. Android 10 网络权限
  10. python爬虫设计在哪里_《python 爬虫教程 知乎》 怎样用Python设计一个爬虫模拟登陆知乎...