深入理解java虚拟机笔记(一)java内存区域

一、前言

最近在看一本书叫《深入理解java虚拟机–jvm高级特性及最佳实践》,这本书本是大学时候的课本,当时没太关注,最近准备了解一下java虚拟机的原理,然后在看书的过程中做一做笔记,总结出来,方便自己理解。当然,我也非常希望这个笔记能够对各位同学能够有所帮助。话就说到这,下面开始正题。


二、运行时数据区

Java虚拟机在执行java程序的过程中会把内存分为数个不同的数据区域,他们分别为:程序计数器、java虚拟机栈、本地方法栈、Java 堆、方法区。

2.1 程序计数器

描述:当前线程执行字节码的行号指示器。
特点:1、线程私有 2、一块小的内存空间

2.2 java虚拟机栈

描述: java虚拟机描述的是java方法执行是的内存模型,即每个方法在执行的同时,会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每个方法从调用到执行完成的过程,都对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
特点:和程序计数器一样,为线程私有。
局部变量表:1、存储编译期可知的基本数据类型。
2、内存空间在编译期间分配完成
异常情况:

Created with Raphaël 2.1.2 开始 虚拟机栈可以动态扩展? 扩展无法申请足够内存 outOfMemoryError 线程请求深度 > 虚拟机允许深度 StackOverflowError yes no
2.3 本地方法栈

描述:和虚拟机栈一样
区别:虚拟机栈:执行Java方法(字节码)服务
本地方法栈:虚拟机中使用Native方法

2.4 java堆

特点:
1、对于大多数应用,Java堆是虚拟机管理内存最大的一块
2、与程序计数器和java虚拟机栈不同,它是线程共享的
3、在虚拟机启动时创建
4、唯一的目的就是为了存储对象的实例(new Student())
5、是GC管理的主要区域

2.5 方法区

特点:
1、与java堆一样,是线程共享的内存区域
2、用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
3、方法区的内存回收目标主要针对常量池的回收和对类型的卸载


三、对象相关

3.1 对象创建
Created with Raphaël 2.1.2 虚拟机接收到new指令 检查类是否被加载、解析、初始化? 结束 执行类加载过程 分配内存 内存分配完成 初始化已分配到的内存空间为零(不包含对象头) 设置对象头信息 执行<init>方法 结束 yes no

说明:在java堆给对象分配内存的过程中有两种方式
1、指针碰撞方式
特征:内存分配规整,指针放在内存使用与未使用的边界上,分配内存时指针往未使用的内存的一边移动。
2、空间列表方式
特征:内存不规整,记录哪些内存可用,并分配给对象实例。
使用这两种方式中的一种的前提条件是虚拟机的GC是否采用了压缩整理算法。


四、对象的内存布局

在HotSpot虚拟机中,对象的内存布局可分为3块区域:对象头、实例数据和对齐填充。
1、对象头包含两部分信息
第一部分:存储对象自身运行时数据,如哈希码、GC分代年龄、锁状态标志等
第二部分:指针类型,即对象指向它的类元数据指针,虚拟机可以根据该指针来确定这个对象是哪个类的实例。但要并不是所有的虚拟机都要在对象数据上保留类型指针。
特别的,如果对象是数组,那么对象头中必须要有记录数组长度的数据。因为,虚拟机在普通对象的元数据中可以确定java对象的大小,但是从数组对象中的元数据中就无法确定数组的大小。
2、实例数据
对象真正存储的有效信息,也是在程序代码中所定义的各种字段内容。
3、对齐填充
没有特别的含义,仅起到占位符的作用。


五、对象访问定位

对象建立好之后,我们怎么通过虚拟机栈上的reference来定位java堆中对象的具体位置呢?目前来说,有句柄和直接指针两种方式。具体使用哪一个,这取决于虚拟机的实现。
1、句柄
java堆中会划分一块内存来作为句柄池,refrence中存储的就是对象的句柄地址,而句柄中包含了实例数据与类型数据各自的具体地址信息。
特点:refrence存储的是稳定的句柄地址,改变的是句柄中的对实例数据指针
2、直接内存
refrence中存储的就是对象的地址。这种方式就必须考虑堆中如何放置访问类型数据的相关信息。
特点:速度快。


六、写到最后

我看这本书是边看划重点,然后在草稿纸上画图,写总结的点,最后再将自己的总结写到这里。文中难免有总结的不好的,如果大家在看的过程中有觉得不对的地方,欢迎指正,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值