手机网站可以做公众号,三亚做网站那家效果好,手机微网站 模板,wordpress本地打开慢目录 1.自动垃圾回收介绍1.C/C的内存管理2.Java的内存管理3.垃圾回收的对比 2.方法区的回收方法区的回收 – 手动触发回收 3.堆回收1.引用计数法2.可达性分析算法 1.自动垃圾回收介绍
1.C/C的内存管理
⚫ 在C/C这类没有自动垃圾回收机制的语言中#xff0c;一个对象如果不再… 目录 1.自动垃圾回收介绍1.C/C的内存管理2.Java的内存管理3.垃圾回收的对比 2.方法区的回收方法区的回收 – 手动触发回收 3.堆回收1.引用计数法2.可达性分析算法 1.自动垃圾回收介绍
1.C/C的内存管理
⚫ 在C/C这类没有自动垃圾回收机制的语言中一个对象如果不再使用需要手动释放否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收而需要程序员编写代码进行回收的方式为手动回收。 ⚫ 内存泄漏指的是不再使用的对象在系统中未被回收内存泄漏的积累可能会导致内存溢出。
2.Java的内存管理
⚫ Java中为了简化对象的释放引入了自动的垃圾回收Garbage Collection简称GC机制。通过垃圾回收器来对不再使用的对象完成自动的回收垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器。
3.垃圾回收的对比 自动垃圾回收 自动根据对象是否使用由虚拟机来回收对象 • 优点降低程序员实现难度、降低对象回收bug的可能性 • 缺点程序员无法控制内存回收的及时性 手动垃圾回收 由程序员编程实现对象的删除 • 优点回收及时性高由程序员把控回收的时机 • 缺点编写不当容易出现悬空指针、重复释放、内存泄漏等问题 2.方法区的回收 ⚫ 线程不共享的部分都是伴随着线程的创建而创建线程的销毁而销毁。而方法的栈帧在执行完方法之后就会自动弹出栈并释放掉对应的内存。 ⚫ 方法区中能回收的内容主要就是不再使用的类。 判定一个类可以被卸载。需要同时满足下面三个条件 1、此类所有实例对象都已经被回收在堆中不存在任何该类的实例对象以及子类对象。
2、加载该类的类加载器已经被回收。
3、该类对应的 java.lang.Class 对象没有在任何地方被引用
方法区的回收 – 手动触发回收
⚫ 如果需要手动触发垃圾回收可以调用System.gc()方法。 ⚫ 语法 System.gc() ⚫ 注意事项 调用System.gc()方法并不一定会立即回收垃圾仅仅是向Java虚拟机发送一个垃圾回收的请求具体是否需要执行垃圾回收Java虚拟机会自行判断 ⚫ 方法区中能回收的内容主要就是不再使用的类。 判定一个类可以被卸载。需要同时满足下面三个条件 1、此类所有实例对象都已经被回收在堆中不存在任何该类的实例对象以及子类对象。 2、加载该类的类加载器已经被回收。 3、该类对应的 java.lang.Class 对象没有在任何地方被引用。
3.堆回收
如何判断堆上的对象可以回收 Java中的对象是否能被回收是根据对象是否被引用来决定的。如果对象被引用了说明该对象还在使用不允许被回收 循环引用
如何判断堆上的对象没有被引用 常见的有两种判断方法引用计数法和可达性分析法。
1.引用计数法
引用计数法会为每个对象维护一个引用计数器当对象被引用时加1取消引用时减1 引用计数法的优点是实现简单C中的智能指针就采用了引用计数法但是它也存在缺点主要有两点
1.每次引用和取消引用都需要维护计数器对系统性能会有一定的影响2.存在循环引用问题所谓循环引用就是当A引用BB同时引用A时会出现对象无法回收的问题。
查看垃圾回收日志 ⚫ 如果想要查看垃圾回收的信息可以使用-verbose:gc参数。 ⚫ 语法 -verbose:gc
2.可达性分析算法
Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类垃圾回收的根对象GC Root和普通对象对象与对象之间存在引用关系。下图中A到B再到C和D形成了一个引用链可达性分析算法指的是如果从某个到GC Root对象是可达的对象就不可被回收。 哪些对象被称之为GC Root对象呢 ⚫ 线程Thread对象。 ⚫ 系统类加载器加载的java.lang.Class对象。 ⚫ 监视器对象用来保存同步锁synchronized关键字持有的对象。 ⚫ 本地方法调用时使用的全局对象。