【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& ...
随机推荐
- 用大白菜U盘安装:[3]Ghost版Win7系统
Ghost版Win7系统安装步骤: 1,先下载Ghost Win7系统到硬盘中,然后在U盘或其它硬盘根目录中新建一个GHO文件夹,注意:决不能把文件夹建在C盘(系统盘)中,然后用UltraISO或者W ...
- day21-python操作mysql1
python的mysql操作 mysql数据库是最流行的数据库之一,所以对于python操作mysql的了解是必不可少的.Python标准数据库接口为Python DB-API, Python DB- ...
- jsp自定义标签开发
参考:http://blog.csdn.net/lw001x/article/details/7589302
- bs4 CSS选择器
#https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#find-all #beautifulSoup可以解析HTML ...
- core1.1 升级到 2.0
1.直接修改项目 1.1 改成 2.0 Startup 的修改 去除构造函数中下面的代码 var builder = new ConfigurationBuilder() .SetBasePath(e ...
- bootstrap-select 下拉多选组件
<div class="form-group"> <label class="col-lg-2 col-sm-2 control-label" ...
- 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现(一)[超详细教程] ubuntu16.04版本
谷歌宣布开源其内部使用的 TensorFlow Object Detection API 物体识别系统.本教程针对ubuntu16.04系统,快速搭建环境以及实现视频物体识别系统功能. 本节首先介绍安 ...
- 二、先在SD卡上启动U-boot,再烧写新的U-boot进Nandflash
1. 制作SD卡 先准备一张2G的SD卡(不能用8G的,2G的卡和8G的卡协议不一样),和烧写SD卡的工具write_sd以及需要烧写到SD卡中的u-boot-movi.bin.将SD卡格式化后连接到 ...
- 框架:MVC
MVC 一.介绍 MVC是模型-视图-控制器的缩写,一种软件思想,强制性的把应用程序的输入.处理和输出分开.可以和任何的重定向能解耦. 三部分的任务说明: 视图:获取数据,显示数据 模型:处理数据 控 ...
- 使用zabbix-java-gateway可以通过该网关来监听多个JVM
我们知道监控主机和网络性能指标情况可以使用zabbix很好解决,分析起来也很方便,Zabbix主要功能: - 自动发现服务器与网络设备 - 分布式监视以及WEB集中管理功能 - 可以无agent监视 ...