zoukankan      html  css  js  c++  java
  • 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:牛奶、不加糖

  • 相关阅读:
    输入挂
    最长递增子序列nlogn的做法
    lca 倍增模版
    讨厌字符串
    js的事件处理与闭包:
    http
    html的语义化
    js性能优化
    js的缓存
    字面量声明和函数式声明
  • 原文地址:https://www.cnblogs.com/ios9/p/7475698.html
Copyright © 2011-2022 走看看