【Java虚拟机】Java内存区域

1.运行时数据区域

  Java虚拟机在执行Java程序的过程会把它管理的内存分成若干个不同的数据区域。各个部分有各个部分的作用。有以下几个主要部分:
  
  1.程序计数器(线程私有)
  程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的行号执行器。字节码解释器工作时通过改变计数器的值来选取下一条需要执行的字节码指令。
  
  2.Java虚拟机栈(线程私有)
  (约等于平时我们说的内存的栈)
  描述方法执行的内存模型:方法执行时会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等信息。方法执行的过程,对应着栈帧在java虚拟机栈中入栈、出栈的过程。
  
  平时所说的栈差不多就是这个区域,准确的说,是虚拟机栈中的局部变量表部分:
  主要存放:已知的基本数据类型(8种)、对象引用、返回地址。
  所需内存:编译时即分配。当进入一个方法时,所需在帧中分配多大的局部变量空间时完全确定的,运行期间不会改变。
  
  3.本地方法栈
  类似于上面2。区别:Java虚拟机栈是为虚拟机执行Java方法服务的,本地方法栈是为虚拟机执行Native方法服务的。有的虚拟机把这两个合并为一了。
  
  4.Java堆(线程共享)
  这是占内存最大的部分。虚拟机启动时即被创建。
  主要存放: 对象的实例、数组
  堆可处于物理上不连续,逻辑上连续的内存空间。
  
  5.方法区(线程共享)
  主要存放: 已被虚拟机加载的类信息、常量、静态变量。

2.对象的创建

   创建过程:
   1. 类加载检查
   虚拟机遇到new指令,首先会检查指令的参数是否在常量池中定位到一个类的符号引用,并检查目标类是否加载、解析和初始化过。
   2.分配内存
   对象所需的内存空间确定后,需要从java堆中划分确定大小的部分给目标类。有两种方式:
   指针碰撞: java内存规整。用过的在一边,没用过的在一边,中间有指针。分配空间时可以通过移动指针来完成。
   空闲列表: Java内存不规整。有列表记录空闲的内存块。在分配时,查询空闲的部分进行分割。
   3.内存空间初始化。
   目的:对象的实例在Java代码中可以不赋初值就可以使用。
   4.对象进行必要的设置
   例如:对象是哪个类的实例、如何找到类的元数据信息、对象的哈希码、对象的GC分代年龄等。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值