【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& ...
随机推荐
- ng-table
需要的文件: angular.js ng-table.js ng-table.css bootrasp.css 注入依赖: var app = angular.module('app', [ 'ngT ...
- CentOS7安装配置Bacula yum方法
参考: https://www.baidu.com/link?url=o2QIy2YZWjsJPAFJuYFhrH3nPvtyRkSe-o5Q_FqFZ5E1EMOsIOmGeKm0HAonwHOw8 ...
- 項目当中使用的easyui的模板crud页面
1.简单的增删改查页面: 第一步骤:html原型型编写,写法参照了easyui demo中form有关html等 <!DOCTYPE html> <html> <head ...
- scanf *的用法
scanf *的用法 char a[LEN]="12:13:14"; char i,j,k,h,l,m; sscanf(a,"%*c%*c:% ...
- redis_key键
exists k1,判断k1是否存在,‘1’就是存在,‘0’ 就是不存在 move k3 2 --->这里就是说把k3移动到2号库. ‘1’为成功,‘0’为失败 ttl k2 --查看k2 ...
- 五、LCD屏填充纯色
废话不说,直接上代码: lcd.c #include "lcd.h" static int PEN_COLOR = LCD_RED; /* 定义画笔(前景)颜色 */ static ...
- centos6.6安装hadoop-2.5.0(三、完全分布式安装)
操作系统:centos6.6(三台服务器) 环境:selinux disabled:iptables off:java 1.8.0_131 安装包:hadoop-2.5.0.tar.gz hadoop ...
- javascript性能优化之使用对象、数组直接量代替典型的对象创建和赋值
1.典型的对象创建和赋值操作代码示例 var myObject = new Object(); myObject.name = "Nicholas"; myObject.count ...
- RAD Studio August 2018 Roadmap
路线图: https://community.embarcadero.com/article/news/16638-rad-studio-august-2018-roadmap 路线图评论: http ...
- Python 区分方法和函数
def func(): print("我是函数") class Foo: def chi(self): print("我是吃") # print(func) # ...