新AI研究令人大开眼界
他的影响在于只要finalize没有执行,那么这些对象就会一直存在堆区,不过这里只是4个包含了finalize的对象,影响不是那么大,如果有一万个或者是十万个呢?这就影响大了。 finalize的原理其实很简单,在这里简要的梳理一下: (1)对象在初始化的过程中会判断是否重写了finalize,方法是判断两个字段标志has_finalizer_flag和RegisterFinalizersAtInit。 (2)如果重写了finalize,那就把当前对象注册到FinalizerThread的ReferenceQueue队列中。注册之后的对象就叫做Finalizer。方法是调用register_finalizer函数。此时java虚拟机一看当前有这个对象的引用,于是就不进行垃圾回收了。 (3)对象开始被调用,FinalizerThread线程负责从ReferenceQueue队列中获取Finalizer对象。开始执行finalize方法,在执行之前,这个对象一直在堆中。 (4)对象执行完毕之后,将这个Finalizer对象从队列中移除,java虚拟机一看对象没有引用了,就进行垃圾回收了。 这就是整个过程。不过在这里我们主要看的是finalize方法对垃圾回收的影响,其实就是在第三步,也就是这个对象含有finalize,进入了队列但一直没有被调用的这段时间,会一直占用内存。 注意:这里其实就是一道面试题,我在看牛客网上的面经时,看到有人被问到过。也就是GCRoot不可达的对象,会立刻被垃圾回收吗? 我们使用一个案例来分析一波: 二、案例演示
我们创建一个类 这个问题是我在刷牛客面经的时候遇到的,还特地整理在了我的常规面试题文档中,所以这道题主要考察的就是finalize方法的影响。 java提供了一个finalize方法,可以帮助我们进行资源释放,类似于C++中的析构函数。这篇文章对其进行一个说明。 一、为什么有影响 我们都知道一个对象GCRoot不可达,java虚拟机就认为是垃圾对象,就会进行垃圾回收,但是如果这个对象包含了finalize函数,性质就不一样了。怎么不一样了呢?
java虚拟机在进行垃圾回收的时候,一看到这个对象类含有finalize函数,就把这个函数交给FinalizerThread处理,而包含了这个finalize的对象就会被添加到FinalizerThread的执行队列,并使用一个链表,把这些包含了finalize的对象串起来。 4 SonarQube项目授权问题 我们在前面解决了SonarQube扫描前的一些问题,现在开始解决授权问题。 Sonarqube的授权配置
亲测: 新生成的项目还需要再应用权限模板后才能使对应的项目组成员访问。 解决:在项目扫描后,调用接口对当前项目应用对应的权限模板。
请参考👆问题解决中的Jenkinsfile文件。 5 总结 今天我们解决了常用的几个问题,当然还有可能还会有很多问题待解决。总结一下我们解决问题的思路。 我们将Jenkins和SonarQube做了集成,通过API能够满足我们的需求。
我们也可以在Jenkins上面创建一个项目,比如用户Sonar项目授权等等。 (编辑:鹰潭站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |