美文网首页
第二十六章、JVM内存区域及哪些区域可能发生OutOfMemor

第二十六章、JVM内存区域及哪些区域可能发生OutOfMemor

作者: 小母牛不生产奶 | 来源:发表于2018-11-14 21:46 被阅读13次

    谈谈 JVM 内存区域的划分,哪些区域可能发生 OutOfMemoryError?

    通常可以把JVM内存区域分为下面几个方面,其中,有点 区域是以线程为单位,有的区域是整个JVM进程唯一的。

    1、程序计数器(PC,Program Counter Register)。在JVM规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果是在执行本地方法,则是未指定值。

    2、java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧,对应着一次次的java方法调用。

    前面谈程序计数器时,提档了当前方法,同理,在一个时间点,对应的指挥有一个活动的栈帧会被创建出来,成为新的当前帧,一直到它返回结果或者执行结束。JVM直接对java栈的操作只有两个,就是对栈帧的压栈和出栈。

    栈帧中存储着局部变量表、操作数栈、动态链接、方法正常退出或者异常退出的定义等。


    3、堆(Heap),它是java内存管理的核心区域,用来放置java对象实例,几乎所有创建的java对象实例都是被直接分配在堆上。堆被所有的线程共享,在迅即启动时,我们指定的“Xmx”之类参数就是用来指定最大堆空间等指标。

    理所当然,堆也是垃圾收集器重点照顾的区域,所以堆内空间还会被不同的垃圾收集器进一步的细分,最有名的就是新生代、老年代的划分

    4、方法区(Method Area)。这也是所有线程共享的一块内存区域,用于存储所谓的元(Meta)数据,例如类结构信息,以及对应的运行时常量池、字段、方法代码等。

    5、运行时常量池(Run-Time Constant Pool),这是方法区的一部分,如果仔细分析过反编译的类文件结构,可以看到版本号、字段、方法、超类、接口等各种信息,还有一项信息就是常量池。java的常量池可以存放各种常量信息,不管是编译期生成的各种字面量,还是需要在运行时决定的符号引用,所以它比一般语言的符号表存储的信息更加宽泛。

    6、本地方法栈,他和java虚拟机栈是非常相似的,支持堆本地方法的调用,也是每个线程都会创建一个。在Oracle Hotspot JVM中,本地方法栈和java虚拟机栈是在同一块儿区域,这完全取决于技术实现的决定,并未在规范中强制。

    java内存区域

    可能发生OutOfMEmoryError的区域:

    1、堆内存不足:

            抛出的错误信息是:java.lang.OutOfMemoryError:Jaa heap space,原因可能千奇百怪,例如,可能存在内存泄漏问题,也很有可能就是堆的大小不合理,比如我们要处理比较可观的数据量,但是没有显式指定JVM堆大小或者指定数值偏小;或者出现JVM处理引用不及时,导致堆积起来,内存无法释放等;

    2、java虚拟机栈和本地方法栈:

            这里要稍微复杂一点,如果我们写一段程序不断的进行递归调用,而且没有退出条件,就会导致不断进行压栈。类似这种情况,JVM实际会抛出stackOverFlowError;当然,如果JVM试图去扩展栈的时候失败,则会抛出OutOfMemoryError。

    3、永久代

            对于老版本的Oracle JDK,因为永久代的大小是有限的,并且JVM对永久代垃圾回收(如,常量池回收、卸载不再需要的类型)非常不积极,所以当我们不断添加新类型的时候,永久代出现OutOfMemoryError也非常多见,尤其是在运行时存在大量动态类型生成的场合;类似Intern字符串缓存占用太多空间,也会导致OOM问题。对应的异常信息,会标记出来和永久代相关:java.lang.OutOfMemoryError.PermGen space。

    4、方法区

        随着元数据区的引入,方法去内存已经不再那么窘迫,所以相应的OOM有所改观,出现OOM,异常信息则编程了:java.lang.OutOfMemoryError:Metaspace.

    相关文章

      网友评论

          本文标题:第二十六章、JVM内存区域及哪些区域可能发生OutOfMemor

          本文链接:https://www.haomeiwen.com/subject/nuesfqtx.html