java 对象占用内存
2016-01-15 13:50
267 查看
String 方法用于文本分析及大量字符串处理时会对内存性能造成一些影响。可能导致内存占用太大甚至OOM。
一、先介绍一下String对象的内存占用
一般而言,Java 对象在虚拟机的结构如下:
•对象头(object header):8 个字节(保存对象的 class 信息、ID、在虚拟机中的状态)
•Java 原始类型数据:如 int, float, char 等类型的数据
•引用(reference):4 个字节
•填充符(padding)
String定义:
JDK6:
private final char value[];
private final int offset;
private final int count;
private int hash;
JDK6的空字符串所占的空间为40字节
JDK7:
private final char value[];
private int hash;
private transient int hash32;
JDK7的空字符串所占的空间也是40字节
JDK6字符串内存占用的计算方式:
首先计算一个空的 char 数组所占空间,在 Java 里数组也是对象,因而数组也有对象头,故一个数组所占的空间为对象头所占的空间加上数组长度,即 8 + 4 = 12 字节 , 经过填充后为 16 字节。
那么一个空 String 所占空间为:
对象头(8 字节)+ char 数组(16 字节)+ 3 个 int(3 × 4 = 12 字节)+1 个 char 数组的引用 (4 字节 ) = 40 字节。
因此一个实际的 String 所占空间的计算公式如下:
8*( ( 8+12+2*n+4+12)+7 ) / 8 = 8*(int) ( ( ( (n) *2 )+43) /8 )
其中,n 为字符串长度。
http://lin-yp.iteye.com/blog/1683679
一、先介绍一下String对象的内存占用
一般而言,Java 对象在虚拟机的结构如下:
•对象头(object header):8 个字节(保存对象的 class 信息、ID、在虚拟机中的状态)
•Java 原始类型数据:如 int, float, char 等类型的数据
•引用(reference):4 个字节
•填充符(padding)
String定义:
JDK6:
private final char value[];
private final int offset;
private final int count;
private int hash;
JDK6的空字符串所占的空间为40字节
JDK7:
private final char value[];
private int hash;
private transient int hash32;
JDK7的空字符串所占的空间也是40字节
JDK6字符串内存占用的计算方式:
首先计算一个空的 char 数组所占空间,在 Java 里数组也是对象,因而数组也有对象头,故一个数组所占的空间为对象头所占的空间加上数组长度,即 8 + 4 = 12 字节 , 经过填充后为 16 字节。
那么一个空 String 所占空间为:
对象头(8 字节)+ char 数组(16 字节)+ 3 个 int(3 × 4 = 12 字节)+1 个 char 数组的引用 (4 字节 ) = 40 字节。
因此一个实际的 String 所占空间的计算公式如下:
8*( ( 8+12+2*n+4+12)+7 ) / 8 = 8*(int) ( ( ( (n) *2 )+43) /8 )
其中,n 为字符串长度。
http://lin-yp.iteye.com/blog/1683679
相关文章推荐
- java搜集电脑cpu、内存、磁盘空间信息
- SpringMVC mybatis or hibernate ehcache二级缓存maven非和maven版本
- netbeans提示后光标消失
- java获取当前路径的几种方法
- javax.persistence.PersistenceException: No Persistence provider for EntityManager named ...
- java 数据库查询工具类.
- 配置Java环境变量
- java 读取txt文件内容(二)
- 当更改了JDK版本之后JSP项目和Java项目在eclipse中如何更改到当前的JDK的方法
- Spring, MyBatis 多数据源的配置和管理
- Java resource loading explained.
- Java连接mysql数据库的程序
- Java 中几个常见的 length ,length(),size()
- 各种系统Dos下编译和运行java
- myeclipse从数据库反射生成实体类和映射文件
- eclipse+goclipse安装后不能联想和跳转问题解决
- 使用Spring4.x 搭建注解式 Spring MVC + JPA 项目
- ckeditor+jsp+spring配置图片上传
- 提取字符串里面的数字【java】
- Spring IoC的理解----找女朋友的方法