【JVM】java对象
一、对象内存布局
对象在内存中存储可分为3块区域:对象头,实例数据,对齐填充
1、对象头
对象头包含两部分内容。
第一部分:存储对象自身的运行时数据,哈希吗(hashCode),GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳。如果为数组,对象头还要包含给数组的长度。
第二部分:类型指针,即对象指向它的类元数据的指针。虚拟机通过这个指针确定这个对象是那个类的实例。
2、实例数据
对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。
3、对齐填充
不是必然存在。也没有特别含义。
对象大小必须是8个字节的整数倍。而对象头正好是8个字节的倍数。当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
二、对象引用
1、引用类型
强引用
软引用
弱引用
虚引用
2、强引用
http://benjaminwhx.com/archives/(强引用,弱引用介绍)
代码中普遍存在的。类似Object obj=new Object(),这类引用就是强引用。只要强引用存在,垃圾收集器永远不会回收掉被引用的对象
3、软引用
软引用用来描述一些还有用但并非必须的对象,对于软引用关联的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。
如果这次回收还没有足够的内存,才会抛出内存溢出异常。
提供了SoftReference类实现软引用
4、弱引用
也是用来描述非必须对象的。但它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。
提供WeakReference类实现弱引用。
5、虚引用
也被称之为幽灵引用或幻影引用。它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响。也无法通过虚引用获取对象的实例。
为一个对象设置虚引用关联的唯一目的就是在这个对象被收集器回收时,收到一个系统通知。
提供PhantomReference类实现虚引用。
三、对象生存还是死亡
即使可达性分析算法中不可达的对象,也并非是非死不可。这时候他们暂时处于“缓刑”阶段。
要真正宣告一个对象死亡,至少要经理两次标记过程。
1、当可达性性分析后发现没有GC roots相连接的引用链,那它将会被第一次标记并且进行一次筛选。
=》筛选条件是此对象是否有必要执行finalize()方法。
=》当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没必要执行”
2、 如果该对象被判定有必要执行finalize(),那么会将这个对象放置在一个叫做F-Queue的队列中,并稍后由虚拟机建立的低优先级Finalizer线程去执行它。所谓执行,只会触发,不等待方法执行结束。
finalize()方法是对象逃脱死亡的最后一次机会。可在方法执行体内,将自己(this关键字)赋值给某个类变量,或对象的成员变量。那么GC在F-Queue队列中进行第二次标记时,就会被移除“即将回收”集合之外,逃脱一次垃圾回收。如果这个时候还没有逃脱,则会被回收清理。
【finalize方法只会被虚拟机执行一次,代表一个对象只会有一次逃脱机会】
【JVM】java对象的更多相关文章
- JVM —— Java 对象占用空间大小计算
零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 须要知道缓存的对象是否会超过 JVM 最大堆限制, 假设会超 ...
- Java对象在JVM中的生命周期
当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时 ...
- Java对象的创建 —— new之后JVM都做了什么?
Java对象创建过程 1. 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没 ...
- Java虚拟机笔记(五):JVM中对象的分代
为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...
- 【深入理解JVM】:Java对象的创建、内存布局、访问定位
对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...
- JVM探秘:Java对象
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 对象的创建 虚拟机遇到一条 new 指令时,首先去检查这个指令的参数是否能在方法区常量 ...
- JVM源码分析之Java对象头实现
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Java对象头实现 HotSpot虚拟机中,对象在内存中的布局分为三 ...
- jvm源码解析java对象头
认真学习过java的同学应该都知道,java对象由三个部分组成:对象头,实例数据,对齐填充,这三大部分扛起了java的大旗对象,实例数据其实就是我们对象中的数据,对齐填充是由于为了规则分配内存空间,j ...
- 为什么JVM要用到压缩指针?Java对象要求8字节的整数倍?
前言 前两天在一个帖子中看到一道面试题: 堆内存超过32G时,为什么压缩指针失效? 之前没有了解过这方面的知识,于是开始google起来,但当我翻看了不下一页的帖子,我都仍然没有搞懂,因为好多答案给我 ...
- JVM知识(一) 求你了,别再说Java对象都是在堆内存上分配空间的了!
求你了,别再说Java对象都是在堆内存上分配空间的了! https://baijiahao.baidu.com/s?id=1661296872935371634&wfr=spider& ...
随机推荐
- 常见的SQLALCHEMY列类型
常见的SQLALCHEMY列类型.配置选项和关系选项 类型名称 python类型 描述 Integer int 常规整形,通常为32位 SmallInteger int 短整形, ...
- C++中重载(overload)、覆盖(override)与隐藏(oversee)
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- MFC 中GetClientRect、ClientToScreen、GetWindow、RectScreenToClient的使用
CWnd* pWnd = GetDlgItem(IDB_BUT_RECOGNIZE); pWnd->GetClientRect(&rect); //指该控件自身客户区的矩形,原点为控 ...
- SQL-19 查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
题目描述 查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工CREATE TABLE `departments` (`dept_no` c ...
- SUSE_LINUX 11 SP3 安装 IBM MQ 7.5
0.环境介绍 mq7.5 suse linux 11 1. 上传安装包 上传安装包到 softWare/CI79IML.tar.gz 2. 安装证书 sh ./mqlicense.sh 输入 1 同意 ...
- GNU C的定义长度为0的数组
在标准C和C++中,长度为0的数组是被禁止使用的.不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在 ...
- day 43 数据库的密码的的更改如何操作
day 43 数据库的密码的的更改如何操作 步骤: 1 首先看环境变量有没有配好 方法 查看计算机 高级系统设置 2 以上步骤完成后 运行 services 找到 mysql的停止 在启动 3,运行 ...
- 如何通过创建切片器窗格节省PowerBI报告空间
许多用户在使用Power BI的过程中,都会有这么一个困扰:在Power BI 开发中,切片器一旦过多就会占用非常多的空间.发生这种情况时,您显示数据的页面也会更加小.但另一方面,如果您没有切片器,报 ...
- asp.net mvc webapi 实用的接口加密方法(转载)
在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性. 安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大, ...
- Spring 配置文件
<?xml version="1.0" encoding="UTF-8" ?> <beans> <bean id=...> ...