字符串与 char[]

2024-05-24

我有一些来自 IBM 的幻灯片,名为:“从 Java 代码到 Java 堆:了解应用程序的内存使用情况” http://www.ibm.com/developerworks/library/j-codetoheap/#N101DC,也就是说,当我们使用String代替char[], 有

单个角色的最大开销为 24:1!

但我无法理解这里提到的开销是什么。有人可以帮忙吗?

Source :


该数字涉及 JDK 6-32 位。

JDK 6

在 Java-7 之前的世界中,字符串被实现为指向某个区域的指针char[] array:

// "8 (4)" reads "8 bytes for x64, 4 bytes for x32"

class String{      //8 (4) house keeping + 8 (4) class pointer
    char[] buf;    //12 (8) bytes + 2 bytes per char -> 24 (16) aligned
    int offset;    //4 bytes                     -> three int
    int length;    //4 bytes                     -> fields align to
    int hash;      //4 bytes                     -> 16 (12) bytes
}

于是我数了一下:

36 bytes per new String("a") for JDK 6 x32  <-- the overhead from the article
56 bytes per new String("a") for JDK 6 x64.

JDK 7

只是为了比较,在 JDK 7+ 中String是一个持有char[]缓冲器和一个hash仅字段。

class String{      //8 (4) + 8 (4) bytes             -> 16 (8)  aligned
    char[] buf;    //12 (8) bytes + 2 bytes per char -> 24 (16) aligned
    int hash;      //4 bytes                         -> 8  (4)  aligned
}

So it's:

28 bytes per String for JDK 7 x32 
48 bytes per String for JDK 7 x64.

UPDATE

For 3.75:1比率请参阅下面@Andrey的解释。随着字符串长度的增加,这个比例会下降到 1。

有用的链接:

  • Java 字符串和字符串相关对象的内存使用情况 http://www.javamex.com/tutorials/memory/string_memory_usage.shtml.
  • 计算地图条目的内存 https://stackoverflow.com/questions/20458456/calculate-memory-of-a-map-entry/20459081#20459081- 一种获取物体大小的简单技术。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串与 char[] 的相关文章

随机推荐

  • 如何在 Xamarin Forms 中做出长按手势?

    您能否告诉我如何识别 Xamarin Forms 应用程序中的长按手势 前几天我用过TapGestureRecognizer TapGestureRecognizer imageTap new TapGestureRecognizer im
  • 如何检查该字段是否存在? SAP 图形用户界面脚本

    如何检查该字段是否存在 我尝试过这个 If session findById wnd 1 setFocus Then 你可以尝试例如下列 on error resume next session findById wnd 1 setfocu
  • Git hook:如果创建了新分支,则将新文件添加到存储库

    我正在编写一个 git hook 它检查是否创建了新分支 如果是 则将一些预定义文件添加到该新分支的存储库中 一些配置文件 然而 由于分支实际上正在创建过程中 所以我的逻辑失败了 目前我正在这样做post receive钩子 看起来像这样
  • 跨平台套接字

    我知道 Windows 不使用 UNIX 套接字 而 Mac OS 使用 到目前为止 我的软件是跨平台的 没有任何代码更改 但现在我想让它进行一些网络通信 我了解 POSIX 套接字 但我对 Windows 的套接字一无所知 目标是实现一个
  • 对翻译进行语义标记

    我正在标记一份历史手稿 该手稿已从德文翻译成英文 在网页上 我将并排提供两种语言 是否有一种可接受的方法来标记这种情况 我正在考虑使用部分标签分割翻译块并为每个翻译块提供一个 lang 属性 然而 从语义上讲 这无法传达一个部分与另一部分大
  • 连接数据库错误类型:2002:权限被拒绝

    我正在尝试使用以下脚本连接数据库 cxn test php
  • TranslateAnimation 在 Android 上如何工作?

    我经历了 TranslateAnimation float fromXDelta float toXDelta float fromYDelta float toYDelta 但我仍然很困惑如何Translate animation wor
  • Golang 结构体初始化

    有一个像这样的简单结构 type Event struct Id int Name string 这两种初始化方法有什么区别呢 e1 Event Id 1 Name event 1 e2 Event Id 2 Name event 2 为什
  • 同时使用 localStorage 和 REST 远程服务器的数据层架构

    任何人对于如何实现同时使用 localStorage 和 REST 远程存储的数据持久层都有任何想法或参考 某个客户端的数据存储在 localStorage 中 使用 ember data indexedDB 适配器 本地存储的数据与远程服
  • 如何应用 .diff 文件

    我有一个 diff 类型文件 看起来像爆炸了 diff git a res User lua b res User lua index db8c2cc 4d2af0f 100644 a res User lua b res User lua
  • mysqli_num_rows 无法正常工作

    I have an admin panel in my website in which the admin creates new pages he provides the page name and then the spaces o
  • 在上下文切换期间,操作系统是否使用 PCB 或内核堆栈来恢复寄存器?

    我目前正在阅读 Remzi 和 Andrea 所著的 操作系统 三个简单的部分 在有关上下文切换的部分中 它指出在中断期间 正在运行的进程的寄存器被保存到其内核堆栈中 然后将运行进程的寄存器保存到内核堆栈中 下一个进程是从 PCB 加载的
  • 使用Python查明时区当前是否处于夏令时[重复]

    这个问题在这里已经有答案了 我们有一个在 GMT 时间运行的服务器 我需要编写一个 Python 脚本来确定当前 此时此刻 加利福尼亚州洛杉矶是否为夏令时 DST 我怎样才能做到这一点 我查看了 pytz 和 time 但我无法弄清楚 我意
  • 以受限用户身份运行 monit 并使其监视需要 root 权限的进程

    我有一个用 Ruby 编写的特定脚本 需要 root 权限 大多数其他进程不需要它 因此很容易在 Monit 中设置 不是这个 服务器需要监听386 这个端口只有root可用 我不会详细说明原因 因为 1 我不是一个低级的人 2 到目前为止
  • 通过 exec() 的 Crontab 不适用于 PHP 7.4 / Deb 10

    调试有点困难 因为我正在使用新版本的 PHP 和新服务器上的新操作系统 我有一个 PHP 的 cron 管理系统 它也允许我添加 删除或启用 禁用 cronjobs 在另一台当前使用 PHP 7 2 的 Deb 8 服务器上 它可以使用以下
  • 如何验证 MS Azure AD 生成的 JWT id_token?

    我有一个 angularjs SPA Web 应用程序 它使用ADAL JS https github com AzureAD azure activedirectory library for js 和 adal 角度 它被设置为在 MS
  • 使用 str_replace 使其仅作用于第一个匹配项?

    我想要一个版本str replace 仅替换第一次出现的 search in the subject 有没有一个简单的解决方案 或者我需要一个 hacky 解决方案 虽然没有它的版本 但解决方案一点也不黑 pos strpos haysta
  • 如何将BufferedImage转换为图像以在JSP上显示

    我想转换BufferedImage将显示在 JSP 页面上的图像 我怎样才能实现这个目标 首先 JSP是一种视图技术 提供了编写HTML CSS JS的模板以及与后端Java代码交互以控制页面流和访问后端数据的能力 你的问题更多的是在 HT
  • 看起来 MSVS 11.0 Beta 破坏了 MSVS 10.0 安装

    安装 MSVS 11Beta 后 我的 MSVS 10 遇到了编译问题 现在 当我在 MSVS 10 中编译 C 项目 在 MSVS 10 中创建的项目 目标框架 3 5 时 出现错误MSB4216 MSB4028输出窗口中包含以下文本 1
  • 字符串与 char[]

    我有一些来自 IBM 的幻灯片 名为 从 Java 代码到 Java 堆 了解应用程序的内存使用情况 http www ibm com developerworks library j codetoheap N101DC 也就是说 当我们使