JAVA内存区域与内存溢出异常(一)

来源:互联网 发布:荒潮 知乎 编辑:程序博客网 时间:2024/05/22 15:56

JAVA内存区域与内存溢出异常(一)

  • 概述
  • 运行时数据区域
  • 程序计数器
  • Java虚拟机栈
  • 本地方法栈
  • 方法区
  • 运行时常量池
  • 直接内存
  • 直接内存

概述

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“墙”,墙外面的人想进来,墙里面的人想出去。

对于从事C,C++程序开发的工作人员来说,在内存管理领域,他们既是拥有最该权利的“皇帝”又是最基础的劳动者,他们对每一个对象的都担负着从有到无的责任。
对于Java程序员而言,在虚拟机自动内存管理机制的帮助下,不用手动的使用代码维护对象的生命周期,不容易出现内存泄漏和内存溢出的问题。虽然,把内存的管理交给java虚拟机,一旦出了内存泄漏或者内存溢出的问题,如果不了解虚拟机是怎么样使用内存的,那么排查错误将会成为一项异常艰难的工作了。

运行时数据区域

Java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间。
有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户线程的启动个结束而建立和销毁。根据《Java虚拟机规范(JavaSE 7版)》的规定,Java虚拟机所管理的内存将会包含以下几个运行时数据区域,如图所示

这里写图片描述
摘自网上(分享自星星之火)

程序计数器

程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(各种虚拟机可能会通过更搞笑的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。
由于Java虚拟机的多线程是通过咸亨轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都会只执行一条线程中的指令,因此为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们成这类内存区域为“线程宏有”的内存。
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器则为(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

  • JAVA内存区域与内存溢出异常一
    • 概述
      • 运行时数据区域
      • 程序计数器
      • 脚注
      • 目录
      • 数学公式
      • UML 图
    • 离线写博客
    • 浏览器兼容

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为:Γ(n)=(n1)!nN
  • 块级公式:

x=b±b24ac2a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.0张三张三李四李四嘿,小四儿, 写博客了没?李四愣了一下,说:忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.0开始我的操作确认?结束yesno
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 这里是 脚注内容. ↩