C/C++没有自动垃圾回收机制,一个对象如果不再使用需要手动释放,否则会出现内存泄漏。
内存泄漏:不再使用的对象在系统中未回收,可能导致内存溢出。
Java的自动垃圾回收机制 :GC机制。通过垃圾回收器来对不再使用的对象完成自动的回收,主要负责对堆上内存进行回收。
线程不共享的三部分,程序计数器,Java虚拟机栈以及本地方法栈,都是伴随着线程的创建而创建,线程的销毁而销毁,方法的栈帧会在执行完方法后自动弹出并释放掉对应的内存。不需要垃圾回收器来回收。
方法区的回收:
类的生命周期:加载,连接(验证,准备,解析),初始化,使用,卸载。
方法区中能回收 的内容主要就是不再使用的类,类的卸载条件较为苛刻:
1.此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象。(对象名=null可以释放此对象)
2.加载该类的类加载器已经被回收。(类加载器=null)
3.该类对应的java.lang.Class对象没有在任何地方被引用。(class=null)
如果需要手动触发垃圾回收,可以调用System.gc()方法。该方法并不一定会立即回收垃圾,仅仅向Java虚拟机发送一个垃圾回收的请求,具体是否需要执行垃圾回收Java虚拟机会自行判断。
开发中此类场景一般很少出现,因为自定义的类由应用程序加载器进行加载,这个类加载器运行时不会被回收。
主要出现在在OSGi、JSP的热部署应用场景中。
每个jsp文件对应一个唯一的类加载器,当一个jsp文件被修改了,就直接卸载这个jsp类加载器,重新创建类加载器,重新加载jsp文件。
热部署(Hot Deployment)是指在软件运行过程中,无需停止整个应用程序或服务,而是在不中断现有服务的情况下,动态地更新、替换或添加新的代码、配置或资源。这意味着可以在应用程序在运行时进行更新或更改,而无需停止或重新启动整个应用程序。