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过高的问题排查 举个例 ...
随机推荐
- linux的rpm命令
rpm 执行安装包二进制包(Binary)以及源代码包(Source)两种.二进制包可以直接安装在计算机中,而源代码包将会由 RPM自动编译.安装.源代码包经常以src.rpm作为后缀名. 常用命令组 ...
- 纯JS操作服务器绑定控件(Repeat)实现表头升降排序
JS实现功能 var obj = function (id) { return "string" == typeof id ? document.getElementById(id ...
- Android(java)学习笔记106-1:深入分析Java ClassLoader原理
1. 前言: Android中的动态加载机制能更好的优化我们的应用,同时实现动态的更新,这就便于我们管理我们的应用,通过插件化来减轻我们的内存以及CPU消耗,在不发布新版本的情况下能更新某些模块. 当 ...
- 如何使用数据卷在宿主机和docker容器之间共享文件
共享宿主机的目录给容器 docker run -i -t -v ~/download:/home/hello python3-env /bin/bash -v 表示创建一个数据卷并挂载到容器里 ~/ ...
- Volly的使用及图片错位优化
listview显示数据,利用第三方jar包Volley下的ImageLoader加载图片时,当数据类型不一致,布局复用的时候会出现图片错位,因此需要自定义IMymageLoader实现ImageLo ...
- 转:云计算的三种服务模式:IaaS,PaaS和SaaS
转: http://www.cnblogs.com/beanmoon/archive/2012/12/10/2811547.html 云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, ...
- 用VS2015打开cshtml识图文件的时候会报错 如指定的文件不存在
用vs2015打开cshtml识图文件的时候会报错.百度后得到解决方法如下: 先关闭VS2015, 拷贝:%LocalAppData%\Microsoft\VisualStudio\14.0\Comp ...
- CSS3秘笈第三版涵盖HTML5学习笔记6~8章
第二部分----CSS实用技术 第6章,文本格式化 指定备用字体: font-family:Arial,Helvetica,sans-serif; 当访问者没有安装第一种字体时,浏览器会在列表中继续往 ...
- MySQL数据库中的触发器
--触发器是一类特殊的监控增删改操作,并产生相应的增删改的操作 --1,监视谁 2,监视动作 3,监视时间(之前或之后) 4,触发的事件 --触发器的简单语法 create trigger 触发器名字 ...
- Ehcache(2.9.x) - API Developer Guide, Blocking and Self Populating Caches
About Blocking and Self-Populating Caches The net.sf.ehcache.constructs package contains some applie ...