一般而言,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 为字符串长度。
分享到:
相关推荐
### 创建string对象过程的内存分配详解 #### 一、引言 在Java中,`String` 类是最常用的数据类型之一,用于表示不可变的字符序列。`String` 对象的创建涉及复杂的内存分配机制,特别是在Java虚拟机 (JVM) 的环境中...
### 浅谈Python对象内存占用 在探讨Python对象内存占用之前,我们首先需要理解Python语言的一个核心特性:**一切皆对象**。这意味着Python中的每一个元素,无论是简单的数值、布尔值还是复杂的函数,都被视为对象...
例如,使用`String`的`intern()`方法可以确保重复的字符串引用同一个常量池中的实例,从而减少内存占用。同时,合理使用`StringBuilder`或`StringBuffer`进行字符串拼接,而非多次创建`String`对象,也能提高效率。
编译期的字面量共享可以减少内存占用,而执行期的`new`操作则会导致额外的内存开销。合理选择创建方式,结合使用`StringBuilder`或`StringBuilder`,可以在保证代码可读性的同时提高程序效率。在实际开发中,应根据...
9. **内存占用**: 字面量创建的`String`对象会共享内存,而通过构造函数创建的则会在堆中分配新的内存空间。 10. **String局部变量与成员变量**: 在方法内部声明的`String`变量是局部变量,其生命周期仅限于该...
一个空的String对象占用28个字节的内存,包含了一个指向字符数组的引用、一个偏移量、一个字符的长度和一个哈希码。当字符串内容非空时,内存占用会增加,因为需要存储字符数据。例如,字符串"ab"会占用28 + 2 * 2 =...
首先,我们需要理解Java对象内存占用的基本原理。每个Java对象都由三部分组成:对象头(Object Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含对象引用和类型信息,实例数据是对象实际存储...
标题中的“使用PYTHON动态控制LINUX系统的内存占用百分比”是指通过Python编程语言来实现对Linux操作系统的内存使用情况进行实时的调整,以达到指定的内存占用百分比。这个过程包括了内存的动态申请和释放,以及监控...
new了一个对象之后,它申请占用了一块堆内存,当把这个对象指针置为null时或者离开作用域导致被销毁,那么这块内存没有人引用它了在JS里面就会被自动垃圾回收。但是如果这个对象指针没有被置为null,且代码里面没...
为了防止这种情况,可以使用BitmapFactory的Options对象,通过设置`inSampleSize`来缩小图片的尺寸,从而减少内存占用。例如,`inSampleSize = 10`表示加载图片时的分辨率是原始大小的1/10,大大降低了内存需求。...
\[ \text{字符串内存占用} = \text{String类头大小} + \text{字符数组占用空间} \] 其中,String类头大小固定为24字节。而字符数组占用空间的计算则稍微复杂一些。根据字符串长度的不同,其占用空间有所不同。具体...
这一特性对于Java内存管理有着重要影响,因为String对象会存储在方法区的字符串常量池中,以避免重复创建相同的字符串,从而提高内存使用效率。 在JDK 8版本中,字符串常量池的位置发生了变化,从方法区移至Java堆...
8、程序里不可避免大量使用字符串处理,避免使用 String,应大量使用StringBuffer,每一个 String 对象都得独立占用内存一块区域。 在使用字符串时,应该避免使用 String,而应该使用 StringBuffer,以免内存溢出。...
通过对“String容量大小区分”的分析,我们了解到Java中String对象的独特行为及其对内存管理的影响。为了提高代码效率并避免不必要的资源浪费,开发者应该合理选择字符串创建方式,尤其是在涉及大量字符串操作的场景...
同时,记录并分析堆转储文件(Heap Dump),找出内存占用高的对象和类,对症下药。 6. **升级或切换版本**:如果Jetty 8的内存溢出问题难以解决,可以考虑升级到更稳定或内存管理更优化的版本,如Jetty 9或更高版本...
- `String`的内存占用:`String`对象的值是常量,一旦创建就会在内存的常量池中存储,修改`String`对象实际上是在常量池中创建新的对象。如果程序中有很多未被引用的旧`String`对象,它们不会立即被垃圾回收,可能...
本文总结了9种方法来降低C# WinForm应用程序的内存占用,旨在帮助开发者创建更加高效的应用。 1. **使用性能测试工具**:dotTrace 3.0是一款强大的性能分析工具,它可以帮助开发者识别程序中哪些代码段消耗内存最多...
- 字符串相等性测试时,使用`string`比直接比较两个`String`对象更直观,因为它默认实现了值的比较而非引用的比较。 ### `string`详解 #### 声明空字符串 - `string s = string.Empty;` - 这种方式声明的是一个...