原文地址:http://www.ihuxu.com/p/236.htmlhtml
说明:这是一个利用Java Logger类的示例,完成简单的日志记录功能。代码中有部分类库没有说明,但不影响阅读。java
本人技术是新手,对于java的内存问题有着很大的困惑。但愿获得网友的指点,问题描述以下:函数
本人写了一个日志类Log,当加载Log类后,内存会增加20M左右,可是等释放了全部内存变量时,观察内存状况,并无释放这个20M的迹象。诸如此类的问题还有不少,虽然Java有GC,不用显示释放内存。可是,确实不知道或者观察不到内存的释放过程。spa
代码以下:日志
1 package tools; 2 3 import java.io.IOException; 4 import java.util.logging.FileHandler; 5 import java.util.logging.Level; 6 import java.util.logging.Logger; 7 8 public class Log { 9 10 private static Logger l; 11 private static FileHandler fh; 12 13 /** 14 * 构造函数 15 * 16 * @since alpha 0.0.1 17 * 18 */ 19 private Log() { 20 try { 21 Log.l = Logger.getLogger(Config.GLOBAL_LOGGER_NAME); 22 Log.fh = new FileHandler(Config.LOG_FILE_NAME,true); 23 Log.l.addHandler(Log.fh); 24 Log.l.setLevel(Level.ALL); 25 } catch (SecurityException e) { 26 e.printStackTrace(); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } 30 } 31 32 /** 33 * 获取单利 - 单利模式 34 * 35 * @return Logger 36 * @since alpha 0.0.1 37 * 38 */ 39 private static Logger getInstance() { 40 41 if( Log.l == null ) { 42 new Log(); 43 } 44 45 return Log.l; 46 } 47 48 /** 49 * log 50 * 51 * @param l 52 * @param str 53 * @since alpha 0.0.1 54 * 55 */ 56 public static void log(Level l, String str) { 57 Logger logger = Log.getInstance(); 58 logger.log(l,str); 59 } 60 61 public static void flush() { 62 Log.fh.flush(); 63 } 64 65 public static void close() { 66 if( Log.l != null ) { 67 Log.l = null; 68 } 69 if( Log.fh != null ) { 70 Log.fh.flush(); 71 Log.fh.close(); 72 Log.fh = null; 73 } 74 } 75 76 }
调用代码:code
1 Log.log(Level.ALL,"some info");//此时内存增长20M 2 Log.close();//内存无变化,尽管加上System.GC()也没有变化