垃圾回收

垃圾回收

1:java 的内存分为三部分
栈:stack 局部变量。
栈内存的回收,自动回收,方法结束,就回收了。
堆:heap 对象 new 出来的对象。
动态管理分配的 堆内存。进行垃圾回收。
方法区:字节码元数据,静态变量。
常驻内存数据。

2:java 垃圾回收的内存区域,指的是 堆内存。

3:什么样的内存属于垃圾内存?
答:没有引用指向的对象所占用的内存 就是 垃圾内存。

4:如何让你对象所占用的内存成为垃圾内存?
将所有指向某个对象的引用 都 赋值为 null。

5:如何回收垃圾内存?
jvm 中包含了 垃圾回收器 garbage collection。 GC
垃圾回收器 是 jvm 的一个组成部分,它就负责监测回收 堆内存中的垃圾内存。

   垃圾回收器工作的时候会影响程序的运行,会导致程序运行速度降低。jvm 在垃圾回收的机制上,GC 运行的优先级是最低的。
   规则:
   1:程序处于一个闲置的状态,可能会进行一次垃圾回收。
   2:当在堆中申请一块内存的时候,空间不够了,运行一次垃圾回收器。如果空间仍然不够,那么再次运行 GC 垃圾回收。如果内存还不够使用,那么就报错。
           堆内存溢出。

6:是否可以通过程序代码来实现运行垃圾回收器?
可以的。
在System类提供了一个方法 。System.gc();
调用System.gc():通知 jvm 运行一次垃圾回收器。但是不能保证 GC 立即执行。

public static void gc()运行垃圾回收器。
调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。
调用 System.gc() 实际上等效于调用:
Runtime.getRuntime().gc()

7:finalize():终止方法,Object 类的默认是现实 是空实现。
如果某个对象被垃圾回收器回收,那么该对象对应的类型中的finalize()方法会被GC调用。
该方法不要主动调用,只能被动调用。
可以在finalize() 中对对象做最后的清理工作。善后的工作。
通常更建议的方式是自定义方法来进行善后的处理。

java 的jvm 内存分为 3部分:
1:java 栈 stack :
所有的局部变量都在栈中分配空间。
静态内存分配的。每个方法调用的时候占用多少内存在编译期就确定了。栈内存是连续分配的。
导致了栈中数据的存取 效率 略低于 cpu 寄存器。 效率是比较高的。

	所以,如果在方法内部能用局部变量实现的功能,尽量使用局部变量。

	栈内存的回收 是方法返回 自动回收。

2:java 堆  heap
	所有的new 出来的对象都在堆中分配空间。  数组 ,对象 等等。
	堆是jvm 动态管理的。在运行期 对创建的对象进行空间动态的分配。
	内存管理灵活,但是效率相对较低。
	
	堆内存有专门的进行垃圾内存回收的机制(精彩内容待续。。。)

3:方法区  method area
	运行时需要的数据存储区:
		类的字节码元数据(模版数据)。
		常量池
		静态数据区
	不回收。


从物理上来讲 堆 和 方法区 都属于 堆。因为存放管理的数据不同,加以名字上的区分。

关于垃圾回收,有三点需要记住:

1、对象可能不被垃圾回收。只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。

2、垃圾回收并不等于“析构”。

3、垃圾回收只与内存有关。使用垃圾回收的唯一原因是为了回收程序不再使用的内存。

面试题

1:简述垃圾回收机制
显示回收垃圾的缺点
1:忘记回收,导致内存泄露,降低系统性能
2:错误的回收程序核心类库的内存,导致系统崩溃
Java自动垃圾回收,GC
1:提高编程效率。
2:保护程序完整性
3:垃圾回收机制的开销影响性能,因为jvm必须跟踪程序中的有用对象,确定哪些是无用的。
垃圾回收机制的特点
1:回收的堆中的对象,不负责回收栈中的。
2:对于一些物理连接,比如数据库连接,IO流,socket连接没有用。
3:垃圾回收是不可预知的,程序无法精确控制垃圾回收执行。
4:可以将对象=null,按时虚拟机回收。
JVM有多种积极回收算法,在对象被回收之前,都会调用对象的finalize方法。但是不应该在程序中调用它。

发布了39 篇原创文章 · 获赞 3 · 访问量 4833
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览