当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

Java内存区域和内存溢出异常(1)

发表于: 2012-09-19   作者:不爱不见   来源:转载   浏览次数:
摘要: 1.首先java的运行时存储区域大致分为:java堆,虚拟机栈,本地方法栈,方法区,程序计数器这几个区域,下面对这几块区域的存储信息和可能抛出的异常进行分析。   1>程序计数器。     这个区域主要是用来标识字符码执行时候的行号指示器。如果正在执行的是java方法,那么此时这个指令代表字符码的地址,如果执行的是native方法,那么此时该值为空
1.首先java的运行时存储区域大致分为:java堆,虚拟机栈,本地方法栈,方法区,程序计数器这几个区域,下面对这几块区域的存储信息和可能抛出的异常进行分析。
  1>程序计数器。
    这个区域主要是用来标识字符码执行时候的行号指示器。如果正在执行的是java方法,那么此时这个指令代表字符码的地址,如果执行的是native方法,那么此时该值为空(Undefine),这个区域是线程私有的,也是唯一不会发生OutofMemoryError错误的区域。
  2>java虚拟机栈
   该区域在类中方法的执行时会使用,存储的方法内的局部变量,动态链接,方法出口等,每个方法在执行的时候会创建一个栈帧,方法的执行完毕就对应与出栈和入栈的过程。
   在该区域,如果申请的栈深度过大,超过了虚拟机所允许的深度就会产生StackOverFlowError异常,如果jvm启动时指定的栈空间过小,那么会引起OutofMemoryError异常。
  3>本地方法栈
   这个区域主要是为虚拟机执行Native服务的,不同的虚拟机可以自由的实现它,HotSport把这部分区域和java虚拟机栈合二为一,这部分区域也会抛出StackOverflowError和OutofMemoryError异常。
  4>java堆
  java堆是虚拟机管理中最大的一块,几乎所有的java对象都会在这个区域上面进行分配,除了一些jvm进行的优化,比如栈上分配,标量替换等等,该部分也是垃圾回收的主要管理区域,由于现代的垃圾收集器都是分代收集的,所以java堆还可以细分为:新生代和老年代。
  5>方法区
  该区域也是个线程共享的区域,用来存储被jvm加载进来的类信息,常量,静态变量,即时编译器编译后的代码,这个区域的主要回收对象是常量池的回收和类型的卸载,当方法区无法进行内存分配时会发生OutofMemoryError异常。
  6>运行时常量池
  该区域是方法区域的一部分,主要用来存放编译器生成的各种字面量和符号引用。当常量池无法申请到足够的内存后也会发生OutofMemoryError异常。
  7>直接内存
  该区域不是java运行时数据的部分,java中的NIO机制引入了一种基于通道的I/O方法,它可以使用Native函数直接分配堆外内存,然后通过一个存放在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作,这样可以避免在java堆和native堆中来回的复制数据,从而提高性能。
2.对象的访问
   Object obj = new Object() 这句代码会涉及到三个内存区域,分别是堆,栈,方法区,
首先在方法中时会存放在栈帧中,只保存该对象的一个引用,在这该对象的实例存储将会放在堆中来进行,而对象的类型等相关信息会放到java的方法区。
   在栈中的这个引用访问对象主流的有两种方式,第一种是句柄,第二种是直接指针。
  1>句柄:使用该方式时会在java堆中开启一片句柄池,用来存放该对象的实际地址,而栈中保存的知识句柄池的地址而已,使用该种方式的好处是在进行对象的移动时只需改变句柄池中的实例数据指针,而栈中的引用不需要修改。
  2>直接指针访问方式,使用该种指针访问的话速度更快,他不需要进行指针的二次定位,sun HotSpot虚拟机就是采用的此种访问方式。

Java内存区域和内存溢出异常(1)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1概述 基本就是C和C++程序编写需要维护没一个对象生命开始到终结。 Java把内存控制权利交给了Java
Java程序员把内存的控制权交给了Java虚拟机。在Java虚拟机内存管理机制的帮助下,程序员不再需要为
JAVA与C++之间有一堵墙,里面的是要出来 外面的要进去,这一堵墙就是内存动态分配和垃圾收集技术 ,JAV
1、Java虚拟机运行时的数据区域,如下图所示。 (1) 程序计数器 每个线程都有一个独立的程序计数器,
Java虚拟机在执行java程序过程中会把它所管理的内存划分为若干个不同的数据区域 1. 程序计数器 a)
Java内存区域与内存溢出异常 一、Java 虚拟机运行时数据区域: 1、方法区(Method Area) 2、虚拟机
一、Java 虚拟机运行时数据区域: 1、方法区(Method Area) 2、虚拟机栈(VM Stack) 3、本地方法栈(
1,运行时数据区域 根据JAVA虚拟机规范的规定:JAVA虚拟机所管理的内存将会包括以下几个运行时数据
2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域
1.运行时数据区域 1.1 程序计数器 记录当前线程所执行字节码的行号指示器。线程私有,占有很小一块
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号