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 - 方法拦截器和最终确定? 的相关文章

  • 从 Bitmap 类创建 .bmp 图像文件

    我创建了一个使用套接字的应用程序 客户端在其中接收图像并将图像数据存储在 Bitmap 类中 谁能告诉我如何创建一个名为我的图像 png or 我的图像 bmp来自此 Bitmap 对象 String base64Code dataInpu
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 获取TextView的高度

    我有一些文字将被放入TextView 我这样做是使用setText 现在我需要找到文本在文本中占据的行数或高度TextView 我尝试使用getHeight 但它总是返回 0 无论如何 有没有办法获得文本中存在的文本的高度TextView
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • JSON 对象数组转 Java POJO

    将此 JSON 对象转换为 java 中的类 您的 POJO 类中的映射将如何 ownerName Robert pets name Kitty name Rex name Jake This kind of question is ver
  • Spring 术语中命令、表单、业务和实体对象之间的区别?

    我试图理解这些对象在松散耦合系统方面的差异 业务对象与实体对象相同吗 我可以使用 MVC 中的业务或实体对象作为我的命令对象吗 命令对象与表单对象相同吗 只是寻找 Spring 术语和用法中对象类型的说明 我在 stackoverflow
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • 驱动程序信息:driver.version:未知,使用 ChromeDriver v78.0.3904.70 和 Chrome 浏览器 v78.0.3904.97

    我使用的是java 1 8和chrome浏览器版本78 0 3904 97 我正在尝试使用 chrome 驱动程序版本执行我的 selenium 脚本代码78 0 3904 70 但在执行时我面临以下问题并且 chrome 立即崩溃 Pic
  • activemq 的优先级

    我们目前正在使用 JMS 和 activemq 5 5 1 开发一个应用程序 我们想为某些消息定义更高的优先级 这将使它们首先被消耗 设置生产者和消费者后 通过spring 3 1 JMSTemplate 优先级并不能完全发挥作用 事实上
  • 使用 include 进行 JAXB 剧集编译不起作用

    我有 2 个模式 A B 我在 B 中重用了一些 A 元素 我不使用命名空间 我在用着
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • Storm Spout 未收到 Ack

    我已经开始使用storm 所以我使用创建简单的拓扑本教程 https github com nathanmarz storm wiki Tutorial 当我运行我的拓扑时LocalCluster一切看起来都很好 我的问题是我没有得到元组的
  • Apache Kafka 是否提供异步订阅回调 API?

    我的项目正在将 Apache Kafka 视为老化的基于 JMS 的消息传递方法的潜在替代品 为了让这个过渡尽可能的顺利 如果替代的排队系统 Kafka 有一个异步订阅机制那就更理想了 类似于我们当前项目使用的JMS机制MessageLis
  • 如何修改生成的SOAP请求?

    我正处于创建输出拦截器并从 SOAP 消息中获取 OuputStream 的阶段 但是 如何在将 SOAP 信封发送到端点之前对其进行修改呢 我想删除一些 xml 元素 一种方法是获取文档并通过 XSLT 转换运行它 您可以通过调用来获取拦
  • Python 可以替代 Java 小程序吗?

    除了制作用于物理模拟 如抛射运动 重力等 的教育性 Java 小程序之外 还有其他选择吗 如果你想让它在浏览器中运行 你可以使用PyJamas http pyjs org 这是一个 Python 到 Javascript 的编译器和工具集
  • 升级到 Tomcat 8 时出现 ClassNotFoundException

    我最近将 NetBeans IDE 从 v7 3 升级到 v8 突然我的应用程序在连接到数据库时在服务器启动时抛出异常 这两个版本的 IDE 之间的唯一区别是后者使用 Tomcat 8 异常日志 javax naming NamingExc
  • 如何在 Servlet 中打开弹出窗口,然后重定向页面

    我想在调用 servlet 时打开一个弹出窗口 然后想将 servlet 重定向到某个 jsp page 这就是我所做的 protected void doGet HttpServletRequest request HttpServlet

随机推荐

  • 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