以下是我对垃圾回收机制的一些理解:
一:在程序员的java开发过程中,需要关心内存的动态分配和垃圾回收吗?
不需要,内存的动态分配和垃圾回收,交给了JCM去处理
我们需要知道,java回收机制的存在,使得程序员不需要手动管理内存,大大提高了开发效率,也可以有效的避免人为的疏忽造成内存的泄露。
二:java的对象实例存储在哪?
通过对java内存模型的了解,知道java的对象实例基本都存储在java堆内
三: 堆内存内的对象被细致划分为:年轻代;年老代;永久代,将不同状态的对象放到堆内不同的区域。JVM 划分的堆内存:Eden,Survivor和Tenured/ Old空间。
四:在实际开发过程内,容易造成内存泄露的操作有哪些?
1.创建大量无用对象
在需要大量拼接字符串时,使用了String而不是StringBuilder
String str = "";
for(int i=0;i<1000;1++){
str+= i;
}
这种操作相当于产生了1000个无用的String对象
- 静态集合类的使用
使用HashMap,Vector,List等的使用最容易出现内存的泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不可以被释放。 - 在使用了各种连接对象 如:IO流对象,数据库连接对象,网络连接对象 这些没有进行关闭
- 监听器的不当使用 :
在释放对象时,没有删除相对应的监听器
五:需要明确
- 程序员无权调用垃圾回收器
- 程序员虽然可以调用System.gc(0,这个方法只是通知JVM,但并不是运行垃圾回收器,我们应该尽量少用,会影响系统性能
- finalize方法,是java提供给程序员原来释放对象或资源的方法,但我们也要尽量少用
六:垃圾回收过程一般可以分为两步:
先标记,也就是先找出垃圾在哪,垃圾回收器先找出那些需要回收的对象所在的内存和不需要回收的对象所在的内存,将其标记出来
然后清除,垃圾回收器会清除掉标记出来的 那些需要回收的对象区域
七:对 JVM 调优的过程中,很大一部分工作就是对于 Full GC 的调节