【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& ...
随机推荐
- @ResponseBody中文乱码解决方案
java web项目,使用了springmvc4.0,用@ResponseBody返回中文字符串,乱码$$ 本以为很简单的问题,不过也找了一个小时. 网上有说这样配置的: <mvc:annota ...
- File 和 导出jar包
1.File import java.io.File; import java.io.IOException; public class FileTest { public static void m ...
- elasticsearch基本操作之--使用QueryBuilders进行查询
/** * 系统环境: vm12 下的centos 7.2 * 当前安装版本: elasticsearch-2.4.0.tar.gz */ QueryBuilder 是es中提供的一个查询接口, 可以 ...
- PC/FORTH 循环
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- 8.2 C++标准输出流对象
参考:http://www.weixueyuan.net/view/6408.html 总结: iostream头文件,包含了该头文件后,我们就可以直接使用这些对象,包含标准的输出流对象cout.ce ...
- 2.5 C++类class和结构体struct区别
参考:http://www.weixueyuan.net/view/6337.html 总结: 在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数. 在C++中,s ...
- 第二章 使用unittest模块扩展功能测试
2.1使用功能测试驱动开放一个最简单的应用 # functional_tests.py # -*- coding: utf-8 -*- from selenium import webdriver b ...
- <Spark Streaming><Flume><Integration>
Overview Flume:一个分布式的,可靠的,可用的服务,用于有效地收集.聚合.移动大规模日志数据 我们搭建一个flume + Spark Streaming的平台来从Flume获取数据,并处理 ...
- Android:DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
Android studio DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs 一.报错信息 DELETE_FAILED_INTERN ...
- 2019-03-25-day018-面向对象
re模块 字符串匹配 列表 = findall(正则表达式,待匹配的字符串) 找所有 结果集 = search 找第一个,结果集.group() 结果集 = match 从第一个字符开始匹配,结果集. ...