在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小. 对象头 对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下: 对象的HashCode,锁信息等 到对象类型数据的指针 数组的长度(如果是数组的话) 规则 首先,任何对象都是8字节对齐,属性按照[long,double].[int,float].[char,short].[byte,boolean].referenc…
[ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖: <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.0.0</version> </dependency> 然后直接java代码即…
一.对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针)   1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年龄.锁状态标志.线程持有的锁.偏向线程 ID.偏向时间戳等等. JVM 对象头一般占用两个机器码,在 32-bit JVM 上占用 64bit, 在 64-bit JVM 上占用 128bit 即 16 bytes(暂不考虑开启压缩指针的场景). 另外,如果对象是一个 Java 数组,那在对象头中还…
String 方法用于文本分析及大量字符串处理时会对内存性能造成一些影响.可能导致内存占用太大甚至OOM. 一.先介绍一下String对象的内存占用 一般而言,Java 对象在虚拟机的结构如下:•对象头(object header):8 个字节(保存对象的 class 信息.ID.在虚拟机中的状态)•Java 原始类型数据:如 int, float, char 等类型的数据•引用(reference):4 个字节•填充符(padding) String定义: JDK6:private final…
这个问题一般会出现在稍微高端一点的 Java 面试环节.要求面试者不仅对 Java 基础知识熟悉,更重要的是要了解内存模型. Java 对象模型 HotSpot JVM 使用名为 oops (Ordinary Object Pointers) 的数据结构来表示对象.这些 oops 等同于本地 C 指针. instanceOops 是一种特殊的 oop,表示 Java 中的对象实例. 在 Hotspot VM 中,对象在内存中的存储布局分为 3 块区域: 对象头(Header) 实例数据(Inst…
介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用Instrumentation并且通过代理我们可以监测在JVM运行的程序的功能,它的原理是修改方法的字节码. 首先创建代理类 package com.dingtongblog.size; import java.lang.instrument.Instrumentation; public class…
案例一: User public class User { } UserSizeTest public class UserSizeTest { static final Runtime runTime=Runtime.getRuntime(); public static void main(String[] args) { final int count = 100000; User[] us=new User[count]; long heap1 = 0; for (int i = -1;…
public interface Instrumentation 此类提供检测 Java 编程语言代码所需的服务.检测是向方法中添加字节码,以搜集各种工具所使用的数据.由于更改完全是进行添加,所以这些工具不修改应用程序的状态或行为.这种无害工具的例子包括镜像代理.分析器.覆盖分析器和事件记录器.   http://www.iteye.com/problems/31779 http://www.jroller.com/maxim/entry/again_about_determining_size…
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理.分代GC.OOP-Klass模型等内容.最后推荐JDK自带的Hotspot Debug工具——HSDB,来查看对象在内存中的具体存在形式,以论证文中所述内容. 背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000…
最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: import java.lang.instrument.Instrumentation; import java.lang.reflect.Array; import java.lang.re…