转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6534990.html 

JVM的组成在上一篇博文已经介绍了,现在我们专门深入Java运行时数据区。

1:程序计数器

当前线程执行的字节码文件的行号指示器,用于线程切换之后恢复上次执行时的位置继续执行。各个线程之间的计数器互不影响,“线程私有”。

这是唯一一个在JVM中没有OOM异常的区域。

2:虚拟机栈

这也是线程私有的,保留了当前线程的方法栈帧:每个方法执行时会创建栈帧,用于存储局部变量、操作数、方法出口等。每个方法从调用到执行完成就对应这一个栈帧在虚拟机栈中入栈到出栈的过程。

这个区域有两种异常:方法栈的深度大于虚拟机所允许的深度就会抛出StackOverflowError异常;栈的大小扩展时如果无法获得足够的内存就会抛出OOM异常。

3:本地方法栈

为本地的Native方法服务,功能与虚拟机栈类似,也会由于深度问题或扩展时内存不够而抛出StackOverflowError或OOM异常。

4:Java堆

被所有线程共享的一片区域,所有对象实例以及数组都在堆上分配内存。可以通过:-Xmx、-Xmx设置堆的大小上下限。我们习惯上把堆划分为新生代和老年代,具体划分在GC机制的博文详述。

当堆的内存不足时,抛出OOM异常。

5:方法区

被各个线程共享,存储被虚拟机加载的类的信息、常量、静态变量等,为了与堆进行区分,又有“非堆”的别名。

由于在HotSpot虚拟机中把GC机制扩展到了方法区,使得垃圾收集器可以像Java堆那样管理这部分内存,故方法区又叫“永久代”。这部分区域的垃圾回收为废弃常量和无用的类。废弃常量:常量池中没有被任何对象引用的常量值。无用的类:无任何对象实例、类加载器已被回收、Class对象没有被引用的类文件。

当方法区内存达到-XX:MaxPermSize上限时抛出OOM异常。

5.1:常量池

存放编译器生成的各种字面量、符号引用。

拓展:直接内存

直接内存是本机的内存,不收Java堆大小的限制。但是当服务器管理员配置虚拟机参数时,如果各个内存区域的总和大于本机物理内存限制,就会出现OOM异常。

Java内存区域与各区域OOM的更多相关文章

  1. Java内存数据模型

    本篇文章带来的是对Java内存数据模型的介绍,这对于我们深入理解Jvm虚拟机工作的原理和Java内存的划分大有裨益,好了,为了让我们理解的更为深刻,我们将会加入图片辅助的方法去理解. 本篇博文的目录: ...

  2. Java 内存模型 ,一篇就够了!

    Java 虚拟机   我们都知道 Java 语言的可以跨平台的,这其中的核心是因为存在 Java 虚拟机这个玩意.虚拟机,顾名思义就是虚拟的机器,这不是真实存在的硬件,但是却可以和不同的底层平台进行交 ...

  3. Java内存模型与内存结构

    Java内存模型 一.简介 Java内存模型(JMM)主要是为了规定线程和内存之间的一些关系:根据JMM的设计,系统存在一个主内存(Main Memory)和工作内存(Work Memory),Jav ...

  4. Java 内存模型与内存结构

    Java内存模型 一.简介 Java内存模型(JMM)主要是为了规定线程和内存之间的一些关系:根据JMM的设计,系统存在一个主内存(Main Memory)和工作内存(Work Memory),Jav ...

  5. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  6. JVM内存管理:深入Java内存区域与OOM

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝 ...

  7. Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  8. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常

    2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...

  9. Java自动内存管理机制学习(一):Java内存区域与内存溢出异常

    备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...

随机推荐

  1. 识骨寻踪第十二季/全集Bones迅雷下载

    本季 Bones (2015)看点:<识骨寻踪>(FOX)2005年推出的罪案题材的电视连续剧.该剧部分内容改编自前刑侦检验官.现任该剧制作人凯丝·莱克斯出版的一系列侦探小说.Bones的 ...

  2. sublime text的扩展插件

    sublime text用作开发编辑器,还缺省二个比较重要功能:跨文件跳转.返回最后一次编辑的位置: 这里有二个插件正好解决此问题:CTags.ChangeList   其它常用的插件,google一 ...

  3. RecyclerView常见问题解决方案,RecyclerView嵌套自动滚动,RecyclerView 高度设置wrap_content 无作用等问题

    1,ScrollView或者RecyclerView1 嵌套RecyclerView2  进入页面自动跳转到recyclerView2上面页面会自动滚动貌似是RecyclerView 自动获得了焦点两 ...

  4. [Android Pro] AndroidStudio IDE界面插件开发(进阶篇之Editor)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53885981] 我们开发AndroidStudio ...

  5. Curl操作Elasticsearch的常用方法

    Elasticsearch对于文档操作,提供了以下几种API,本文就说明如何使用curl方式来调用这些API. API种类 单文档操作API 1.* Index API 索引文档 * 为文档创建索引 ...

  6. YAML文件简介

    编程免不了要写配置文件,怎么写配置也是一门学问. YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. 本文介绍 YAML 的语法,以 JS-YAML 的实现为例.你可以去 ...

  7. Can't create pdf file with font calibri bold 错误解决方案

    错误情况: %%[ ProductName: Distiller ]%% Mangal not found, using Courier. %%[ Error: invalidfont; Offend ...

  8. python抽象类的实现方式:abc模块

    abc:abstract base class 文档:https://docs.python.org/zh-cn/3.7/library/abc.html 参考:https://www.cnblogs ...

  9. poj 2348 Euclid's Game 题解

    Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9023   Accepted: 3691 Des ...

  10. linux和windows时间同步问题(UTC&localtime)

    Linux使用 UTC,但是windows默认使用localtime.解决的办法如下(重启后生效). 进入windows使用regedit写入DWORD值(设置成十六进制"1"): ...