- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
提高 Java 代码性能的各种技巧2015-05-06 ?? 分类:JAVA开发、编程开发、首页精华暂无人评论?????来源:字节技术分享到:更多4欢迎分享开发问题到码农社区!将问题帖子私信@程序员俱乐部,将有近60000人为您解答!Java 6,7,8 中的 Sern – 字符串池这篇文章将要讨论 Java 6 中是如何实现?Sern?方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。字符串池字符串池(有名字符串标准化)是通过使用唯一的共享?String?对象来使用相同的值不同的地址表示字符串的过程。你可以使用自己定义的?MapString, String?(根据需要使用 weak 引用或者 soft 引用)并使用 map 中的值作为标准值来实现这个目标,或者你也可以使用 JDK 提供的?Sern()。很多标准禁止在 Java 6 中使用?Sern()?因为如果频繁使用池会市区控制,有很大的几率触发?OutOfMemoryException。Oracle Java 7 对字符串池做了很多改进,你可以通过以下地址进行了解?/view_bug.do?bug_id=6962931以及?/view_bug.do?bug_id=6962930Java 6 中的 Sern()在美好的过去所有共享的 String 对象都存储在 PermGen 中 — 堆中固定大小的部分主要用于存储加载的类对象和字符串池。除了明确的共享字符串,PermGen 字符串池还包含所有程序中使用过的字符串(这里要注意是使用过的字符串,如果类或者方法从未加载或者被条用,在其中定义的任何常量都不会被加载)Java 6 中字符串池的最大问题是它的位置 — PermGen。PermGen 的大小是固定的并且在运行时是无法扩展的。你可以使用?-XX:MaxPermSize=N?配置来调整它的大小。据我了解,对于不同的平台默认的 PermGen 大小在 32M 到 96M 之间。你可以扩展它的大小,不过大小使用都是固定的。这个限制需要你在使用?Sern?时需要非常小心 — 你最好不要使用这个方法 intern 任何无法控制的用户输入。这是为什么在 JAVA6 中大部分使用手动管理?Map?来实现字符串池Java 7 中的 Sern()Java 7 中 Oracle 的工程师对字符串池的逻辑做了很大的改变 — 字符串池的位置被调整到 heap 中了。这意味着你再也不会被固定的内存空间限制了。所有的字符串都保存在堆(heap)中同其他普通对象一样,这使得你在调优应用时仅需要调整堆大小。这个改动使得我们有足够的理由让我们重新考虑在 Java 7 中使用 Sern()。字符串池中的数据会被垃圾收集没错,在 JVM 字符串池中的所有字符串会被垃圾收集,如果这些值在应用中没有任何引用。这是用于所有版本的 Java,这意味着如果?interned 的字符串在作用域外并且没有任何引用 — 它将会从 JVM 的字符串池中被垃圾收集掉。因为被重新定位到堆中以及会被垃圾收集,JVM 的字符串池看上去是存放字符串的合适位置,是吗?理论上是 — 违背使用的字符串会从池中收集掉,当外部输入一个字符传且池中存在时可以节省内存。看起来是一个完美的节省内存的策略?在你回答这个之前,可以肯定的是你需要知道字符串池是如何实现的。在 Java 6,7,8 中 JVM 字符串池的实现字符串池是使用一个拥有固定容量的?HashMap?每个元素包含具有相同 hash 值的字符串列表。一些实现的细节可以从 Java bug 报告中获得?/view_bug.do?bug_id=6962930默认的池大小是 1009 (出现在上面提及的 bug 报告的源码中,在 Java7u40 中增加了)。在 JAVA 6 早期版本中是一个常量,在随后的?java6u30 至 java6u41 中调整为可配置的。而在java 7中一开始就是可以配置的(至少在java7u02中是可以配置的)。你需要指定参数?-XX:StringTableSize=N, ?N 是字符串池?Map?的大小。确保它是为性能调优而预先准备的大小。在 Java 6 中这个参数没有太多帮助,因为你仍任被限制在固定的 PermGen 内存大小中。后续的讨论将直接忽略 Java 6Java 7 (直至 Java7u40)在 Java7 中,换句话说,你被限制在一个更大的堆内存中。这意味着你可以预先设置好 String 池的大小(这个值取决于你的应用程序需求)。通常说来,一旦程序开始内存消耗,内存都是成百兆的增长,在这种情况下,给一个拥有 100 万字符串对象的字符串池分配 8-16M 的内存看起来是比较适合的(不要使用1,000,000 作为?-XX
您可能关注的文档
- 明确角色 肩负责任.doc
- 培训急购招聘面试-HR周工作计划总结.doc
- 培训教育机构财务管理-培训学校资产管理制度.doc
- 培训学校活动方案-10元学XX方案-渠道法.doc
- 培训学校活动方案-妇女节活动方案-母亲节也可用.docx
- 培训学校活动方案-感恩节主持稿.doc
- 培训学校活动方案-六一节活动方案.doc
- 培训学校活动方案-母亲节活动方案A.doc
- 培训学校活动方案-母亲节活动方案B.doc
- 培训学校活动方案-母亲节活动方案C.docx
- 《2025年公共卫生应急报告:AI疫情预测与资源调配模型》.docx
- 《再生金属行业2025年政策环境循环经济发展策略研究》.docx
- 2025年开源生态AI大模型技术创新与产业协同趋势.docx
- 《2025年智能汽车人机交互创新研究》.docx
- 2025年专利申请增长趋势下的知识产权保护机制创新分析报告.docx
- 《2025年数字藏品元宇宙技术发展趋势分析报告》.docx
- 2025年折叠屏技术迭代中AI功能集成市场反应量化分析报告.docx
- 《2025年教育培训视频化教学与会员学习服务》.docx
- 《2025年工业软件行业CAD国产化应用场景分析报告》.docx
- 《2025年生物制药行业趋势:单抗技术迭代与产业链自主可控规划》.docx
最近下载
- 新教材人音版一年级音乐上册(艺术唱游)全册教案(全30页)(2024年) .pdf VIP
- 丰田卡罗拉启动系统控制电路工作原理分析及故障排除2例.pdf VIP
- 脚手架安全专项监理细则.doc VIP
- 2024—2025学年吉林省长春市东北师大附中明珠学校七年级上学期期末数学试卷.doc VIP
- 系统操作指南.pptx VIP
- 新疆无神论课件.pptx VIP
- SIMATIC S120变频器调试步骤培训(高端培训).pptx VIP
- 智慧树知到《大学生职业生涯规划与就业指导》章节测试答案.pdf VIP
- 国家开放大学《管理英语3》边学边练Unit-1-8(答案全)_可搜索.pdf VIP
- 【机房】供货、安装、调试实施方案.docx VIP
原创力文档


文档评论(0)