Java - 内存管理与垃圾收集

来源:互联网 发布:淘宝网店铺动态评分 编辑:程序博客网 时间:2024/06/03 10:09

垃圾

[java] view plain copy
  1. 内存不再有用的对象,占用的内存应该释放,将不再有用的对象清除出内存的工作成为垃圾收集    
  2. 垃圾标准:    
  3.     对于非线程来说,当所有活动线程都不可能访问到该对象时,该对象便成了垃圾    
  4.     对于线程来说,除了满足第一条标准之外,还要求此线程本身已经死亡或者处于新建的状态  
  5. 使对象称为垃圾的方法:    
  6.     将对象引用指向null或者将对象引用指向别的对象    
  7.         内存中之前对象存储地址成了无主对象,就会被垃圾回收器回收    
  8.     随着语句块或者方法体退出局部引用消亡    
  9.         超出了作用范围    
  10. 没有引用指向的对象就是垃圾,有引用指向的对象不是垃圾    
  11.     这句话错误,有引用指向的对象也有可能是垃圾,关键看对象能不能被活动线程访问到    

垃圾收集器

[java] view plain copy
  1. 垃圾收集器是一个后台守护线程,在内存充足的情况下优先级很低,一般不出来运行,    
  2.     当垃圾充斥内存,严重影响程序的执行时,优先级提高,并出来运行,清除内存    
  3. 正因为如此,垃圾收集器运行时间没有保障  

申请垃圾收集器运行

[java] view plain copy
  1. package com.itlwc;    
  2.     
  3. public class MyRuntime {    
  4.     public static void main(String[] args) throws InterruptedException {    
  5.         //Runtime类中的构造方法都是私有的,必须通过静态工厂来获取Runtime对象    
  6.         Runtime runtime = Runtime.getRuntime();    
  7.         System.out.println("当前JVM总内存" + runtime.totalMemory() + "字节");    
  8.         System.out.println("创建10000000个垃圾对象之前JVM空闲内存为:"    
  9.                 + runtime.freeMemory()+ "字节");    
  10.         //休眠主线程,提供申请垃圾收集器运行的成功率    
  11.         Thread.sleep(1000);//主线程休眠1000毫秒    
  12.         for (int i = 0; i < 10000000; i++) {    
  13.             new String("Tom");    
  14.         }    
  15.         System.out.println("创建10000000个垃圾对象之后JVM空闲内存为:"    
  16.                 + runtime.freeMemory()+ "字节");    
  17.         System.gc();// 申请垃圾收集器运行    
  18.         //休眠主线程,提供申请垃圾收集器运行的成功率    
  19.         Thread.sleep(1000);//主线程休眠1000毫秒    
  20.         System.out.println("使用垃圾收集器之后JVM空闲内存为:"    
  21.                 + runtime.freeMemory() + "字节");    
  22.     }    
  23. }  
  24. /* 
  25.     当前JVM总内存2031616字节 
  26.     创建10000000个垃圾对象之前JVM空闲内存为:1821656字节 
  27.     创建10000000个垃圾对象之后JVM空闲内存为:1628680字节 
  28.     使用垃圾收集器之后JVM空闲内存为:1880760字节 
  29. */  

finalize()

[java] view plain copy
  1. 对象作为垃圾清理出内存之前,垃圾收集器会首先调用垃圾对象的finalize(),进行扫尾工作,    
  2.     扫尾工作代码可以编写在finalize()中,然后再清除垃圾对象    
  3. finalize()重写  
  4.     重写此方法时一般不但要编写自己类中的代码,    
  5.     还应该使用super().finalize()调用父类的finalize()    
  6.     子类清理代码执行父类清理代码也应该执行    
  7. finalize()的安全问题    
  8.     不能在finalize()中编写恶意代码,阻止垃圾收集  
  9.     在Java中,一个对象的生命周期中finalize()最多只能被执行一次,  
  10.         也就是说,第一次执行垃圾收集时执行此方法阻止了垃圾收集,  
  11.         第二次执行垃圾收集时不会再执行此方法,直接清楚垃圾对象   
0 0