string.intern

时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也是如此,并认为分享最近的一个战争故事会很有趣。 在这种情况下,我们就有机会使用String.intern()之类的简单补丁来修补应用程序。 但是,让我从头开始。

当前的应用程序正遭受内存不足的困扰,甚至在最近的更改后也无法启动。 症状包括JVM重新启动后CPU使用率过高,然后几分钟后出现致命的OutOfMemoryError:日志中的堆空间 。 快速查看堆内容使我们产生了疑问-应用程序正在将数百万个对象加载到某个内部数据结构中。

与开发团队进行的背景调查显示,加载的对象数量最近乘以两倍-而不是大约500万个对象,应用程序现在必须处理大约一千万个内存实例。 实际上,这可能会占用一些堆空间。 但是,知道可能的原因并不会给我们带来太大帮助-企业主绝不愿意放弃他们刚刚获取的宝贵数据。

深入研究手头的数据结构,我们发现其在下面过度使用了字符串。 对于我们的任何读者来说,这都不奇怪。 但是其中一些字符串包含重复的表示内容。 您可以将地址元素(例如街道名称和/或国家/地区)视为等效的情况。

快速解决方案开始在我们的脑海中酝酿。 如果我们内部化那些重复的字符串怎么办? 与应用程序的开发人员Swift核实之后,我们获得了绿灯。 开发人员保证,将包含实习的副作用,例如记住String.intern()与我们内部化的Strings进行比较的所有字符串。 感谢上帝的封装。

现在我们只需要了解内部化要引入多少CPU开销。 令我们惊讶的是,实习到大约1000万个琴弦只花了不到四分钟的时间。 并为我们节省了大约不足的500MB内存。 因此,节省了时间。

现在,在您跳至应用程序并开始内部化将要找到的所有Strings之前,我必须事先警告您。 有很多可能出错的地方:

  • 您内部化的字符串将从堆中消失,并移至永久代。 因此,请确保您在permgen空间中有足够的空间。
  • 确保将要与内部化的字符串进行比较的所有字符串内部化。 否则,您将在应用程序中创建最讨厌的错误类型。
  • 确保可以忍受内部化时的CPU开销。 这是一个本机方法调用,因此它将完全取决于您的特定平台,因此请确保在进行生产更改之前尝试一下

我们承认这种情况很少见–数据结构包含许多重复的String对象,并与应用程序集成在一起,从而使我们能够隔离快速修复。 甚至在我们的情况下,该修复程序很快也被开发人员删除,他们将数据结构重新设计为更合理的图形表示形式。

但是除了警告-Java虚拟机中内置了有趣且有用的工具。 知道如何使用它们,并提防它们的副作用,它们将成为您的朋友。 谨慎使用它们,您可以轻松终止应用程序。 您最好的朋友将永远是在您自己的应用程序之上构建的实际测试用例。

参考: Plumbr Blog博客上的JCG合作伙伴 Nikita Salnikov Tarnovski的 String.intern()减少了内存使用 。

翻译自: https://www.javacodegeeks.com/2013/06/reducing-memory-usage-with-string-intern.html

string.intern

string.intern_使用String.intern()减少内存使用相关推荐

  1. 使用String.intern减少内存使用

    最近写一个程序,从文件中读取一些字/词,然后存储起来供别的类引用. 对每个读入的词创建一个String,结果许多同样内容的也会存储多份,会占用大量内存. 开始的一个想法是使用map/set来存储所有遇 ...

  2. [转]String 之 new String()和 intern()方法深入分析

    引入 String,是 Java 中除了基本数据类型以外,最为重要的一个类型了.很多人会认为他比较简单.但是和 String 有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对: Q1:S ...

  3. java String 最长长度和占用内存大小

    一 序 String在内存中的最大长度理论上是int型变量的最大值,Integer.MAX_VALUE, String的字面常量的最大长度为CONSTANT_Utf8_info表决定,一般为65535 ...

  4. string与stringBuilder的效率与内存占用实测

    string与stringBuilder的效率与内存占用实测 using UnityEngine; using System.Diagnostics; using System.Text; using ...

  5. 缓冲池、String/StringBuffer/StringBuilder、intern()

    1.缓冲池 1.1 new Integer(123) 与 Integer.valueOf(123) 的区别在于: new Integer(123) :每次都会新建一个对象 Integer.valueO ...

  6. String类中的intern()方法详解

    来源地址:https://blog.csdn.net/soonfly/article/details/70147205 在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String ...

  7. java string占用内存_Java中String到底占用多大的内存空间?

    写在前面 对于Java中的String类占用多大的内存空间这个问题,是最近面试中问的比较多的一个问题.很多小伙伴的回答的都不是很正确,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有 ...

  8. 关于String str1 = “123“ 和 String str2 = new String(“123“)内存分析

    最近在自学java基础,由于嵌入式以后的就业前景不是很好,加上自己本学期学习了51单片机发现自己对硬件不是很在行,可能是因为初中以来物理一直不是很好吧,导致自己现在一看到电路板,电压电阻电流都会产生一 ...

  9. Java: String概述、对象创建的内存原理

    1.String 概述 java.lang.String 类代表字符串,String类定义的变量可以用于指定字符串对象,然后操作该字符串. Java程序中的所有字符串文字(例如:"abc&q ...

最新文章

  1. ORB_SLAM2程序入口(System.cc)
  2. java 枚举类型的使用_JAVA 枚举类型使用
  3. Redis操作Hash相关API
  4. 从镜头到滤光片 解读光学透雾监控摄像机
  5. linux 获取指定目录最大深度(层数)02
  6. paip.c++ gcc 不能捕获exception异常的解决
  7. EEGLAB 脑电数据处理与分析
  8. ARINC615-3 与 ARINC844 PART2 协议解析 思维导图
  9. 教你如何免费使用云服务器
  10. work with用法
  11. 从rman 备份中恢复表
  12. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
  13. 逻辑移位和算术移位的区别
  14. 2019年个税计算excel模板
  15. Python 计算思维训练——字典与字符串练习(二)
  16. loadrunner Web_类函数之web_set_user()
  17. 力扣题:977. 有序数组的平方
  18. ajax提交时页面转圈,jquery的ajax提交时loading提示的处理方法
  19. The 2022 ICPC Asia Regionals Online Contest (II) A、B、E、F、G、J、L
  20. iOS 招聘感悟(已经回暖)

热门文章

  1. 洛谷P2501数字序列 动态规划
  2. JFreeChart(七)之气泡图表​​​​​​​
  3. JavaFX官方教程(五)之在JavaFX中创建表单
  4. mybatis入门(一)之基础安装
  5. Java 线程池详解及实例代码
  6. JAVA面试常考系列三
  7. SpringMVC表单验证器的使用
  8. 【最全最详细】publiccms其他常用代码片段(内容、站点)
  9. 判断个十百千位之后是否大于20 java——CSDN博客
  10. 使用JDBCTemplate实现与Spring结合,方法公用 ——Emp实现类(EmpDaoImpl)