JVM-内存管理(一)

一、Java语言简介
(一)java语言发展趋势
1、模块化
模块化是建立各种功能的标准件的前提。OSGi技术兴起
2、混合语言支持
多种语言实现运行在同一个机器上
3、多核运算
4、进一步丰富语法糖
5、64位支持
(二)虚拟机种类
HotSpot(常用通用)、BEA JRockit、IBM J9
二、内存管理机制
(一)内存区域划分
在这里插入图片描述
(二) 虚拟机对象创建过程
1、虚拟机加载解释字节码文件,遇到new指令时开启对象创建。
2、虚拟机首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程
3、虚拟机将为新生对象分配堆内存空间。对象所需内存的大小在类加载完成后便可完全确定
(1)虚拟机内存分配方式
1.指针碰撞
假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。适用于Serial、ParNew等带Compact过程的垃圾收集器
2.空闲列表
Java堆中的内存并不是规整,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。适用于基于Mark-Sweep算法的垃圾收集器
(2)内存分配并发问题
1.虚拟机采用CAS配上失败重试的方式保证更新操作的原子性
2.本地线程分配缓冲
内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,再通过线程缓冲分配内存
4、虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头)
5、虚拟机要对对象进行必要的设置,包括这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中

(三)对象的内存布局
对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(InstanceData)和对齐填充(Padding)。
1、对象头(两部分)
(1)、存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为“Mark Word”
(2)对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据
2、实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来,相同宽度的字段总是被分配到一起。
3、对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。HotSpot VM的自动内存管理系统要求对象的大小必须是8字节的整数倍,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全

(四)对象访问定位
1、含义
Java程序需要通过栈上的reference数据来操作堆上的具体对象,reference类型在Java虚拟机规范中只规定了一个指向对象的引用
2、方式
(1)句柄访问
reference中存储的就是对象的句柄地址,句柄地址通过访问访问句柄池先到的对应的句柄,而句柄中包含了对象实例数据与类型数据各自的具体地址信息,最后拿到对象地址值访问对象。
(2)直接指针访问
reference中存储的直接就是对象地址

(五)java内存溢出问题
1、Java堆内存溢出
2、java虚拟机内存溢出
在单个线程下,无论是由于栈帧太大还是虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出的都是StackOverflowError异常
每个线程分配到的栈容量越大,可以建立的线程数量自然就越少,建立线程时就越容易把剩下的内存耗尽

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值