铁岭做网站包括哪些,什么是网络营销的基础,个人网站代做,微分销系统是什么文章目录 1、Garbage Collection2、方法区的回收3、堆对象回收4、引用计数法5、可达性分析算法6、查看GC Root对象 1、Garbage Collection
C/C#xff0c;无自动回收机制#xff0c;对象不用时需要手动释放#xff0c;否则积累导致内存泄漏#xff1a; Java、C#、Python、… 文章目录 1、Garbage Collection2、方法区的回收3、堆对象回收4、引用计数法5、可达性分析算法6、查看GC Root对象 1、Garbage Collection
C/C无自动回收机制对象不用时需要手动释放否则积累导致内存泄漏 Java、C#、Python、Go等支持对不再使用的对象进行回收 Java引入GC机制主要负责对堆上的内存进行回收简化了对象的释放但同时也丧失了回收的及时性因为回收操作不再又开发者做了。 线程不共享的部分随着线程的创建而创建随着线程的死亡而销毁不会发生内存泄漏。且栈里的每个栈帧在方法执行完后直接弹栈并释放内存都不用等到线程死亡。 添加JVM参数
-verbose:gc可查看回收日志
2、方法区的回收
即回收不再使用的类对应类生命周期里的卸载阶段。类A被卸载需同时满足
类的所有实例对象全被回收堆中再无它的对象或子类的对象加载类A的类加载器被回收类A的java.lang.Class对象没有任何地方在引用
URLClassLoader loader new URLClassLoader(new URL[] {new URL(file:D:\\lib\\)});
Class? clazz loader.loadClass(com.plat.domain.A);
Object a clazz.newInstance();
a null;
clazz null;
loader null;Demo代码如下循环体中创建的变量一轮结束后自动没用不用重复 o null
public class Demo2 {public static void main(String[] args) {try {ArrayListClass? classes new ArrayList();ArrayListClassLoader loaders new ArrayList();ArrayListObject objs new ArrayList();while (true) {//URLClassLoader classLoader new URLClassLoader(new URL[]{new URL(file:D:\\tmp\\)});BreakClassLoader1 classLoader new BreakClassLoader1(); //自定义类加载器classLoader.setBasePath(D:\\springboot\\jvm\\target\\classes\\);Class? clazz classLoader.loadClass(com.plat.app.Demo1);Object o clazz.newInstance();//循环体中创建的变量一轮结束后自动没用不用重复 o null 、clazz null 、classLoader null/*打开这里的任意一句就有一个对应的对象被引用类卸载就会失败objs.add(o);loaders.add(classLoader);classes.add(clazz);*///手动触发一次垃圾回收但不是立即//是对JVM的请求具体是否回收JVM自行决断System.gc();}} catch (Exception e) {e.printStackTrace();}}}public class Demo1 {static{System.out.println(类A被加载);}
}添加JVM参数
//运行过程中打印类的加载信息
-XX:TraceClassLoading //类被卸载的时候打印一句日志
-XX:TraceClassUnloading 运行 但其实类的卸载不常见因为自定义类的累加载器对象还在热部署中用的多 3、堆对象回收
Java对象能否被回收得看它是否还在被引用。 demo null后再无对Demo对象的引用可回收。 执行
a1 null
b1 nullA、B对象被回收因为方法中无法再通过引用访问到这两个对象了。总之判断方式
引用计数法可达性分析
4、引用计数法 即为每个对象维护一个计数器对象被引用就1置为null了就-1JVM扫描堆内存发现数值为0则回收 A a1 new A();
B b1 new B():
a1.SetB(b1);则A的计数器为1B的计数器为2 优点
简单也是C的智能指针的实现基础
缺点
1-1的维护损耗性能循环引用时导致计数器至少为1对象无法被回收内存泄漏 5、可达性分析算法 普通对象A经一个引用链可以到达GC Root对象则A不可被回收 GC Root对象即垃圾回收的根对象GC Root对象一般不会被回收且JVM持有GC Root对象的List列表
GC Root对象包括
线程对象Thread引用线程栈帧中的方法参数、局部变量等 系统类加载器加载的java.lang.Class对象引用类中的静态变量 监视器对象引用synchronized锁的对象 native本地方法调用时使用的全局对象
6、查看GC Root对象
步骤
阿尔萨斯的heapdump指令保存堆内存快照到本地磁盘
heapdump d:/tmp/test.hprof使用MAT工具打开堆内存快照文件