JAVA对象是如何占用内存的
- 在某些情况下,JVM 不一定会把对象放到堆中。例如,一个简单的线程本地对象可以存放在栈中。
- 一个对象占用的内存还依赖于它的当前状态:例如,这个对象的同步锁是否是处于竞争状态,或者 这个对象是否正在被GC回收。

- 对象头,包括一些对象的状态。一个实例对象在堆中的内存消耗不仅仅花在它的属性上,这个对象还需要一些额外的信息,例如,保存一个对象的类引用和判断这个对象是否可以到达的,当前同步锁的情况的状态标记符等。
在HotSpot中:(其他的JVM的情况也跟以下描述差不多。)
- 一个普通的对象需要8个字节的额外内存空间
- 一个数组需要12个字节(普通对象头的8个字节+4个)
- 基本类型的内存消耗,如int,long,float等
- 引用属性的内存消耗,每个引用消耗4个字节。
- 填充,一个对象可能有一小部分的消耗浪费在填充上面。在HotSpot中,给对象分配内存最小单位是8个字节所以每个对象的占的字节数都是可以被8整除的。如果一个对象所占的字节数不是8的倍数,那么向上取最接近的可以被8整除的数字。
- 对象头占用了8个字节
- 2个long占用了16字节
- 3个int占用了12个字节
- 1个boolean占用了1个字节
- 填充字节占用了3个字节。前面一共占用了37个字节,37不能被8整除,取40字节。
- 在JAVA中,数组是一种特殊类型的对象
- 一个多维数组是一个简单数组的数组

- 一个JAVA String 包含不止一个对象
- 一个JAVA char占用两个字节。
- 一个JAVA对象包含一些额外的变量。
8 * (int) ((((no chars) * 2) + 45) / 8)
- 把字符串的字符个数*2个字节
- 增加38
- 如果结果不是8的倍数,取比结果大并且最接近的可以被8整除的数。
- 如果一个String是另外一个String的子字符串,那么这个String会比上面说到的最小值要大。
- 一个子字符串可以共用同一个字符数组,所以总体来说,一个父字符串加上几个子字符的消耗要比用上面公式计算的总和要小。
- 一个char数组(是个独立的对象用来存储字符串中的字符)
- 一个int 的offset属性(偏移量,用来指出字符串是从char数组中第几个字符开始的)
- 一个int 的count属性(字符串的长度)
- 最后一个int的hash属性(用来存储hashCode的值)
- 如果在创建完子字符串之后还需要用到父字符串的话,你可以省了些内存。
- 如果创建完子字符串之后就不再需要用到父字符串的话,那么就浪费了内存
String str = "Some longish string...";
str.substring(5, 4);
String str = "Some longish string...";
str = new String(str.substring(5,4));
资料:
http://www.javamex.com/tutorials/memory/object_memory_usage.shtml 介绍JAVA对象的内存占用 http://www.javamex.com/tutorials/memory/array_memory_usage.shtml 介绍JAVA数组的内存占用 http://www.javamex.com/tutorials/memory/string_memory_usage.shtml 介绍JAVA字符串的内存占用JAVA对象是如何占用内存的的更多相关文章
- java优化占用内存的方法(一)
java做的系统给人的印象是什么?占 内存!说道这句话就会有N多人站出来为java辩护,并举出一堆的性能测试报告来证明这一点.其实从理论上来讲java做的系统并不比其他语言开发出来的 系统更占用内存, ...
- 关于Java占用内存的研究
最近对程序占用内存方面做了一些优化,取得了不错的效果,总结了一些经验简要说一下,相信会对大家写出优质的程序有所帮助下面的论述针对32位系统,对64位系统不适用,后叙 经常你写了一个程序,一测试,功能没 ...
- 一步步优化JVM四:决定Java堆的大小以及内存占用
到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说:JVM部署模型.JVM运行环境.收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则.这一步将介绍如何评估应用需要的内存大小以及Java ...
- Java进程占用内存过高,排查解决方法
最近收到邮件报警,说内存使作率达到84%.如下图: 解决方法: A:可能是代码原因导致的问题: 1.使用命令:top 查看当前进程的状态 2.从上图可以看到PID:916的java进程占用内存较大.定 ...
- java 一个对象多少大,占用多少内存
1.instrumentation这种方法还是靠谱的 一个对象占用多少字节? 2.sizeof库 <!-- https://mvnrepository.com/artifact/com.carr ...
- 数据库数据在Java占用内存简单估算
数据库数据在Java占用内存简单估算 结论: 1.数据库记录放在JAVA里,用对象(ORM一般的处理方式)须要4倍左右的内存空间.用HashMap这样的KV保存须要10倍空间; 2.假设你主要数据是t ...
- Java 进程占用内存过多,幕后元凶原来是线程太多
那天中午吃饭,一个同事说,那个项目组的人快气死我了,程序有问题,早晨在群里@了他们,到中午才回消息,然后竟然还说他们的程序没有问题,是我们这边调用的太频繁了. 简直想笑. 背景说明 我们当前这个系统和 ...
- 对《java程序员上班那点事》笔者对数组占用内存质疑
1.<java程序员上班那点事>笔者对数组占用内存的描述 2.实际测试情况: /** * 测试一维数组占用内存 */ public static void testOneArray() { ...
- Java中的CPU占用高和内存占用高的问题排查
下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...
随机推荐
- UNIX基础知识之文件和目录
程序清单1-1 列出一个目录中的所有文件(ls命令的简要实现): [root@localhost unix_env_advance_prog]# cat prog1-.c #include " ...
- Pretty Poem
Poetry is a form of literature that uses aesthetic and rhythmic qualities of language. There are man ...
- Debian 7 安装 Emacs 24.3
Emacs 24.3出来好久了,但是在Debian 7里还是Emacs 23的版本. 以下是安装步骤(9步): -dev libncurses5-dev autoconf automake texin ...
- Git基本命令和GitFlow工作流
本篇博客讲解了git的一些基本的团队协作命令,和GitFlow工作流指南 git 团队协作的一些命令 1.开分支 git branch 新分支名 例如,在master分支下,新开一个开发分支: git ...
- Java Concurrency - Semaphore 信号量
Semaphore 是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得 semaphore.如果 semaphore 的内部计数器的值大于 0,那么 semapho ...
- OpenXml Excel数据导入导出(含图片的导入导出)
声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...
- 重叠I/O之可等待的重叠I/O【系列一】
一 什么是异步I/O 同步I/O和异步I/O的关键不同就是在发出I/O请求后,线程是否会阻塞.当线程发出一个设备I/O请求的时候,线程会被挂起来,直到设备完成I/O请求为止,这称之为同步I/O.而对于 ...
- Swift字典类
在Foundation框架中提供一种字典集合,它是由“键-值”对构成的集合.键集合不能重复,值集合没有特殊要求.键和值集合中的元素可以是任何对象,但是不能是nil.Foundation框架字典类也分为 ...
- 在button中加入一个view图片
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- (转)实战Memcached缓存系统(7)Memcached的一些基础FAQ
1. Memcached是什么? Memcached是分布式的内存对象缓存系统. 2. Memcached的基本数据结构是什么? Memcached是基于Key/Value对的HashMap.每一对, ...