知识大全 深入Java虚拟机之内存优化
Posted 知
篇首语:好汉凭志强,好马凭胆壮。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 深入Java虚拟机之内存优化相关的知识,希望对你有一定的参考价值。
深入Java虚拟机之内存优化 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
众所周知 Java是从C++的基础上发展而来的 而C++程序的很大的一个问题就是内存泄露难以解决 尽管Java的JVM有一套自己的垃圾回收机制来回收内存 在许多情况下并不需要java程序开发人员操太多的心 但也是存在泄露问题的 只是比C++小一点 比如说 程序中存在被引用但无用的对象 程序引用了该对象 但后续不会或者不能再使用它 那么它占用的内存空间就浪费了 我们先来看看GC是如何工作的 监控每一个对象的运行状态 包括对象的申请 引用 被引用 赋值等 当该对象不再被引用时 释放对象(GC本文的重点 不做过多阐述) 很多Java程序员过分依赖GC 但问题的关键是无论JVM的垃圾回收机制做得多好 内存总归是有限的资源 因此就算GC会为我们完成了大部分的垃圾回收 但适当地注意编码过程中的内存优化还是很必要的 这样可以有效的减少GC次数 同时提升内存利用率 最大限度地提高程序的效率 总体而言 Java虚拟机的内存优化应从两方面着手 Java虚拟机和Java应用程序 前者指根据应用程序的设计通过虚拟机参数控制虚拟机逻辑内存分区的大小以使虚拟机的内存与程序对内存的需求相得益彰 后者指优化程序算法 降低GC负担 提高GC回收成功率 通过参数优化虚拟机内存的参数如下所示 ◆ Xms 初始Heap大小 ◆ Xmx java heap最大值 ◆ Xmn young generation的heap大小 ◆ Xss 每个线程的Stack大小 上面是三个比较常用的参数 还有一些 ◆ XX:MinHeapFreeRatio= Minimum percentage of heap free after GC to avoid expansion ◆ XX:MaxHeapFreeRatio= Maximum percentage of heap free after GC to avoid shrinking ◆ XX:NewRatio= Ratio of new/old generation sizes [Sparc client: ; x server: ; x client: ] client: ( +) x : ] ◆ XX:NewSize= m Default size of new generation (in bytes) [ and newer: bit VMs are scaled % larger; x : m; x and older: k] ◆ XX:MaxNewSize= Maximum size of new generation (in bytes) Since MaxNewSize is puted as a function of NewRatio ◆ XX:SurvivorRatio= Ratio of eden/survivor space size [Solaris amd : ; Sparc in : ; other Solaris platforms in and earlier: ] ◆ XX:PermSize= Initial size of permanent generation ◆ XX:MaxPermSize= m Size of the Permanent Generation [ and newer: bit VMs are scaled % larger; amd : m; client: m ] 下面所说通过优化程序算法来提高内存利用率 并降低内存风险 完全是经验之谈 仅供参考 如有不妥 请指正 谢谢! 尽早释放无用对象的引用(XX = null;) 看一段代码 public List<PageData> parse(HtmlPage page) List<PageData> list = null; try List valueList = page getByXPath(config getContentXpath()) if (valueList == null || valueList isEmpty()) return list; //需要时才创建对象 节省内存 提高效率 list = new ArrayList<PageData>() PageData pageData = new PageData() StringBuilder value = new StringBuilder() for (int i = ; i < valueList size() i++) HtmlElement content = (HtmlElement) valueList get(i) DomNodeList<HtmlElement> imgs = content getElementsByTagName( img ) if (imgs != null && !imgs isEmpty()) for (HtmlElement img : imgs) try HtmlImage image = (HtmlImage) img; String path = image getSrcAttribute() String format = path substring(path lastIndexOf( ) path length()) String localPath = D:/images/ + MD Helper md (path) replace( \\\\ ) replace( / ) + format; File localFile = new File(localPath) if (!localFile exists()) localFile createNewFile() image saveAs(localFile) image setAttribute( src file:/// + localPath) localFile = null; image = null; img = null; catch (Exception e) //这个对象以后不会在使用了 清除对其的引用 等同于提前告知GC 该对象可以回收了 imgs = null; String text = content asXml() value append(text) append( <br/> ) valueList=null; content = null; text = null; pageData setContent(value toString()) pageData setCharset(page getPageEncoding()) list add(pageData) //这里 pageData=null; 是没用的 因为list仍然持有该对象的引用 GC不会回收它 value=null; //这里可不能 list=null; 因为list是方法的返回值 否则你从该方法中得到的返回值永远为空 而且这种错误不易被发现 排除 catch (Exception e) return list; 谨慎使用集合数据类型 如数组 树 图 链表等数据结构 这些数据结构对GC来说回收更复杂 避免显式申请数组空间 不得不显式申请时 尽量准确估计其合理值 尽量避免在类的默认构造器中创建 初始化大量的对象 防止在调用其自类的构造器时造成不必要的内存资源浪费 尽量避免强制系统做垃圾内存的回收 增长系统做垃圾回收的最终时间 尽量做远程方法调用类应用开发时使用瞬间值变量 除非远程调用端需要获取该瞬间值变量的值 尽量在合适的场景下使用对象池技术以提高系统性能 cha138/Article/program/Java/hx/201311/26308相关参考
设置Java虚拟机(JVM)的内存问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
关于设置Java虚拟机(JVM)的内存问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近做
《深入理解Java虚拟机》笔记 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在C里面我们想
众所周知jvm的内存是受限的一为机器的体系架构二为操作系统本身xxSPARC的内存映射是不同而各操作系统的内存管理机制也有区别以下是来自;Heap设定与垃圾回收JavaHeap分为个区Yo
深入Java虚拟机中的Stack和Heap 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在JV
深入Java核心Java内存分配原理精讲 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java
Java优化编程--内存管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 众所周知java的J
用第一个java虚拟机启动另一个虚拟机并用第一个虚拟机的java程序去测试另一个虚拟机上java程序运行时的内存CPU资源占用情况 解决问题的限制和条件 》两个虚拟机运行在同台Windows_
内存管理系统常常被视为实现系统性能最优的一块主要绊脚石因此在过去的几年里Java应用环境对高效执行内存调优的需求急剧增长受此影响JVM供应商开始一哄而上提供配置内存的特殊选项获取最优内存性能——没有中
大多Java程序员知道他们的程序通常不会被编译为本机代码而是被编译为由java虚拟机(JVM)执行的字节码格式然而很少有java程序员曾经看过字节码因为他们的工具不鼓励他们去看大多Java调试工具