博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内存管理
阅读量:2395 次
发布时间:2019-05-10

本文共 1564 字,大约阅读时间需要 5 分钟。

今天主要想总结下关于Java内存的管理,很多初学者认为java不会有泄漏情况出现,但是在实际的开发过程中并不是这样。目前至少在我的开发和维护过程中已经碰到几次了。而且越到后面,随着代码的增加将越难查出问题所在(我其中所维护的一个Java服务器有接近十万行的代码量,基本全部的基础框架都是自己开发的,没有大量的使用第三方库)。

网上介绍Java内存的理论和结构分区有很多,在这我就不细说了。不过理论跟实际的开发过程中所碰到的还是有相当大的差距。

不过先还是介绍下最基本防止泄漏原理:

1、资源释放问题(具体的就是数据库连接、socket连接等)

2、避免频繁创建对象;减少对象的生存周期,甚至采用对象池的方式。

3、在某些应用场合,将采用软引用、弱引用和虚引用,我使用较多的是软引用(在进行数据的缓存处理过程中),其它两类应用我还是比较少使用的。

4、方法不要太长,一般一个方法50-200之间比较适合(只作为参考,具体的需要根据项目的要求进行规划)。

5、能使用局部变量,就不要使用成员变量(局部变量的使用可以给GC操作减轻负担),另外静态变量尽量少用。

6、当对象使用完后,其成员变量需要进行赋NULL值处理(协同GC操作)。

7、尽量不要产生一个大对象出现(对于内存泄漏来说也是比较棘手的)。

 

 

以上只是程序在编写时,需要尽量注意的。尽管注意了以上的原则,但是程序在运行时,还是会出现内存泄漏情况。这需要提高对内存泄漏的认识,也就是说不能简单的只从代码角度去考虑问题,需要结合更多其它方面的知识,如操作系统中的线程和进程(对于Java是多线程方面)、数据库原理、锁机制、资源管理等知识,这是非常重要的。

更高的抽象层次,就是把握整个软件框架设计的度,层次交互处理、模块交互等。总之需要整体去考虑问题,因为泄漏是需要考虑各方面很多因素

 

另外有兴趣的可以掌握下C/C++的知识,毕竟Java封装了很多东西。

但是解决Java内存泄漏的一个最终思路:

第一程序中一定存在没有使用,但是还保存在内存里的对象;另外就是对象创建所造成;还有就是并发处理的时候对每个请求的处理时间。

但是最重要的还是前者,它将影响后面的两种情况。

这句话网上有很多人说,也觉得很简单。但是能否找出那些是没有用的对象,这并非易事(甚至有些是Java的JVM本身导致,可参考我的另一篇文章《》)。

市面上也有很多关于判断内存泄露的工具,这些工具多少也能提供帮助(可以直接查看线程的运行状态、内存分布情况、GC运行状态等),但是工具也是有不足的,例如:Jprofiler5.0这样的工具,并不支持一些高级的JVM参数(不知道后期版本是否可以支持)。

但是这里我介绍下我解决内存泄露的心得(不使用工具):一是日志信息;一是系统开发原理;一是对处理机制掌握。

大家别小瞧了日志信息,在后期的维护过程中,它会给你很多提示。大家也许会小瞧了日志信息(我的同仁就有很多不喜欢进行日志信息的处理),但是我个人认为日志的使用是很有学问的,例如什么情况使用DEBUG级别;什么时候用INFO级别;什么时候用WAR级别等。特别是程序代码量逐渐增加,后面维护日志就显的特别重要。

系统开发原理掌握的好坏,也将影响你判断泄露问题的准确性。如进程、线程、调度管理、存储、I/O等。这方面没有什么技巧,就是需要时间进行大量的学习和实践,这里我推荐一本书《深入计算机系统》很好的讲解了下很多方面的基本知识。

处理机制,简单的说就是业务处理的流程,在维护过程中自己需要对每一点处理的细节都要知道,它也会不经意的给你带来意想不到的线索。

 

最后是在处理这样棘手的问题时,需要有耐心和细心,不要放弃任何可疑点(每个可疑点都将使你离成功更近了),希望这些可以给大家在解决Java内存泄漏问题带来帮助。

转载地址:http://vdzob.baihongyu.com/

你可能感兴趣的文章
122. Best Time to Buy and Sell Stock II [medium] (Python)
查看>>
推荐-线下AUC提升,线上CTR无提升
查看>>
Ubuntu 安装 pylucene 踩坑还原记,并安装 SmartChineseAnalyzer
查看>>
Java编程思想学习笔记(10)
查看>>
Java编程思想学习笔记(11)
查看>>
机器学习实战:基于Scikit-Learn和TensorFlow—第五章笔记
查看>>
Java编程思想学习笔记(12)
查看>>
Java编程思想学习笔记(13)
查看>>
Java编程思想学习笔记(14)
查看>>
Java-8-UnaryOperator
查看>>
Java-8-Function
查看>>
Java-8-Stream接口
查看>>
Junit4入门
查看>>
Java与算法(11)
查看>>
Java与算法(13)
查看>>
Python时间模块
查看>>
Python的闭包和装饰器
查看>>
Python基于Socket实现简单聊天室
查看>>
Python的Twisted入门
查看>>
Flask的表单处理
查看>>