zoukankan      html  css  js  c++  java
  • 深入理解Java虚拟机(一)、Java内存区域与内存溢出异常

    Java虚拟机所管理的内存包括以下几个运行时数据区: 

    程序计数器(PCR):

    1、是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器

    2、为线程私有

    3、执行Java方法有PCR,执行native方法时,PCR为空(Undefined)

    4、该内存区域不会出现OME(Out Of Memory Exception)

    Java虚拟机栈:

    1、各线程私有,生命周期与线程相同

    2、JVMS描述的是Java方法执行的内存模型,局部变量表,操作数栈

    3、局部变量表中存储了基本类型,对象,和返回地址类型,long和double类型占两个slot

    4、存在SOE(StackOverflowError)和OME

    本地方法栈:

    1、为虚拟机用到的本地方法服务

    2、虚拟机规范对本地方法栈无具体规定,具体的虚拟机可以自由实现规定

    3、有SOE和OME

    Java堆:

    1、内存最大的一块区域,所有线程共享,VM启动时创建,唯一目的:存放对象实例

    2、也成为GC堆,是垃圾收集器管理的主要区域

    3、GC堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可

    4、有OME

    方法区:

    1、所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据

    2、别名非堆,是堆的一个逻辑部分

    3、内存逻辑上连续即可,可以选择固定大小或可扩展,或不是想垃圾收集

    4、有OME

    运行时常量池:

    1、是方法区的一部分,存放类文件,常量池信息

    2、具有动态性,可以在运行期或编译期将常量放入池中

    3、有OME

    直接内存:

    1、是使用native函数库直接分配的堆外内存,java堆中的DBB(DirectByteBuff)对象作为这块内存的引用

    2、会受到本机内存限制

    3、有OME

  • 相关阅读:
    jvm字节码简介
    Class类文件结构
    springboot 配置webservice接口
    jdk(1.8)命令行工具(二)
    springboot集成JsonRpc2.0
    jdk命令行工具(一)
    linux安装spark-2.3.0集群
    linux安装scala环境
    [机器学习实践] 针对Breast-Cancer数据集
    mac下 selenium + python 配置和入门
  • 原文地址:https://www.cnblogs.com/boucher/p/5909703.html
Copyright © 2011-2022 走看看