Java内存优化

常驻内存

排查内存泄漏

重用对象

String.intern()

在某服务中,通过与其他进程通讯获取到格式为byte[]的字段,将byte[]转化成String的时候利用new String(byte[])方法,但是string很多是相同的,产生了大量相同的string对象,而且这些对象是程序中当作缓存来用一直存在于内存中,采用String.intern()对String对象进行缓存,降低了内存占用30M。

Integer.valueOf()

只需一个实例的对象一定要使用单例

对象池技术

使用小数据类型

减少线程数

去垃圾回收机制

System.arraycopy ()

临时内存

减少不必要的对象拷贝,重写对象的clone方法

容器大小预估

容器在扩容时会产生大量临时对象,对容器大小进行预估传入初始值可以减少容器的扩容

Java分析工具

jmap

输出对象实例个数

jmap -histo <pid> > a.log

查看应用代码实例的个数,对于出现内存泄露的情况,可以快速定位出是哪个对象引起的。

输出堆文件

jmap -dump:format=b,file = a.dat <pid>

查看进程堆内存使用情况

jmap -heap <pid>

jhat

查看dump文件

jhat -port 9998 /tmp/var/dump.dat

Read More