当前位置: 移动技术网 > IT编程>开发语言>Java > GC垃圾回收机制

GC垃圾回收机制

2019年05月31日  | 移动技术网IT编程  | 我要评论
个人理解: 因为在使用JAVA创建一个类或者对象后,难免会存在以后不使用的情况,为了减少其继续再占用内存,必须建立一套清理垃圾的机制,但是怎么判断什么样的才算是不使用的垃圾呢,这里面进行了判断并标记分类,然后根据不同的标记再进行不同的处理。不过世事无完美之说,其也是存在弊端的(开销通常很大,而且它的 ...

**1.

  1. JAVA中的断点(Debug)过程分析:

1)f8 当前断点运行结束,假如有下一个断点则直接跳转到下一个断点。
2)f6 单步执行
3)f5 进入调用的方法内部
4)f7 从方法内部出去回到调用处。
1.2 断点分析Integer类中的valueOf方法

public class TestDebug02 {
	public static void main(String[] args) {
		Integer a1=100;//等号右边的代码编译时执行的操作是Integer.valueOf(100);
		Integer a2=100;
		Integer a3=200;//Integer.valueOf(200),池中没有则new Integer(200)
		Integer a4=200;
		System.out.println(a1==a2);//true,Integer类有一个整数池,池中存储了-128~+127
		System.out.println(a3==a4);//false,池中没有,它会重新new Integer(200);
	}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 定义一个点对象类型
 */
class Point{
	int x;
	int y;
	public Point(int x,int y) {
		this.x=x;
		this.y=y;
	}
	/**
	 * finalize方法会在对象被回收(GC)之前执行,可以对对象的回收进行监控,
	 * 也可以在对象回收之前进行一些资源释放操作。
	 */
	@Override
	protected void finalize() throws Throwable {
		System.out.println("finalize()");
	}
}
//通过JVM参数检测是否触发了GC操作:-XX:+PrintGCDetails
public class TestGC01 {
	static Map<String,Object> objectPool=new HashMap<>();
	public static void main(String[] args) throws InterruptedException {
    	//构建一个实例对象,并通过P1引用指向这个对象
		 Point p1=new Point(10,20);//p1为一个强引用
		 objectPool.put("point", p1);//Spring中的singleton作用域
		 p1=null; //Spring中prototype作用域对象的销毁
		 objectPool.clear();//Spring中Singleton作用域的销毁
		//请问对于p1引用的这个对象何时会被标识垃圾对象,何时会被回收,如何确定此对象被回收了
		//1)当p1引用不再指向构建的Point对象时,此对象会被GC系统认为是垃圾对象。
		//2)当JVM系统触发了GC操作时,对象可能会被回收。
		//3)此对象会被JVM中的垃圾回收系统(GC系统)进行回收。(释放内存)
		//触发GC操作?(GC系统触发时会对内存中的对象进行可达性分析,就是检测是否还可以通过引用
		//访问到此对象,假如不能通过任何引用访问此对象,这个对象就会被标识垃圾)
		//1.手动GC
		//System.gc();
		//2.自动GC(满足了GC条件时或者说内存使用达到一定的GC启动标准)
		 List<byte[]> list=new ArrayList<>();
		 for(int i=0;i<100000;i++) {
			 list.add(new byte[1024*1024]);
		 }
	}
import java.lang.ref.WeakReference;
/**
 3.FAQ:
 * 1)当对象存在引用时,是否可能在系统触发GC时被回收?可能,要看引用类型?
 * 2)当GC系统触发时,假如对象要被销毁了会执行finalize方法吗?会的。
 
 4.JVM GC 系统
 * 1)市场常见GC算法?(不限于java平台)
 * 2)JVM中常见GC算法?(不同规范的实现,算法不相同)
 * 3)JVM规范的实现HotSpot虚拟机有什么GC算法的应用?具体应用场景有什么不同。
 */
class Container{
	private Object[] array;
	public Container(int cap) {
		this.array=new Container[cap];
	}
	//....
	@Override
	protected void finalize() throws Throwable {
		System.out.println("==finalize()==");
	}
}
public class TestGC02 {
    public static void main(String[] args) {
    	doMethod01();
	}
	
5.在JAVA中我们可以使用的对象引用方式有四种:
	 * 1)强引用:此引用引用的对象,生命力最强。(对象不会被GC)
	 * 2)软引用:此引用引用的对象,在内存不足时可能会被GC。
	 * 3)弱引用:此引用引用的对象,在GC执行时可能直接会被销毁(即便是内存充足)。
	 * 4)虚引用:用的最少,类似没有引用,主要用于记录对象的销毁。---了解
	 * 
	 * 说明:软引用和弱引用通常会应用在一些缓存产品的设计中。
	 */
	private static void doMethod01() {
 1.强引用
    	//Container c1=new Container(100);//c1就是强引用
    	//c1=null;//此时c1指向的Container对象不可达(也就是说JVM访问不到了)
  2.软引用
    	//SoftReference<Container> c2=new SoftReference<Container>(new Container(20));
    	//Container cc=c2.get();//这种写发是又将软引用转换为了强引用。不推荐
    	//System.out.println(c2.get());//通过软引用获取和操作对象
   3.弱引用
    	WeakReference<Container> c3=new WeakReference<Container>(new Container(100));
    	System.out.println(c3.get());
    	
    	//手动GC
    	System.gc();//GC启动以后,GC系统会对内存中的对象进行可达性分析。访问不到则进行标记。
    	//自动GC(通过JVM参数进行分析)
//    	List<byte[]> list=new ArrayList<>();
//    	for(int i=0;i<100000;i++) {
//    		list.add(new byte[1024*1024]);
//    	}
	}
}

/**

  • 当GC系统没有启动时,对象是否可能被回收?可能,看你对象分配在哪了?
  • 说明:JAVA中大多数对象都会存储在堆(Heap)中,但对于一些没有逃逸的小对象
  • 现在也可能分配在栈上(JVM发展历程中的一种新的优化方式。)。
 */
public class TestGC03 {
    //-XX:+PrintGCDetails
	public static void main(String[] args) {
		for(int i=0;i<100000000;i++) {
			doMethod01();
		}
	}
static byte[] b2;
static void doMethod01() {
   //小对象,未逃逸,栈上分配,栈上分配对象的对象,方法调用结束,对象销毁。
   //byte[] b1=new byte[1024*1024]; //小对象,未逃逸(方法外界没有引用指向此对象),可以直接分配在栈上
   //小对象,已逃逸,堆上分配,对象回收需要借助GC系统。
   b2=new byte[1];//小对象,但逃逸了(方法外部有引用指向此对象),对象分配在堆上
}
//JDK8中默认会打开逃逸分析选项,希望未逃逸的小对象分配在栈上,这样可以避免启动GC对对象进行回收。

}**

本文地址:https://blog.csdn.net/weixin_45130688/article/details/107385433

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网