zoukankan      html  css  js  c++  java
  • Java内存区域与内存溢出异常

    运行时数据区域

    1)程序计数器

    • 一块较小的内存空间,是当前线程所执行的字节码的行号指示器。
    • 线程私有
    • 线程执行Java方法,记录的是正在执行的虚拟机字节码指令的地址。执行Native方法,计数器值为空。

    2)Java虚拟机栈
    每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
    局部变量表存放了编译器可知的各种基本数据类型、对象引用和returnAddress类型。
    其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需的内存空间在编译器间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表大小。
    3)本地方法栈
    作用与Java虚拟机栈类似,不过一个存放Java方法,一个存放本地方法。在HotSpot中直接将这两个合二为一。
    4)Java堆
    对大多数应用来说,堆是内存占用最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
    5)方法区
    与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    6)运行时常量池
    是方法区的一部分。class文件中的常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池。
    7)直接内存
    并不是虚拟机运行时数据区的一部分。但与NIO技术有关,可以在特定场景中提高性能。

    HotSpot虚拟机对象

    1)对象的创建

    2)对象的内存布局

    3)对象的访问定位

    内存溢出

    1)Java堆溢出

    2)虚拟机栈与本地方法栈溢出

    3)方法区和运行时常量池溢出

    4)本机直接内存溢出

  • 相关阅读:
    C#神奇的扩展方法
    OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用
    xslt格式化日期的方法
    c# 对象存cookie
    Oracle Client安装报错:引用数据不可用于验证此操作系统分发的先决条件
    Web.config中设置启用webservice远程调试访问 参数看不到
    ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
    IIS无法加载字体文件(*.woff,*.svg)的解决办法
    word 里面没输入法
    photoshop cc 2018破解补丁(pscc2018注册机) 附使用方法
  • 原文地址:https://www.cnblogs.com/heibaimao123/p/13773108.html
Copyright © 2011-2022 走看看