跳到内容
  • 福昕首页
  • 开发中心
  • SDK文档资料
  • 插件商店
  • 福昕首页
  • 开发中心
  • SDK文档资料
  • 插件商店
申请试用
  • 企业自动化
    • Compressor
  • 福昕CloudAPI
  • 福昕PDF SDK 软件开发工具包
    • 福昕PDF SDK(ActiveX)
    • 福昕PDF SDK(桌面/服务器)
    • 福昕PDF SDK(Plug-in)
    • 福昕 PDF SDK(安卓)
    • 福昕PDF SDK(iOS)
    • 福昕PDF SDK(Web)
  • 福昕管理控制台
    • 公有云
    • 私有云
    • 通用情况
  • 福昕阅读器
    • RMS插件
  • 福昕高级编辑器
    • AI助手
    • Mac版本
      • 常规问题
    • Windows版本
      • ECM集成
      • 互联PDF
      • 企业管理指南
      • 保护
      • 内容编辑
      • 创建PDF
      • 压缩
      • 图章
      • 安装与卸载
      • 常见问题
      • 打印
      • 注释/评论
      • 福昕插件
      • 翻译助手
      • 翻译助手教程
      • 试用与激活
      • 转换
      • 页面管理
    • 教育用户
      • 论文查重
      • 论文畅
      • 操作指南
    • 网页版
      • Foxit eSign
      • 电子签章
    • 订阅
    • 资源
  • 福昕高级编辑器Linux版本
  • 福船图纸管理系统
  • 福昕PDF SDK 软件开发工具包 > 福昕PDF SDK(桌面/服务器)
  • 标签:
  • C++对象,C++对象的生命周期,CPU管理,delete方法,finalize方法,Java,swig,内存泄漏,内存管理,垃圾回收机制,垃圾回收机制(GC),对象释放,引用计数,高并发场景

SDK Java在高并发场景下的内存与CPU管理:原因分析与对象释放策略

  • 福昕知识库
  • 2025-03-11

背景

在Java SDK中,通过SWIG技术生成的Java包装类负责管理底层C++对象的生命周期。这些Java包装类通常提供一个delete方法,用于显式释放与之关联的C++对象。然而,Java的垃圾回收机制并不保证立即释放超出作用域的Java对象,这可能导致底层C++对象的释放延迟,进而影响内存和CPU的使用效率。

手动调用delete方法

开发者可以在代码中显式调用delete方法,以确保及时释放C++对象,避免内存泄漏。这种方式特别适用于资源管理要求严格的场景,尤其是在高并发环境下,能够有效减少内存占用和CPU负载。

依赖垃圾回收机制

如果不显式调用delete方法,Java的垃圾回收机制会在回收Java对象时自动调用delete来释放关联的C++对象。然而,垃圾回收的时机不确定,可能会导致C++对象长时间占用内存。因此,在高并发或资源敏感的场景下,建议避免完全依赖垃圾回收机制。

不推荐:依赖finalize方法释放资源

finalize是java.lang.Object类中的一个受保护方法,允许开发者在对象被垃圾回收前执行清理操作。尽管在Java SDK中实现了finalize方法来释放关联的C++对象,但垃圾回收器调用finalize的时机不可预测,可能会导致资源释放延迟。因此,不建议依赖finalize方法来管理C++对象的生命周期。

protected void finalize() {
    delete();
}

推荐:手动释放C++对象

为了确保资源释放的可控性,建议开发者手动调用delete方法。以下是开发过程中需要注意的事项:

  • 正确的释放顺序:在释放对象时,应遵循先释放子对象再释放父对象的原则。例如,在释放doc之前,应先释放page,因为page是在doc中创建的,存在依赖关系。
// 示例1:不推荐
PDFDoc doc = new PDFDoc(absolutePath);
doc.load(null);
PDFPage page = doc.getPage(0);
Annot annot = page.addAnnot(Annot.e_Link, rectF);
Link link = new Link(annot);
annot.delete();
link.delete();
doc.delete();
page.delete();

// 示例2:推荐
PDFDoc doc = new PDFDoc(absolutePath);
doc.load(null);
PDFPage page = doc.getPage(0);
Annot annot = page.addAnnot(Annot.e_Link, rectF);
Link link = new Link(annot);
link.delete();
annot.delete();
page.delete();
doc.delete();
  • 避免链式调用:链式调用可能导致对象引用计数增加,从而延迟对象的释放。建议在每次调用GetDocument后显式释放返回的对象。
// 示例3:不推荐
PDFDoc doc = new PDFDoc(absolutePath);
doc.load(null);
PDFPage page = doc.getPage(0);
...
int count = page.GetDocument().getPageCount();
...
page.delete();
doc.delete();

// 示例4:推荐
PDFDoc doc = new PDFDoc(absolutePath);
doc.load(null);
PDFPage page = doc.getPage(0);
...
PDFDoc temp_doc = page.GetDocument();
int count = temp_doc.getPageCount();
temp_doc.delete();
...
page.delete();
doc.delete();
  • Form.removeField后的资源释放:在调用form.removeField(field)后,仍需显式调用field.delete()来释放资源。
  • 特殊对象的处理:对于PDFObject、PDFStream、PDFArray和PDFDictionary等对象,如果它们被添加到PDFDoc中,则无需手动释放,它们的生命周期由PDFDoc管理。

通过遵循这些策略,开发者可以更有效地管理Java SDK在高并发场景下的内存和CPU资源,避免潜在的性能问题。

相关内容

RDK Android 如何设置单页上下滑动翻页?

PDF转Word时,如何仅处理指定页面?

PDF和OFD如何批量互转?

Bitmap 类如何与其他的图像类互转?

打印管理PrintManager怎么判断文档打印是否完成?

软件如何打开嵌入在office文档中Adobe PDF图标

福昕高级PDF编辑器专业版如何在文档中嵌入一个3D模型

福昕高级PDF编辑器专业版如何实现对图片和文档内容添加马赛克

福昕高级PDF编辑器如何显示注释内容图标

福昕高级PDF编辑器如何添加和调整快速访问工具栏功能

推荐内容

RDK Android 如何设置单页上下滑动翻页?

PDF转Word时,如何仅处理指定页面?

PDF和OFD如何批量互转?

Bitmap 类如何与其他的图像类互转?

打印管理PrintManager怎么判断文档打印是否完成?

软件如何打开嵌入在office文档中Adobe PDF图标

福昕高级PDF编辑器专业版如何在文档中嵌入一个3D模型

福昕高级PDF编辑器专业版如何实现对图片和文档内容添加马赛克

福昕高级PDF编辑器如何显示注释内容图标

福昕高级PDF编辑器如何添加和调整快速访问工具栏功能

产品
  • 应用行业
  • 白皮书
开发支持
  • 开发中心
  • SDK文档资料

销售咨询:010-50951668

客服电话:0591-38509808

销售咨询
微信公众号

©2026 福建福昕软件开发股份有限公司 版权所有

隐私策略