java垃圾回收机制(学习总结)

在java中,内存分配和垃圾回收都是交给JVM处理的,接下来就按这两大块来分析。

垃圾回收

1.GC简介: java垃圾回收机制(Garbage Collection)可以对程序中没有任何引用的对象(即不被使用的对象)所占据的内存空间进行释放。GC是由JVM在系统空闲时间执行的,程序员无权调用垃圾回收器,但可以通过System.gc();,通知GC运行,但java规范不一定会立即执行,正如上面说的,GC自动在系统空闲时进行垃圾回收,java也提供了给程序员释放对象或资源方法,但是尽量少用。

2.怎么判断是不是垃圾: java中的对象都是和引用关联在一起的,也就是地址,如果要操作java中的对象
就必须通过引用来进行操作,java判断对象是不是垃圾,就是通过计数该对象的引用,若引用数为零,自然该对象没有被使用,就会视为垃圾,被GC回收,这个方法也叫,引用计数法。(搜索了一下这个问题,似乎java有比引用计数更好的方法,对于“没有被引用的对象就是垃圾,有引用的对象不是垃圾“这句话也是有争议的,想更全面深入的了解请再查找其他资料。)

3.关于垃圾回收java和c++的不同: java是由GC自动进行垃圾回收的,而c++是由程序员来删除对象的,老师给了一个很好的例子,比如大家去餐馆吃饭,c++是顾客去吃然后自己把自己产生的垃圾处理掉,但是并不是所有的顾客都有良好的素质,这样就有可能造成垃圾堆积没有人管理,从而导致这张桌子不能再被使用了,那java就是顾客来吃完就走,会有服务员定时的清理垃圾,桌子虽然不是时时刻刻都干净,但不会出现(极大可能的避免了)垃圾堆满导致桌子不能使用的情况。

内存分配

1.栈和堆:在java中,栈用来存放对象的引用,堆用来存放通过NEW 关键字创建出来的对象,堆中的方法区存放一些类的代码信息,常量池,以及STATIC的变量和方法。(关于堆和方法区,我在提问问题时看到不同的解释,老师讲的是方法区也是在堆上的,如有不对欢迎指正!)

2.常量池: java创建对象是一些字符串,并不是直接存储在对象中得,而只是存储他们的引用,这些字符串在代码运行时,就加载到了堆中的方法区。

3.STATIC的变量和方法:成员变量和对象是一致的,对象存在,成员变量就存在在对象中,但是静态变量不是这样,在加载类的时候,静态变量和方法就储存在了方法区中,静态变量和方法是和类一致的,这也就解释了,为什么在静态方法中不可以调用成员变量,只能调用静态变量,为什么静态变量和方法可以直接用过类名使用,而非静态方法却不可以。

你可能感兴趣的:(java)