Java内存泄漏问题
1:java中垃圾回收机制主要完成下面两件事情:
- 跟踪并监控每个java对象,当某个对象处于不可达状态时,回收该对象所占的内存
- 清理内存分配,回收过程中产生的内存碎片
2:对于JVM的垃圾回收机制来说,是否回收一个对象的标准是:
是否还有引用变量引用该对象?
只要还有引用变量引用该对象,立即回收机制就不会回收它。
3:基本上,可以把JVM内存中对象引用理解成一种有向图,把引用变量,对象都当成为有向图的顶点,将引用关系当成图的有向边,有向边总是从引用端指向被引用的对象。
因为java所有对象都是由一条一条线程创建出来的,因此可以将线程对象当成有向图的起点。如果某个对象在这个有向图中处于不可达的状态,那么就认为该对象不再被引用,
接下来垃圾回收机制就回去主动回收它。
以下面程序为例:
1 class Node 2 { 3 Node next; 4 String name; 5 public Node(String name) 6 { 7 this.name = name; 8 } 9 } 10 public class NodeTest 11 { 12 public static void main(String[] args) 13 { 14 Node n1 = new Node("第一个节点"); 15 Node n2 = new Node("第二个节点"); 16 Node n3 = new Node("第三个节点"); 17 n1.next = n2; 18 n2 = null; 19 n3 = n2; 20 } 21 } 22 从下图可以看出,从main顶点出发有一条路径到达“第一个节点”,因此该对象处于可达状态,垃圾回收机制不会回收它。 23 从main开始有两条路径到达“第二个节点”,因此该对象也处于可达状态,垃圾回收机制也不会回收它。 24 从Main顶点开始,没有路径到达“第三个节点”,因此该对象就变成了垃圾。 25 26 27 内存管理的小技巧 28 29 尽量使用直接量 30 31 当需要使用字符串,还有其他如Byte,Short,Integer,Long,Float,Double,Boolean,Character包装类的实例时,程序不应该采用new的方式来创建对象,而应该采用直接量来创建它们 32 例如:程序需要"hello"字符串,应采用下面的代码: 33 String str = "hello"; 34 上面的代码会创建一个"hello"的字符串,而且jvm的字符串缓存池还会缓存这个对象 35 但如果使用下面的代码: 36 String str = new String("hello"); 37 此时程序同样创建了一个缓存在字符串缓存池中的"hello"字符串,除此之外str所引用的String对象底层还包含一个char[]数组,这个数组依次存放h,e,l,l,o等字符。 38 39 2:使用StringBuffer和StringBuilder进行字符串连接 40 如果程序使用多个String对象进行字符串连接,在运行时将生成大量的临时字符串对象,这些字符串会保存在内存中从而导致程序性能下降 41 3:尽量少用静态变量 42 例如下面代码: 43 class Person{ 44 static Object obj = new Object(); 45 } 46 obj变量时Person类的静态变量,因此它的生命周期与Person同步,在Person类不被卸载的情况下,Person类对应的Class对象会常驻内存,直到程序运行结束。 47 因此obj所引用的Object对象一旦被创建,也会常驻内存,直到运行结束。 48 4:尽早释放无用对象的引用 49 5:避免在经常调用的方法,循环中创建java对象 50 6:缓存经常使用的对象 51 典型的缓存就是数据库连接池,数据库连接池中缓存了大量数据库连接,每次程序访问数据库时只要直接取得连接就好。
注:本文来源于:cnblogs:牛奶、不加糖
Java内存泄漏问题相关推荐
- java内存泄漏笔记
利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码) (1)jmap -dump:file=heap_file_name pid 会产生一个heap_file_name文件 (2)jhat he ...
- java内存泄漏总结
内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收 ...
- 一次恐怖的 Java 内存泄漏排查实战
转载自 一次恐怖的 Java 内存泄漏排查实战 最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家. 这两天对JVM内 ...
- Java内存泄漏介绍
转载自 Java内存泄漏介绍 内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存.但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏. 本章会 ...
- java内存泄漏案例_寻找内存泄漏:一个案例研究
java内存泄漏案例 一周前,我被要求修复一个有内存泄漏问题的webapp. 考虑到过去两年左右的时间里我已经看到并修复了数百个泄漏,我想这有多难. 但是事实证明这是一个挑战. 12小时后,我发现该应 ...
- java内存泄漏和内存溢出_Java和内存泄漏
java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...
- 从一个OutOfMemoryError 学会了分析Java内存泄漏问题
从一个OutOfMemoryError 学会了分析Java内存泄漏问题 以前都是好好的,最近出现了 oom. 问题 开始是: java.lang.OutOfMemoryError: Java heap ...
- Java内存泄漏的介绍
Java内存泄漏的介绍 Java最重要的优势之一是它的内存管理.您只需创建对象,Java Garbage Collector负责分配和释放内存.但是,情况并不那么简单,因为Java应用程序中经常发生内 ...
- unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了
原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...
- 什么是内存泄露?该怎么排查?Java内存泄漏策略
什么是内存泄漏 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的, ...
最新文章
- SQL Server 2008备份策略设计下(六)
- 迁移到云端的企业数据需注意安全
- 四川大学计算机学院优秀毕业论文,四川大学本科生毕业论文设计评分标准.docx...
- sdn和nfv的区别—Vecloud微云
- Selenium实例1-自动登录小米社区并获取主题帖
- tty_operations
- Django 模板中使用css, javascript
- 编程命名中的7+1个提示
- XML--XML从入门到精通 Part 1 认识XML
- mysql5.5 replication_mysql5.5 master-slave(Replication)配置
- 我有一个朋友毕业后一直在腾讯
- 刻不容缓!联合国加开会议讨论「如何限制杀人机器人」
- 群晖NAS设备安装和基础操作详细流程(例:DS920+)
- 2017 追梦 远方
- 【培训实验记录】锐捷SDN交换机和控制器部署
- FORTIFY_SOURCE详解
- Qt 多线程bug:moc_widget.cpp:-1: error: undefined reference to `Mythread::~Mythread()‘:-1:
- Navicat如何连接阿里云数据库RDS
- 用华为手机,别忘记打开这个“开发者选项”,能瞬间提升手机性能
- springboot线上教学平台计算机毕业设计(源码、运行环境)