cglib - 方法拦截器和最终确定?

2023-12-19

我使用cglibMethodInterceptor包装服务。在每次调用服务时,它都应该打开数据会话,将调用传递给服务,最后关闭会话。

但是,我注意到它在调用时行为不端Finalizer。我得到以下堆栈跟踪:

java.lang.IllegalArgumentException: interface my.pkg.SomeInterface is not visible from class loader
        at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
        at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
        at my.pkg.ProxyFactory.create(ProxyFactory.java:68)
        at my.pkg.SomeService.make(SomeService.java:181)
        at my.pkg.SomeService$SessionWrappingInterceptor.intercept(SomeService.java:1275)
        at my.pkg.SomeService$$EnhancerByCGLIB$$b58faf6a.finalize(<generated>)
        at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
        at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
        at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)

我究竟做错了什么?我该如何解决?


当终结器最终选择要终结的对象(或 CGLIB 代理对象)时,垃圾收集器已确定您的对象无法访问并且即将被丢弃/收集。我们假设这不是唯一被收集的对象,事实上它过去可能使用过的其他对象(包括它们的类加载器)也被收集了。

您的问题中没有足够的信息来确定发生了什么,但我的一般猜测是您的 ProxyFactory 正在做的工作需要曾经可以被该类加载器访问但不再可以访问的类,可能是由于以下事实您正处于垃圾收集的最后阶段。

我经历了惨痛的教训才知道,处理 Finalize() 调用的代理是非常危险的。在大多数情况下,您的代理目标实际上不需要处理该调用,但如果需要处理该调用,请不要在代理处理程序中执行任何将创建、初始化或以其他方式创建对代理目标的引用的操作。 (例如,我的情况是一个按需加载的对象。当调用finalize()时,如果该对象之前没有被加载过,它会加载它并将值缓存在创建新的强引用链的地方,从而不允许代理类、它的类加载器以及它引用的许多其他类都会被收集。大量内存泄漏。)

我的建议(尽管已经很晚了)是禁止你的代理处理finalize()。可以为 CGLIB 的增强器提供 CallbackFilters 以指示不对 Finalize() 方法执行任何操作,或者如果您使用简单的 MethodInterceptor,则可以自行检查。

最后一条评论:小心回调过滤器 http://cglib.sourceforge.net/apidocs/net/sf/cglib/proxy/CallbackFilter.htmls。它们还可能导致内存泄漏,特别是如果它们来自与 CGLIB 不同的类加载器!您最终将得到 CGLIB 生成的对象,这些对象保留着不会被垃圾收集的 CallbackFilter 实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cglib - 方法拦截器和最终确定? 的相关文章

  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • Rust/rocket 将变量传递到端点

    不符合我的喜好 但我今天被迫编写一些 Rust 所以我尝试创建一个只有一个端点的 Rocket 实例 但是 在该端点上我需要访问在 main 期间创建的变量 该变量需要很长时间才能实例化 所以这就是我在那里这样做的原因 我的问题是我找不到安
  • 使用 SwiftUI 成功登录后导航

    我正在使用 Firebase 和 SwiftUI 以用户身份登录 我一切正常 但无法弄清楚用户成功登录后如何导航到下一页 导航链接对我来说似乎很奇怪 所以我想知道是否有其他方法可以导航到下一个视图 这LoginView包含登录屏幕和Logi
  • Spring Boot Oauth2 对同一 URL 使用多个 grant_types

    是否可以配置Spring Boot以允许Oauth2补助金类型password and authorization code在同一个 URL 上 例如 boot 我已经完成了基本的授权配置 如下所示 security oauth2 clie
  • this.setState 在 React 中返回 Promise

    我做了我的componentWillMount 异步 现在我可以使用await与setState 这是示例代码 componentWillMount async gt const fetchRooms this props await th
  • 捕获代码中的异常

    我正在尝试这段代码来检查是否捕获了除以零异常 int main int argc char argv try Divide by zero int k 0 int j 8 k catch std cout lt lt Caught exce
  • Django 使用电子邮件身份验证和 djoser 进行登录

    所以我最近尝试使用 djoser 我想使用电子邮件而不是用户名登录 左塞尔 http djoser readthedocs io en latest index html http djoser readthedocs io en late
  • file.create 之后 My.computer 无法访问文件

    我有一些代码来删除一个文件 创建另一个文件 这样我就可以覆盖它 并在上面写入 My Computer FileSystem DeleteFile pass File Create pass My Computer FileSystem Wr
  • PyMC 错误:hasattr():属性名称必须是字符串

    我在 PyMC 中的模型上运行推理时遇到问题 我正在尝试在相当复杂的模型上运行 MCMC 并且收到以下错误 hasattr attribute name must be string 我在这段代码的最后一行得到了这个 抱歉 这很复杂 但我真
  • 将数据库移至生产服务器需要什么版本的 SQL Server?

    我刚刚在本地 Windows XP 计算机上完成了 ASP NET 的开发 我使用 Visual Studio 2008 和 SQL Server Express 来开发该网站 我的问题是 现在我想将 SQL Server 数据库从我的 X
  • 如何使用 MediaCodec 和 MediaMuxer 录制视频和音频

    我能够在 MediaCodec 和 MediaMuxer 的帮助下录制 编码 视频 接下来 我需要在 MediaCodec 和 MediaMuxer 的帮助下处理音频部分以及将音频与视频复用 我面临两个问题 如何使用 MediaCodec
  • Symfony webpack encore twig 功能不起作用

    我正在 Symfony 4 项目中使用 twig 生成静态 html 页面 我尝试使用简单的循环和 Twig 渲染函数同时生成多个页面 代码如下所示 foreach pages as page html this gt twig gt re
  • 如何访问 WordPress 身份验证令牌

    我们正在尝试使用 OAuth 2 0 将我们的网站链接到 Wordpresses API 希望客户能够从我们的网站进行身份验证并发布到 WordPress 我们需要接收访问令牌才能执行此操作 我们已成功连接 WordPress 以接收我们的
  • 设置类路径层次结构中的其他目录

    有两个目录 出租车 C a c 嗯 我在说目录中 c a b 当我执行 set classpath cd 时 目录 C a b 被分配给类路径变量 但我想将 C a c 分配给类路径 我怎样才能做到这一点 如果您需要将类路径设置为当前所在目
  • C++事件库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您能否推荐具有以下功能的轻量级跨平台事件记录 日志库 简单的界面 增量事件记录 即event 更新快
  • 更改notepad++中的注释字符

    我正在 notepad 中编辑 properties 文件 我可以使用 Cntrl K 切换块注释 但它会显示 代替 我修改 langs model xml 文件并替换 和 我重新启动了记事本 但它不起作用 有谁知道如何更改属性文件的记事本
  • onCreateOptionsMenu 何时在启用 ActionBar 的活动中发生?

    我知道菜单项将被设置为 ActionBar 中的操作图标 我想确切地知道这个 onCreateOptionsMenu 函数 它在 Activity 生命周期中何时调用 根据我的测试 即使在 onResume 之后也没有 该文档说明如下 pu
  • 如何将服务器生成的音频wav文件发送到客户端浏览器? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我在我的应用程序中使用烧瓶 我想将音频 wav 文件从服务器端发送到客户端 无论是否将 wav 文件保存在磁盘上 知道怎么做吗 您可以使用以
  • 这是 ServiceStack REST API 上的 Redis 的良好用例吗?

    我正在创建一个移动应用程序 它需要一个 API 服务后端来获取 放置每个用户的信息 我将开发网络服务服务栈 http www servicestack net 但想知道存储情况 我喜欢快速内存缓存系统的想法 例如Redis http red
  • 如何修复 Wordpress 的 WooCommerce 结帐时的无限缓冲区

    我目前遇到一个问题 在 Woocommerce 结账页面上 订单审核部分卡在无限缓冲区中 见下文 我在谷歌上搜索了很多并尝试了各种方法 但到目前为止没有任何效果 在我见过的大多数支持线程中 人们说他们已经能够在 Chrome Firefox
  • cglib - 方法拦截器和最终确定?

    我使用cglibMethodInterceptor包装服务 在每次调用服务时 它都应该打开数据会话 将调用传递给服务 最后关闭会话 但是 我注意到它在调用时行为不端Finalizer 我得到以下堆栈跟踪 java lang IllegalA