zoukankan      html  css  js  c++  java
  • JVM(1)——Java内存区域与内存溢出异常

    运行时数据区域

                                                                           

      

    程序计数器

      每个线程都会有一个私有的程序计数器。这是一块较小的内存区域,是当前线程所执行的字节码的行号指示器。当线程执行一个Java方法时,该计数器记录的是当前执行的虚拟机字节码指令的地址;当线程执行的是本地方法时,这个计数器的值应该为空。因此,该内存区域是唯一一个没有规定任何OOM情况的区域。

    Java虚拟机栈

      Java虚拟机栈是线程私有的,生命周期与线程相同。描述的是Java方法执行的线程内存模型:该线程内每个方法执行时,Java虚拟机会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。当方法被调用直至结束时,对应的就是一个栈帧入栈到出栈的过程(调用执行时入栈,结束时出栈)。

      局部变量表存放的是编译期可知的Java虚拟机基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)。

           如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。 

    本地方法栈

      本地方法栈作用与Java虚拟机栈的作用类似,区别在于Java虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机调用的本地方法服务。同时,本地方法栈也会在栈深度溢出或者栈扩展失败时抛出StackOverflowError和OutOfMemoryError。

      堆是虚拟机所管理的内存中最大的一块。堆是所有线程共享的一块内存区域,在虚拟机启动时创建。这片区域唯一的作用是存放各个进程创建的实例。同时,堆也是垃圾收集器管理的内存区域。这片内存区域在逻辑上的连续的,但物理存储上是非连续的。当堆内存空间已经不足以分配给创建新的实例,并且无法再扩展时,会抛出OutOfError异常。

    方法区

      方法区也是所有线程共享的一块内存区域,用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。当其无法满足新的内存分配需求时,也会抛出OutOfMemoryError异常。

    运行时常量池

      运行时常量池是方法区的一部分。在Class文件中有一项信息是常量池表,用于存放编译期生成的各种字面量与字符引用,这部分内容将在类加载后放到方法区的运行时常量池中。同时,不一定只有在常量池表的内容才能进入运行时常量池。在运行过程中,产生的也可以放入池中。

    直接内存

       直接内存并非虚拟机运行时的数据区的一部分。一般使用Native函数库直接分配堆外内存,再通过DirectByteBuffer对象作用堆外内存的引用进行使用。

    虚拟机中的对象

    对象的创建

      当虚拟机遇到一条new指令时,首先先检查是否能在常量池中定位到其引用,并检查这个引用的类是否已经被加载、解析和初始化过。如果没有,就需要重新进行类加载过程。类加载通过后,虚拟机需要为新创建的类分配内存。内存分配后,需要对该类进行零值的初始化,然后再对对象进行必要的设置。至此,从虚拟机的视角来看,一个新的对象就产生了。但之后还需要执行Class文件中的init方法,对应着构造函数。

    对象的内存布局

      对象在堆内存中的存储布局可以分为:对象头、实例数据和对齐填充。

    对象的访问定位

      对象的访问定位方式有两种。1、使用句柄。Java堆中将可能会划分出一块内存来作为句柄池,reference中存储的就 是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息。2、直接指针。Java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访问的开销。

  • 相关阅读:
    编码问题:python写入文件
    [ExtJS5学习笔记]第三十二节 sencha extjs 5与struts2的ajax交互配置
    PS 滤镜——Skewing
    [struts2学习笔记] 第六节 struts2依赖的jar包还有Could not find action or result 错误解决
    [linux RedHat]windows下使用putty远程连接linux 下载JDK和tomcat
    一个有趣的花环图案生成函数
    【翻译】针对多种设备定制Ext JS 5应用程序
    【翻译】Ext JS最新技巧——2015-1-2
    [ExtJS5学习笔记]第三十一节 sencha extjs 5使用cmd生成的工程部署到tomcat服务器
    PhotoShop 图像处理 算法 汇总
  • 原文地址:https://www.cnblogs.com/dloooooo/p/13781526.html
Copyright © 2011-2022 走看看