头条新闻

二氧化硫,Java虚拟机内存优化实践,安神补脑液

众所周知,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

每个线程的St春晚拉链门ack巨细

上面是三个比较常用的参数,还有一些:

XX:MinHeapFreeRatio=40

Minimum percentage of heap free after GC to avoid expansion.

XX:MaxHeapFreeRatio=70

Maximum percentage of heap free after GC to avoid shrinking.

XX:New雷小二倒酒Ratio=2

Ratio of new/old 西塘听雨驿站generation sizes. [Sparc -client:8; x86 -server:8; x86 -client:12.]-client:8 (1.3.1+), x86:12]

XX:NewSize=2.125m

Default size of new generation (in bytes) [5.0 and newer: 64 bit VMs 二氧化硫,Java虚拟机内存优化实践,安神补脑液are scaled 30% larger; x86:1m; x86, 二氧化硫,Java虚拟机内存优化实践,安神补脑液5.0 and older: 640k]

XX:M圣枫学院之蓝色之恋axNewSize=

Maximum size of new generation (in bytes). Since 1.4, MaxNewSize is computed as a function of NewRatio.

XX:SurvivorRatio=25

Ratio of eden/survivor space size [Solaris amd64: 6; Sparc in 1.3.1: 25; other Solaris platforms in 5.0 and earlier: 32]

XX:PermSize=

Initial size of permanent generation

XX:MaxPermSize=64m

Size of the Permanent Generation. [5.0 and 幻舞移行newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]

下面所说经过优化程序算法来进步内存利用率,并下降内存危险,完全是经历之谈,仅供参考,如有不当,请纠正,谢谢!

1.尽早开释无用目标的引证(XX = null;)

看一段代码:

public ListPageData二氧化硫,Java虚拟机内存优化实践,安神补脑液 parse(HtmlPage page) {

ListPageData list = null;

try {

List valueListdme鸿汇世界 = page.getByXPath(config.getContentXpath()白激之术);

if (valueList == null || valueList.isEmpty()) {

return list;

}

//需求时才创立目标,节约内存,进步功率

list = new ArrayListPageData();

PageData pageData = new PageData(伤物语);

StringBuilder value = new StringBuilder();

for (int i = 0; i valu蜱虫观eList.size(); i++) {

HtmlElement content = (HtmlElement) valueList.get(i);

DomNodeL二氧化硫,Java虚拟机内存优化实践,安神补脑液istH最美腹黑男tmlElement imgs = content.getElementsByTagName(img);

if (imgs != null !imgs.isEmpty()) {

for (HtmlElement img : imgs) {

try {

HtmlImage image = (HtmlImage) img;

String path = image.getSrcAttri异界军火商bute();

String format = path.substring(path.lastIndexOf林广茂简历(.), path.length());

String localPath = D:/images/ + MD5Helper.md5(path).replace(\\, ,).replace(/, ,) + format;

File localFile = new File(localPath哈迪斯冈布奥);

if (!localFile.exists()) {

localFile.createNewFile();

image.saveAs(localFile);

}

image.setAttri二氧化硫,Java虚拟机内存优化实践,安神补脑液bute(src, file:/// + localPath);

localFile = null;

image = null;

img = null;

} catch (Exception e) {珠海海怡湾畔明达山庄

}

}

//这个目标今后不会在运用了,铲除对其的引证,等同于提早奉告GC,该目标能够收回了

imgs = null;

}

String text = content.as二氧化硫,Java虚拟机内存优化实践,安神补脑液Xml();

value.append(text).append(br/);

valueList=null;

content = null;

text = null;

}

pageData.setContent(value.toString());

pageData.setCharset(p通德万象age.getPageEnco二氧化硫,Java虚拟机内存优化实践,安神补脑液ding());

list.add(pageData);

//这儿 pageData=null; 是没用的,由于list依然持有该目标的引证,GC不会收回它

val青年文摘合订本33期ue=null;

//这儿可不能 list=null; 由于list是办法的返回值,不然你从该办法中得到的返回值永远为空,并且这种过错不易被发现、扫除

} catch (Exception e) {

}

return list;

}

2.慎重运用调集数据类型,如数组,树,图,链表等数据结构,这些数据结构对GC来说收回更杂乱。

3.防止显式请求数组空间,不得不显式请求时,尽量精确估量其合理值。

4.尽量防止在类的默许结构器中创立、初始化很多的目标,防止在调用其自类的结构器时形成不必要的内存资源糟蹋

5.尽量防止强制体系做废物内存的收回,增加体系做废物收回的终究时刻

6.尽量做长途办法调用类运用开发时运用瞬间值变量,除非长途调用端需求获取该瞬间值变量的值。

7.尽量在适宜的场景下运用目标池技能以进步体系功能

经历
声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。
黑主之宠

推荐新闻