深入理解java虚拟机(一)--自动内存管理机制

java虚拟机运行时数据区

java虚拟机在执行java程序时会将其管理的内存划分为若干不同的数据区域:
- 程序计数器(Program Counter Register)
- java虚拟机栈(Java Virtual Machine Stacks)
- 本地方法栈(Native Method Stack)
- java堆(Java Heap)
- 方法区(Method Area)

程序计数器

程序计数器,作用类似于当前线程所执行的字节码的行号指示器。每个线程都有一个独立的程序计数器(线程私有)。

java虚拟机栈

每个线程都有一个java虚拟机栈,用于存放栈帧(Stack Frame),每个栈帧是一个java方法调用在内存中的映射,也就是说一个java方法调用对应着java虚拟机栈中的一个栈帧,栈帧存放方法的局部变量表,操作数表,方法出口等信息。

本地方法栈

该栈的作用和java虚拟机栈非常类似,只不过它服务的是Native方法。虚拟机规范对本地方法栈没有强制规定,Sun Hotspot虚拟机将本地方法栈和java虚拟机栈合二为一。

java堆

java堆是所有线程共享的一块内存,也是java虚拟机管理的最大的一块内存。所有的对象和数组都是在堆上分配的。

方法区

方法区也是所有线程共享的一块内存区域。用来存放虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。

运行时常量池

属于方法区。用于存放编译器生成的各种字面量和符号引用。

直接内存

直接内存独立于java虚拟机内存,在NIO库中有用到。

对象的创建过程

  1. 类的加载,解析和初始化。
  2. 从java堆上分配一块确定大小的内存。
  3. 为分配到的内存空间初始化零值。
  4. 对象进行必要的设置,设置对象头(Object Header)。
  5. 执行对象的方法,也就是初始化方法。

对象访问定位

两种对象访问定位方式:
1. 句柄访问:java堆中划分独立的空间存放句柄,reference指向句柄。句柄中包含对象实例数据和类型数据各自的地址信息。
2. 直接指针访问:reference指向对象存储的地址,对象中包含指向类型信息的引用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值