当前位置:首页 > 内存 > 正文

java常见内存泄露

  • 内存
  • 2024-06-06 09:25:24
  • 1789

一、怎样解决Java中内存泄露一旦知道确实发生了内存泄漏,就需要更专门的工具来找出发生泄漏的原因。JVM本身不会告诉你。这些专业工具从JVM获取内存系统信息基本上有两种方法:JVMTI和字节码检测。Java虚拟机工具接口(JVMTI)及其前身Java虚拟机分析接口(JavaVirtualMachineProfilingInterface,JVMPI)是外部工具与JVM通信并从JVM收集信息的标准接口。字节码技术是指利用检测器对字节码进行处理以获得工具所需信息的技术。
Optimizeit是Borland公司的产品,主要用于帮助进行代码优化和系统故障诊断。OptimizeitProfiler软件主要用于分析内存泄漏。探查器堆栈视图用于观察系统使用的内存大小以及为每个类分配的实例数量。
首先,Profiler将执行流分析以找出哪些类的对象正在泄漏。系统长时间运行后可以获得4个内存快照。综合分析这四个内存快照,如果每个快照的内存使用量相比上次都有所增加,则可以判定系统存在内存泄漏,可以初步判定存在泄漏。通过数据收集和初步分析,可以初步得出结论:系统是否存在内存泄漏以及哪个对象泄漏(泄漏)。
接下来,查看与泄漏的类对象关联的其他类。前面说过,Java中的内存泄漏就是无用对象的保留,简单来说就是编码错误导致存在了不应该存在的引用链(从而导致被引用的对象未被释放),所以发生了内存泄漏。分析的任务就是找到这条冗余的参考链,并找到其形成的原因。查看对象的分配位置很有用。同时,仅仅知道它与其他对象(即引用它们的对象)如何相关是不够的,有关它创建位置的信息也很有用。
最后,仔细观察各个对象,看看它们之间是如何相互关联的。使用Profiler工具,可以在分配应用程序中的代码以创建堆栈跟踪时动态添加该代码。还有一个可用于系统中所有对象分配的动态堆栈跟踪。可以在工具中收集和分析这些堆栈的痕迹。对于每个泄漏实例对象,必须有一个从感兴趣的对象开始到该对象的引用链。堆叠空间中的吸引物体在退出堆叠后失去抓握能力,成为非吸引物体。因此,时间长了,泄漏对象基本上就被吸引对象绘制为类的静态变量了。
总之,虽Java具有自动回收和管理内存的功能,但内存泄漏问题也不容忽视,它往往是破坏系统稳定性的重要因素。