转载请注明原文地址: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. maven打包时跳过单元测试

    运行mvn install时跳过Test <project> [...] <build> <plugins> <plugin> <groupId& ...

  2. python 直方图hist

    import sys sys.path.append('/usr/local/lib/python2.7/site-packages') sys.path.append('/usr/lib/pytho ...

  3. DES、MD5、RSA加密算法

    本篇主要是实现标题中的三个加密算法,至于机制大家自行百度吧. 一.DES 实现类:DES.java package com.kale.des; import java.security.SecureR ...

  4. 在SQLite中使用事务

    使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚 ...

  5. 启明星会议室系统与Office365集成说明

    在本文,我们将介绍如何配置Office365,以便改系统能够支持启明星会议室预定系统. In this article, we will introduct how to config microso ...

  6. 内核态(Kernel Mode)与用户态(User Mode)

    内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺 ...

  7. Android 应用程序之间内容分享详解(二)

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...

  8. 3D视频的播放

    3D视频的播放 人眼产生立体效果的条件有两个: 1.须要左右眼两路影像,这两路影像是不同的.具有正确的视差: 2.进入左右眼的影像要全然分离.左影像进左眼,右影像进右眼. 第一条是对3D视频源提出的要 ...

  9. java--线程认识与实例记录 NO.1

    下面的内容都是从java编程思想一书中摘取出来,我认为很有产考价值,并且便于后续使用. 主要内容是记录继承thread和实现runnable接口两种方式的代码用法,及内部类中启用线程的用法. 1.首先 ...

  10. IntelliJ idea配置python

    为什么选择Intellij?因为我需要系统地管理python工程,Intellij可断点调试. 1.下载IntelliJ idea 在百度中搜索“IntelliJ idea”,并点击官网地址进行下载: ...