Java - 内存管理与垃圾收集

垃圾

[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.         第二次执行垃圾收集时不会再执行此方法,直接清楚垃圾对象   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值