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过高的问题排查 举个例 ...
随机推荐
- Link List
At first, i prepared to go through <the introduction to algorithm> ,however , i found some par ...
- PS将图标变灰
方法一:直接去色,图像——调整——去色:快捷键ctrl+shift+U 方法二:图像——调整——灰白:快捷键shift+ctrl+alt+B;
- 开源IDE CodeBlocks的下载安装、配置、简单编程
如果没有集成开发环境(IDE),在linux下开发程序将非常繁琐,IDE是指将编辑.编译.调试等功能集成在一个桌面环境上,这样就大大方便了用户.IDE一般包括代码编辑器.编译器.调试器和图形界面用户工 ...
- poj 3692 二分图最大匹配
思路: 如果我们将认识的建边,求最大独立集就是互相不认识的人数.那么我们反过来,将不认识的建图,求最大独立集就是互相认识的人数. #include<cstdio> #include< ...
- Mac环境下svn的使用(转载)
在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...
- ActiveMQ(5.10.0) - Message Redelivery and DLQ Handling
When messages expire on the ActiveMQ broker (they exceed their time-to-live, if set) or can’t be red ...
- 微信之Android各版本列表
微信在不断地更新迭代,ios微信下载点击这里立即开始(手机电脑都可以,电脑端要安装iTunes),每个版本都放出一些新的功能或修复相关错误,详情可以点击下面的版本链接进行查看.(这里有Android微 ...
- ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失
代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...
- ecshop调用文章显示上一篇下一篇
首先调用文章中的上一篇和下一篇语法为: 代码如下 复制代码 上一篇:<a href="{$next_article.url}">{$next_article.titl ...
- Java开源 开源工作流
OpenEbXML 点击次数7801 Werkflow 点击次数11181 OSWorkflow 点击次数14988 wfmOpen 点击次数7997 OFBiz 点击次数1234 ...