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 典型的缓存就是数据库连接池,数据库连接池中缓存了大量数据库连接,每次程序访问数据库时只要直接取得连接就好。
Java内存泄漏问题的更多相关文章
- java内存泄漏的几种情况
转载于http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态 ...
- java内存泄漏的定位与分析
1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...
- java内存泄漏
java内存泄漏主要分成两个方面: (1)堆中申请的空间没有被释放 (2)对象已不在被使用,但是仍然存在在内存当中 以下集中情况可能会导致内存泄漏 (1)静态集合的使用hashmap和vector,静 ...
- Java内存泄漏分析与解决方案
Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
- (转)java内存泄漏的定位与分析
转自:http://blog.csdn.net/x_i_y_u_e/article/details/51137492 1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测, ...
- Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析
原文地址:http://www.javatang.com 症状及解决方案 下面列出几种常见的症状即对应的解决方案: CPU占用率很高,响应很慢 按照<Java内存泄漏分析系列之一:使用jstac ...
- Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析
原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...
- Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息
原文地址:http://www.javatang.com 前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章. 基本概念 在对J ...
- JRockit检测Tomcat内存溢出JAVA内存泄漏问题
http://blog.csdn.net/liyanhui1001/article/details/8240473 公司的一个Java应用系统上线以来,基本每1天OutOfMemoryError: P ...
- OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)
本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常 在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...
随机推荐
- Quartz入门例子简介 从入门到菜鸟(一)
转: Quartz入门例子简介 从入门到菜鸟(一) 2016年11月19日 22:58:24 爱种鱼的猫 阅读数:4039 刚接触quartz这个词并不是在学习过程中...而是WOW里面的界面插件 ...
- terminal下历史命令自动完成功能history auto complete
CentOS下,有一个很智能的功能,就是只输入一条历史命令的前几个字母,再按PageUp和PageDown键,就可以在以此字母为前缀的历史命令中上下切换.这个功能非常实用,而且比CTRL+R使用起来更 ...
- (binary_search) Can you find it hdu2141
Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others ...
- 原生ajax写法
ajax1.0,ie9及以下,ie10+支持ajax2.0 ajax2.0比ajax1.0: 1.多了FormData对象,xhr.send(formData) //不能用GET 2.文件上传,文件 ...
- powershell 删除8天前的日志
把以下命令保存为ps1脚本,添加到Windows计划任务中设定每天固定时间执行即可: #delete logs in specify website, just save logs in eight ...
- Nginx+Swoole服务器配置
nginx 配置 server { listen 80; server_name www.swoole.com; root /data/wwwroot/www.swoole.com; location ...
- FastDFS与Nginx的搭建及遇到的问题
1.1 FastDFS与Nginx的搭建 可以使用一台虚拟机来模拟,只有一个Tracker.一个Storage服务. 配置nginx访问图片. 1.1.1 搭建步骤 第一步:把fastDFS需要 ...
- centos7环境下安装mysql5.6-----解压安装包的方法
参考连接:https://blog.csdn.net/qq_17776287/article/details/53536761 linux下有很多服务,如何查看服务是否启动,以mysql为例子 使用命 ...
- git常用命令及含义
Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等.顾名思义,版本控制系统主要就是控制.协调 ...
- Java Web之路(一)Servlet
前言 执行过程 Servlet 生命周期.工作原理:http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html Servlet的生命周期 ...