1. Java虚拟机运行时数据区域

在这里插入图片描述

线程隔离的数据区域

程序计数器

程序计数器:是一块较小的内存空间,记录的是当前线程所执行的字节码的行号指示器

为什么是线程隔离:首先我们知道,程序计数器是线程隔离的,也就是线程私有的,不受其他线程影响。这是因为,多线程工作是通过频繁的切换并且通过分配处理器执行时间方式来实现的,所以在来回切换的过程中,为了保证线程切换之后还能回到原来的执行位置,每个线程内部都会维护一个自己私有的程序计数器,独立存储。线程计数器是不存在内存溢出的情况

Java虚拟机栈(虚拟机栈:生命周期和线程相同)

虚拟机栈:指的是每个方法在运行的时候都会创建维护一个栈帧,用来存储局部变量表,操作数栈,动态链接方法出口等信息,每一个方法执行完毕就是一个栈帧在虚拟机栈中的入栈出栈的过程

局部变量表存放什么:基本数据类型和对象引用类型。局部变量表的内存空间在编译期间分配完成。当进入一个方法的时候,这个方法在局部变量表中所需要的空间是已经确定的,在方法运行期间不会改变,会出现内存溢出

本地方法栈

本地方法栈:和虚拟机栈类似,虚拟机栈运行虚拟机方法, 本地方法栈为虚拟机使用到的native方法(底层算法)的入栈出栈,会有栈溢出和内存溢出

线程共享的数据区域

Java堆

Java堆:是虚拟机中内存最大的,被所有线程共享,目的就是存放对象实例,几乎所有的对象实例以及数组都分配在堆上
Java堆是垃圾收集器主要管理的区域,堆中还分为新生代、老年代
Java堆既是可以固定大小的也是可以拓展的,堆中没有内存完成实例分配并且堆无法拓展的时候就会内存溢出

方法区

方法区:存储类信息、常量、静态变量等,都是全局变量。又叫做永久代,会出现内存溢出

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

运行时常量池:主要用于存储编译期生成的各种常量和符号引用,会出现内存溢出

虚拟机中对象的创建过程

  • 虚拟机遇到一个 new 指令的时候,首先去检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个类是不是已经被加载、解析和初始化,如果没有那就开始执行相应的类加载过程
  • 类加载通过,给对象分配内存
  • 内存分配完成之后,虚拟机将分配到的内存空间都初始化为0
  • 虚拟机对对象进行必要设置,这个对象是哪个类的实例,对象的哈希码等
  • 执行new指令之后紧接着执行初始化方法,按照程序员的意愿进行初始化

对象的访问定位

需要根据局部变量表上的 reference 数据来操作堆上的具体对象 reference存储的是找到对象的数据,如果是指针那么就直接存的对象的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值