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

    1、运行时数据区域

    1.1、程序计数器

    • 一块较小的内存,它可以看作是当前线程所执行的字节码的行号指示器。
    • 线程独有
    • 唯一一个没有规定OutOfMemoryError情况的区域

    1.2、Java虚拟机栈

    • 线程私有,生命周期与线程相同
    • 每个方法被执行的时候都会创建一个栈帧,方法的开始到结束对应了栈帧的入栈到出栈 
    • 这个内存区域定义了两个异常:
      • 如果线程请求的栈深度大于虚拟机允许的栈深度,就会报StackOverFlowError
      • 如果栈扩展时无法申请到足够的内存,就会报OutOfMemoryError

     1.3、本地方法栈

      本地方法栈与虚拟机栈的区别是,虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是为本地Native方法服务。

      该区域和虚拟机栈一样也会报两种异常,同上。

    1.4、Java堆

    • 内存中最大一块区域
    • 线程共享,在虚拟机启动时创建,用来存放对象实例
    • 如果堆中没有内存完成实例分配,并且堆无法扩展时,也会抛出OutOfMemoryError (可以通过通过参数-Xmx和-Xms设定)

    1.5、方法区

    • 线程共享
    • 存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
    • 运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息,还有一项信息是常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将存放在运行时常量池中。
    • 如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。
  • 相关阅读:
    黑马程序员JAVA基础Java 集合之Collections 工具类
    黑马程序员JAVA基础Java 集合之Set 接口
    黑马程序员JAVA基础Java 集合之List 集合
    通过回车来完成数据的提交
    BizTalk中多个子记录映射解决办法
    框架的展开与关闭
    一个有用的触发器
    SQL 中分隔字符串的获取
    未保存离开页面要给出提示
    常用的一些javascript小技巧 很实用
  • 原文地址:https://www.cnblogs.com/TripL/p/13358108.html
Copyright © 2011-2022 走看看