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异常。
  • 相关阅读:
    1442. Count Triplets That Can Form Two Arrays of Equal XOR
    1441. Build an Array With Stack Operations
    312. Burst Balloons
    367. Valid Perfect Square
    307. Range Sum Query
    1232. Check If It Is a Straight Line
    993. Cousins in Binary Tree
    1436. Destination City
    476. Number Complement
    383. Ransom Note
  • 原文地址:https://www.cnblogs.com/TripL/p/13358108.html
Copyright © 2011-2022 走看看