zoukankan      html  css  js  c++  java
  • java 对象占用内存

    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

  • 相关阅读:
    台州 OJ 3847 Mowing the Lawn 线性DP 单调队列
    洛谷 OJ P1417 烹调方案 01背包
    快速幂取模
    台州 OJ 2649 More is better 并查集
    UVa 1640
    UVa 11971
    UVa 10900
    UVa 11346
    UVa 10288
    UVa 1639
  • 原文地址:https://www.cnblogs.com/SamuelSun/p/5133115.html
Copyright © 2011-2022 走看看