• 【四】Java虚拟机内存区域初识


     一、线程独占区

     1、程序计数器

    程序计数器是一块处于线程独占区较小的内存空间,它可以看是当前线程所执行的字节码的行号指示器

    如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,这个计数器的值为undefined.

    此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域

    2、Java虚拟机栈

    虚拟机栈描述的是Java方法执行的动态内存模型。

      1)栈帧

       每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变表,操作数栈,动态链接,方法出口等。

      2)局部变量表

        存放编译期可知的各种基本数据类型,引用类型,returnAdress类型

         局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,在方法运行期间是不会改变局部变量表的大小。

     

    如果栈的大小没有限制,最终会报OutOfMemory 异常

    * Hot Spot是不分虚拟机栈和本地方法栈,他们是在一块儿的,合二为一,这里讲的是Java虚拟机规范*

    3、本地方法栈

    本地方法栈与虚拟机栈及其相似,唯一区别是:

    • 虚拟机栈为虚拟机执行Java方法服务
    • 本地方法栈为虚拟机执行native方法服务

    二、线程共享区

    1、堆

    • 存放对象实例
    • 垃圾收集器管理的主要区域
    • 新生代、老年代

    2、方法区

    存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

    • 类的版本
    • 字段
    • 方法
    • 接口

    方法区和永久代

    垃圾回收在方法区的行为

    异常的定义

    • OutOfMemory

    3、运行时常量池(方法区的一部分)

    public class Test {
        public static void main(String[] args) {
            String a = “123”;  //静态常量
            String b = “123”;
            
            System.out.println(a == b);        //true
    
            String c = new String(“123”);
            System.out.println(a == c);        //false
    
            System.out.println(a == c.intern());    // true        public native String intern(); c.intern() 是运行时常量  (a + b) 也会产生一个运行时常量
    
            // intern() 将c由堆中扔到字符串常量池中
        }
    }

    4、直接内存

    NIO中 ,用buffer,使用的是堆外的内存,为提高效率。不受jvm的内存大小制约,但是受物理内存大小的制约。

  • 相关阅读:
    Activiti:入门
    Activiti:整合WEB版流程模型设计器Modeler
    Activiti:流程定义部署管理
    Activiti:流程实例管理
    Activiti:基本实操
    Activiti:流程任务管理
    IDEA全局搜索,File Mask筛选列表为空问题解决
    【Electron】使用 buildtools 在 Windows 中编译 electron
    【Electron】在 WSL2 中 打包 electron Linux 版本应用及运行
    对既有磁盘挂载进行扩容,对既有逻辑卷进行扩容 resize2fs
  • 原文地址:https://www.cnblogs.com/guchunchao/p/10499925.html
Copyright © 2020-2023  润新知