假如Java对象是个人······
假如Java对象是个人,那意味着它也具备了我们人所有的东西,头,身体,大长腿。
头
头就是我们的对象头(Header)。根据JAVA虚拟机规范,我们的对象头分为两部分,分别是存储对象自身的运行时数据和存储类型指针。
存储对象自身的运行时数据
这部分数据有HashCode、GC分代年龄、对象锁信息等。数据长度在32位和64位的虚拟机中分别为32bit和64bit,官方称它为Mark Word。
如下图所示:

hashcode 是对象内存地址信息通过哈希算法得到的int类型数据。
GC分代年龄 作用于GC回收时给对象做标记,新生代的对象每经历一次GC如果没有被回收的情况下,GC分代年龄+1,类似于我们人类长大了一岁,默认15是个临界点(可以通过JVM配置),当对象长到15岁的时候会从新生代转移到老年代。
对象锁信息 包含了锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这里由于自己了解不够深,所以不一一详细介绍以免误导。大概谈到一点,我们平时的代码如果不是类级别的synchronized锁,那么锁的都是该类对象的对象头,谁抢到对象头的锁谁先用。锁信息上面会记录抢到该锁的线程id,调用完方法后记录清除,其他线程开始新一轮的抢夺。
存储类型指针
类型指针,JVM通过该指针来判断该对象属于哪个类。
身体
身体就是对象的 实例数据(Instance Data),即我们在代码中定义的每个字段的具体内容,不管是从父类继承还是自身的,都会存储到该实例数据里面。
大长腿
大长腿就是整位补齐(Padding),依据JVM虚拟机规范定义,对象所占空间必须是8字节的整数倍,所谓“身高不够,工资来凑”是形容我们男同胞的,那么java对象字节不够的时候,就靠整位补齐来凑了。在这里整位补齐没有多余含义,仅仅是起着占位符的作用。
假如Java对象是个人······的更多相关文章
- JAVA对象是如何占用内存的
本文使用的是32位的JVM ,jdk1.6.本文基本是翻译的,加上了一些自己的理解,原文见文章底下链接. 在本文中,我们讨论如何计算或者估计一个JAVA对象占多少内存空间.(注意,使用 C ...
- [译]在运行时内存中的Java对象是怎么样的
(文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...
- java对象是如何创建的
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符合引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程. 在类加 ...
- Java对象是怎么创建的(通过对象的创建,了解JVM内存结构)
在代码层面,我们通过new关键字创建一个对象: Object obj=new Object(); 而虚拟机中,创建一个对象,则经过了许多环节,JVM的内存结构可以通过另一篇文章了解:一个“Hello ...
- java 对象是可以判空的
比如这里存xml,这里判断了一下element是否为空,来避免空指针异常,推荐用guava的optional判空
- JVM学习(1)——通过实例总结Java虚拟机的运行机制
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制
Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...
- Java中的OutOfMemoryError的各种情况及解决和JVM内存结构
在JVM中内存一共有3种:Heap(堆内存),Non-Heap(非堆内存) [3]和Native(本地内存). [1] 堆内存是运行时分配所有类实例和数组的一块内存区域.非堆内存包含方法区和JVM内部 ...
随机推荐
- 零基础入门学习Python(29)--文件:一个任务
知识点 一个任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来: #record.txt文件内容: 小客服:小甲鱼,今天有客户问你有没有女朋友? 小甲鱼:咦?? 小客服:我跟她 ...
- Springboot开启事务
参考资料: https://blog.csdn.net/message_lx/article/details/77584847
- 编程数学(A-2)-次方
百度百科:次方. 特别是一个数的负次方需要注意.
- restful(1):序列化
restful协议中,一切皆是资源,操作只是请求方式 model_to_dict()方法: from django.forms.models import model_to_dict obj = Pu ...
- scp远程文件传输
第一次.提示下载公钥 [root@rhel5 ~]# scp install.log root@192.168.124.129:/tmp The authenticity of host '192.1 ...
- 用vhd挂载并安装win7且建立分差vhd
准备:硬盘分区激活第一个分区; imagex.exe; install.wim; winpe boot pc 1.cmd命令下,创建主vhd (1)diskpart (打开dis ...
- Maven具体解释之仓库------本地仓库、远程仓库
在Maven中,不论什么一个依赖.插件或者项目构建的输出.都能够称之为构件. Maven在某个统一的位置存储全部项目的共享的构件.这个统一的位置.我们就称之为仓库.(仓库就是存放依赖和插件的地方) 不 ...
- Servlet学习笔记(八)—— 文件下载
一.文件下载概述 比如图片或者HTML这类静态资源,仅仅要在浏览器中打开正确的网址就行下载.仅仅要资源放在应用程序文件夹或者其下的子文件夹中,但不在WEB-INF下.Servlet/JSP容器就会将资 ...
- Postgis经常使用函数
1,基本操作函数 AddGeometryColumn(<schema_name>, <table_name>,<column_name>, <srid> ...
- cout 堆栈,operator<< 运算符重载输出问题
在C++中cout的输出流其中,有一些问题非常easy出错,就比方以下这道简单程序.看似简单.但却是一个值得深思的问题~~ #include <iostream> using namesp ...