关于JAVA中的垃圾回收解决方案

关于JAVA中的垃圾回收
JAVA的垃圾回收机制是不是可以这么理解:
(1)对象所占用的内存空间(通常是经由new创建,在堆中),是由垃圾回收器负责回收;但是这种回收并不一定会发生,JAVA中的对象并不一定会被销毁;内存空间如果没用完,垃圾回收也许永远不会执行。
(2)而对于非“创建对象”分配的内存,JAVA的finalize()方法派上用场。JAVA中一切皆为对象,所谓的“非创建对象”分配的空间,是指调用“本地方法”获得的空间分配,比如C语言中malloc函数分配的内存,需要free()方法释放内存,但是free()是C和C++中的方法,因此需要用finalize()调用本地方法来完成这种空间的清理。
(3)finalize()方法是在垃圾回收器执行回收之前调用的。但是垃圾回收并不一定会执行,因此finalize()并不一定会被调用。因此,finalize()方法并不能用于通用清理工作。
(4)Java中的垃圾回收不同于C++中的析构函数。、

以上是我的理解,不知道有哪些不对。另外,我有一些疑惑是:
(1)finalize()的调用是与垃圾回收器的执行相关联的。而垃圾回收器只是负责回收对象所占用内存,也就是说,当对本地方法分配的内存进行清理时,是不需要垃圾回收器的,那么是如何触发finalize()方法工作的?
(2)垃圾回收器是对堆中对象分配的空间进行清理,那么堆栈中的空间分配(对象引用、基础类型变量)是如何清理的?(答案是否是这样:因为堆中的变量是不知道存活时间常短的,因此需要适时的回收,而堆栈中的变量都是明确知道生命周期的,因此当其生命周期结束时,自然就清理)。
(3)垃圾清理真的是将相应的存储空间清空吗?

------解决方案--------------------
上次看垃圾回收时候收藏的一个博客地址 楼主参考下  Java垃圾回收及finalize()的用途 
------解决方案--------------------
这块的内容,建议你看下《深入理解Java虚拟机:JVM高级特性与最佳实践》第3章的内容,那里面讲的很详细
------解决方案--------------------
JAVA的垃圾回收机制是不是可以这么理解:
(1)对象所占用的内存空间(通常是经由new创建,在堆中),是由垃圾回收器负责回收;但是这种回收并不一定会发生,JAVA中的对象并不一定会被销毁;内存空间如果没用完,垃圾回收也许永远不会执行。
gc是有触发条件的,当一个小对象准备要在新生代被创建的时候,如果这时发现新生代满了,那么会触发一次minor gc。老年代类似,只不过触发的是full gc
(2)而对于非“创建对象”分配的内存,JAVA的finalize()方法派上用场。JAVA中一切皆为对象,所谓的“非创建对象”分配的空间,是指调用“本地方法”获得的空间分配,比如C语言中malloc函数分配的内存,需要free()方法释放内存,但是free()是C和C++中的方法,因此需要用finalize()调用本地方法来完成这种空间的清理。
finalize并不是用来释放诸如本地方法持有的资源。设计者原本的意思是效仿c/c++里的析构,但是事实上finalize被证明不是一个有效的手段。所有现在的 规范里都是建议不要用这个方式来释放资源
(3)finalize()方法是在垃圾回收器执行回收之前调用的。但是垃圾回收并不一定会执行,因此finalize()并不一定会被调用。因此,finalize()方法并不能用于通用清理工作。
finalize的失效通常是,当一个对象准备要回收的时候,系统会调用,但是finalize只会被调用一次,这意味着如果准备回收而对象没有被回收的话,这个对象可以继续工作,但是其之后持有的资源却不能用finalize来释放。这就是finalize不能有效释放资源的原因
(4)Java中的垃圾回收不同于C++中的析构函数。、
absolutely right! 本质的区别就是,java希望使用者不要在应用的层面来关注底层资源有没有被释放。在新的jdk版本中,甚至连io这种资源都能做到自动释放。意义就是,更加关注业务层面的实现,而不是底层

以上是我的理解,不知道有哪些不对。另外,我有一些疑惑是:
(1)finalize()的调用是与垃圾回收器的执行相关联的。而垃圾回收器只是负责回收对象所占用内存,也就是说,当对本地方法分配的内存进行清理时,是不需要垃圾回收器的,那么是如何触发finalize()方法工作的?
本地方法的资源如何管理的,这个我也没有研究过
(2)垃圾回收器是对堆中对象分配的空间进行清理,那么堆栈中的空间分配(对象引用、基础类型变量)是如何清理的?(答案是否是这样:因为堆中的变量是不知道存活时间常短的,因此需要适时的回收,而堆栈中的变量都是明确知道生命周期的,因此当其生命周期结束时,自然就清理)。
栈是线程私有的,线程结束了,栈就没了。线程里执行的方法里的临时变量,执行完了就销毁了
(3)垃圾清理真的是将相应的存储空间清空吗?
不能说是清空吧,可能用“清理、整理”来描述更确切。本质上是自动探测,将无用的内存释放出来,有用的保留