使用String.intern()减少内存使用
时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也一样,并认为分享最近的一个战争故事将很有趣。 在这种情况下,我们就有机会使用String.intern()之类的简单补丁来修补应用程序。 但是,让我从头开始。
当前的应用程序正遭受内存不足的困扰,甚至在最近的更改后都无法启动。 症状包括JVM重新启动后CPU使用率过高,然后几分钟后出现致命的OutOfMemoryError:日志中的堆空间 。 快速查看堆内容使我们产生了疑问-应用程序正在将数百万个对象加载到某个内部数据结构中。
与开发团队进行的背景调查显示,最近加载的对象数量乘以两倍-而不是大约500万个对象,应用程序现在必须处理大约一千万个内存实例。 实际上,这可能会占用一些堆空间。 但是,知道可能的原因并不会给我们带来太大帮助-企业主绝不愿意放弃他们刚刚获取的宝贵数据。
深入研究手头的数据结构,我们发现其在下面过度使用了字符串。 对于我们的任何读者来说,这都不奇怪。 但是其中一些字符串包含重复的表示内容。 您可以将地址元素(例如街道名称和/或国家/地区)视为等效的情况。
快速解决方案开始在我们的脑海中酝酿。 如果我们内部化那些重复的字符串怎么办? 与应用程序的开发人员Swift核实之后,我们获得了绿灯。 开发人员保证,将包含实习的副作用,例如记住String.intern()与我们内部化的Strings进行比较的所有字符串。 感谢上帝的封装。
现在我们只需要了解内部化要引入多少CPU开销。 令我们惊讶的是,实习到大约1000万个琴弦只花了不到四分钟的时间。 并为我们节省了大约不足的500MB内存。 因此,节省了时间。
现在,在您跳至应用程序并开始内部化将要查找的所有Strings之前,我必须事先警告您。 有很多可能出错的地方:
- 您内部化的字符串将从堆中消失,并重新定位到永久代。 因此,请确保您在permgen空间中有足够的空间。
- 确保将要与内部化的字符串进行比较的所有字符串内部化。 否则,您将在应用程序中创建最讨厌的错误类型。
- 确保可以忍受内部化时的CPU开销。 这是一个本机方法调用,因此它将完全取决于您的特定平台,因此请确保在进行生产更改之前尝试一下
我们承认这种情况很少见–数据结构包含许多重复的String对象,并以一种使我们能够隔离快速修复的方式与应用程序集成。 甚至在我们的情况下,该修复程序很快也被开发人员删除,他们将数据结构重新设计为更合理的图形表示形式。
但是除了警告-Java虚拟机中内置了有趣且有用的工具。 知道如何使用它们,并提防它们的副作用,它们将成为您的朋友。 谨慎使用它们,您可以轻松终止应用程序。 您最好的朋友将永远是一个基于您自己的应用程序构建的实际测试用例。
翻译自: https://www.javacodegeeks.com/2013/06/reducing-memory-usage-with-string-intern.html
使用String.intern()减少内存使用相关推荐
- 使用String.intern减少内存使用
最近写一个程序,从文件中读取一些字/词,然后存储起来供别的类引用. 对每个读入的词创建一个String,结果许多同样内容的也会存储多份,会占用大量内存. 开始的一个想法是使用map/set来存储所有遇 ...
- string.intern_使用String.intern()减少内存使用
string.intern 时不时地会有一个垂死的生产应用程序. 而且您知道您需要尽快对其进行修补. 我们也是如此,并认为分享最近的一个战争故事会很有趣. 在这种情况下,我们就有机会使用String. ...
- java字符串内存长度固定_深入理解 Java String#intern() 内存模型
大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 字符串常量池是一个固定大小的HashMa ...
- 深入解析String#intern
为什么80%的码农都做不了架构师?>>> 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了 ...
- JVM系列之:String.intern的性能
文章目录 简介 String.intern和G1字符串去重的区别 String.intern的性能 举个例子 简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成 ...
- 深入解析String intern
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...
- String#intern
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...
- Java String intern()方法
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...
- 深入理解String.intern
在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8种基本 ...
最新文章
- php读取cookie文件,PHP读取CURL模拟登录时生成Cookie文件的方法,_PHP教程
- 微软Excel竟能实现CV算法:亚马逊工程师妙用,人脸检测、字符识别都不在话下...
- 关于Go ROOT 和Go PATH的设置
- 职场新人成功修炼五诀 迅速在职场占一席之地
- 数据港:攻破OPEX+SLA难题,实现全生命周期效能管理
- TP5:缩短访问路径和路由的使用——2
- (23)System Verilog旗语解决资源共享需求
- JavaScript之BOM对象(JS函数作用域、window、history、location对象)
- 用华秋DFM处理Allegro PCB文件
- python精准识别图片文字
- 苹果cms怎么添加2019和2020年份筛选
- 项目管理-PMP-第11章 项目采购管理
- texstudio设置暗黑主题
- 苹果回忆:为证明 iPhone 结实,乔布斯拿起手机就往地上摔
- 经纬M300赛尔102S航测全流程解析
- windows xp 打开文件夹慢的解决
- 机器学习算法面经(阿里京东拼多多百度等)
- 树莓派csi摄像头检测不到,没有/dev/video0,supported=0 detected=0等问题的解决方法
- MC7812BTG详细参数介绍
- 【DP】poj1671
热门文章
- delphi dll是否可用var参数_时间序列之向量自回归(VAR)学习重点
- 神经网络中的最小二乘_深度神经网络:噪声中解读出科学
- excel趋势线公式导出_如何用Excel进行预测分析?
- (转)java动态代理与aop
- java客户端api文档_Java 11:新的HTTP客户端API
- glacier2_Amazon Glacier的Scala客户端
- spring boot缓存_Spring Boot和缓存抽象
- 设计模式适配器模式_21世纪的设计模式:适配器模式
- optional空值判断_Java 8 Optional不仅用于替换空值
- jboss fuse 教程_IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)