【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& ...
随机推荐
- Java压缩文件
压缩文件 package com.iss.cpf.windmanger.userprivilegeexport.bizlogic; import java.io.BufferedInputStream ...
- oracle中的对象创建及删除语句【原创】
oracle对象 1.表 a)创建表1 create table students( id number(10), stuno number(10) , sex varchar2(2), age in ...
- 反片语 UVA 156
//该单词不能通过字母重排,得到输入文本中的另外一个单词.在判断是否满足条件时,字母部分大小写 #include<iostream> #include<vector> #inc ...
- Windows系统上设置 Git Bash 的 Font 及 Locale
在windows 上使用 Git Bash 可以获得 unix 命令 操作体验. 但是初始的Git Bash的字体及语系都很不方便,需要自己设置. 在Git Bash的命令窗体上边框点击鼠标右键可以进 ...
- SignalR 前期简单配置
一.随便你在哪个命名空间下新建一个Startup类,并在在该类中注册SignalR. using Owin; using System; using System.Collections.Generi ...
- 堆排序,图解,C/C++实现
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- win10企业版激活
slmgr.vbs /upk slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43 slmgr /skms zh.us.to slmgr /ato
- linux入门经验之谈
一. 选择适合自己的linux发行版 谈到linux的发行版本,太多了,可能谁也不能给出一个准确的数字,但是有一点是可以肯定的,linux正在变得越来越流行, 面对这么多的Linux 发行版,打 ...
- Cracking The Coding Interview 1.1
//原文: // // Implement an algorithm to determine if a string has all unique characters. What if you c ...
- SQLite3 C/C++ 开发接口简介
SQLite3 C/C++ 开发接口简介 1.0 总览 SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和 ...