某某茶叶有限公司欢迎您!
金沙棋牌在线 > 金沙棋牌在线 > Java内存泄漏问题

Java内存泄漏问题

时间:2019-12-29 06:39

在Java中,内存泄露和其他内存相关问题在性能和可扩展性方面表现的最为突出。我们有充分的理由去详细地讨论他们。

Rails内存的问题 Java内存情况

关于 Java内存 的问题。
今天看到这样一段代码,执行后结果一个是true,一个是false。我有点不理解,代码是:

1:java中垃圾回收机制主要完成下面两件事情:

  • 跟踪并监控每个java对象,当某个对象处于不可达状态时,回收该对象所占的内存
  • 清理内存分配,回收过程中产生的内存碎片

Java内存模型——或者更确切的说垃圾回收器——已经解决了许多内存问题。然而同时,也带来了新的问题。特别是在有着大量并行用户的J2EE运行环境下,内存越来越成为一种至关重要的资源。乍看之下,这似乎有些奇怪,因为当前内存已经足够廉价,并且我们也有了64位的JVM和更先进的垃圾回收算法。

一个txt文件,100M,300万行,都是坐标数据;

 String s1 = new StringBuilder.append.toString(); System.out.println; System.out.println("s1.intern():"+s1.intern; System.out.println(s1.intern; //true String s2 = new StringBuilder.append.toString(); System.out.println; System.out.println("s2.intern():"+s2.intern; System.out.println(s2.intern; //false

2:对于JVM的垃圾回收机制来说,是否回收一个对象的标准是:

是否还有引用变量引用该对象?

     只要还有引用变量引用该对象,立即回收机制就不会回收它。

接下来,我们将会仔细的讨论一下关于Java内存的问题。这些问题可以分为四组:

需要进行坐标的变换、计算、比较;

运行结果是:
图片 1

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中,内存泄露一般都是由于引用对象不再被使用而造成的。当有多个引用的对象,同时这些对象又不再需要,然而开发者又忘记清理它们,这时极容易导致内存泄露的发生。
  • 执行消耗太多的内存而导致不必要的高内存占用。这在为了用户体验而管理大量状态信息的 Web 应用中很常见。随着活跃用户数量的增加,内存很快到达了上限。未绑定或低效缓存配置是持续高内存占用的另一来源。
  • 当用户负载增加时,低效的对象创建容易导致性能问题。从而垃圾回收器必须不断地清理堆内存。而这导致了垃圾回收器对CPU产生了不必要的高占用。随着CPU因垃圾回收而被阻塞,应用程序响应时间频繁的增加,导致其一直处于中等负载之下。这种行为也成为“GC trashing”。
  • 低效的垃圾回收行为往往是由于垃圾回收器的缺失或者错误的配置。这些垃圾回收器将会时刻追踪对象是否被清理。然而这种行为如何以及何时发生必须由配置或者程序员,或者系统架构师决定的。通常,人们只是简单地“忘记”了正确的配置和优化垃圾回收器。我曾参加过一些关于“性能”的专题讨论会,发现一个简单的参数变化将会导致高达25%的性能提升。

在Rails中使用Ruby进行计算,会导致内存超过1.5G,最后溢出而亡;