减少内存流失的方法

2023-11-24

背景

我有一个 Spring 批处理程序,它读取一个文件(我正在使用的示例文件大小约为 4 GB),对文件进行少量处理,然后将其写到 Oracle 数据库中。

我的程序使用 1 个线程来读取文件,并使用 12 个工作线程来进行处理和数据库推送。

我正在搅动大量的年轻一代内存,这导致我的程序比我想象的要慢。

Setup

JDK 1.6.18
春季批次 2.1.x
4 核机器,配备 16 GB 内存

-Xmx12G 
-Xms12G 
-NewRatio=1 
-XX:+UseParallelGC
-XX:+UseParallelOldGC

Problem

通过这些 JVM 参数,我为 Tenured Generation 获得了大约 5.x GB 的内存,为 Young Generation 获得了大约 5.x GB 的内存。

在处理这一文件的过程中,我的终身一代一切都很好。它最多可能增长到 3 GB,而且我永远不需要执行一次完整 GC。

然而,年轻一代多次达到了极限。它达到 5 GB 范围,然后发生并行次要 GC,并将 Young Gen 的使用量降至 500MB。小 GC 很好,而且比完整 GC 更好,但它仍然会大大减慢我的程序速度(我很确定当发生年轻代收集时应用程序仍然会冻结,因为我看到数据库活动消失了)。我花费了超过 5% 的程序时间来冻结小型 GC,这似乎过多了。我会说在处理这个 4 GB 文件的过程中,我使用了 50-60GB 的年轻一代内存.

我没有发现我的程序有任何明显的缺陷。我试图遵守一般的面向对象原则并编写干净的 Java 代码。我试图不无缘无故地创建对象。我正在使用线程池,并尽可能传递对象而不是创建新对象。我将开始分析应用程序,但是我想知道是否有人有一些好的一般经验规则或反模式来避免导致过度的记忆搅动?我能用 50-60GB 内存来处理 4GB 文件吗?我是否必须恢复到 JDK 1.2 技巧,例如对象池? (尽管 Brian Goetz 做了一个演讲,其中包括为什么对象池是愚蠢的,而且我们不需要再这样做了。我对他的信任比我对自己的信任要多..:))


我有一种感觉,你正在花费时间和精力来尝试优化一些你不应该费心的事情。

我花费了超过 5% 的程序时间来冻结小型 GC,这似乎过多了。

把它翻转过来。您花费了不到 95% 的计划时间来做有用的工作。或者换句话说,即使您设法优化 GC 以在零时间内运行,您最多可以获得超过 5% 的改进。

如果您的应用程序有受暂停时间影响的严格计时要求,您可以考虑使用低暂停收集器。 (请注意,减少暂停时间增加总体 GC 开销...)但是对于批处理作业,GC 暂停时间应该不相关。

最重要的可能是整个批处理作业的挂钟时间。并且(大约)95% 的时间花在特定于应用程序的事情上,您可能会为您的分析/有针对性的优化工作获得更多回报。例如,您是否考虑过批量发送到数据库的更新?


所以..我的总内存的 90% 位于“oracle.sql.converter.toOracleStringWithReplacement”中的 char[] 中

这往往表明您的大部分内存使用发生在 Oracle JDBC 驱动程序中,同时准备将内容发送到数据库。你对此的了解很少。我将其视为不可避免的开销。

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

减少内存流失的方法 的相关文章

  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch

随机推荐

  • 使用 gopkg.in/mgo.v2 检查 mongo 中对象是否存在

    我正在寻找方便的方法来检查对象是否已存在于集合中 目前我找到的唯一方法是 type result interface var res result err col Find bson M title title1 One res if er
  • 如何检查Python3是否是使用“--enable-shared”构建的?

    环境 Mac OS X 10 8 5 阿帕奇2 2 26 自制Python 3 3 3 Problem 我正在尝试安装 mod wsgi 但首先需要确定是否使用 enable shared 选项配置和编译了 Python 问题 如何确定 H
  • IIS Express Config 中的allowdoubleescaping =“true”不起作用

    我得到 HTTP错误 404 11 未找到 请求过滤模块被配置为拒绝包含双转义序列的请求 当我向 Blazor 中的 razor 页面发送请求时出错 该链接是动态构建的并发送到用户电子邮件 string confirmationLink H
  • 在变量声明中反应花括号[重复]

    这个问题在这里已经有答案了 我最近按照反应教程创建了一个模板项目 此后一直在修改代码以满足我的需求 特别是 组件上有这段代码传递了一个名为label render const label this props 在此示例中 我从控制器返回一个
  • Android Studio、Gradle、OpenCV 和 NDK

    我正在尝试在 Android Studio 上测试 OpenCV Android 我对如何包含 NDK 感到困惑 我想做的是运行 OpenCV 附带的示例 在提供的 6 个示例中 我成功运行了 4 个 例外情况是面部检测和本机活动 我怀疑原
  • 有哪些工具可用于简单地一次性共享 git 存储库?

    我似乎经常遇到这样的情况 我想快速向某人提供从例如克隆 git 存储库的方法 我的笔记本电脑 我想在不运行 SSH 守护进程 git 守护进程或任何其他类型的需要配置 甚至访问控制 的服务的情况下执行此任务 到目前为止我想出的最简单的方法是
  • Node.js + AngularJS + socket.io:连接状态和手动断开连接

    我在客户端上使用nodejs和socket io和angularjs 我从互联网上找到了 Angular socketio 示例并添加了disconnect方法到它 套接字服务 angular module app factory sock
  • iOS firebase:FIRAuthUIDelegate.authUI 未被调用

    我正在尝试从 AppDelegate swift 启动谷歌登录 然后在登录成功后启动我的应用程序的主屏幕 我能够 显示 google 登录按钮 如上所示 用户被发送到 google 进行登录 用户被送回原来的位置 步骤 1 第 3 步之后
  • Haskell 中的所有类型类都有类别理论类似物吗?

    考虑一个类型类 其成员属于类型 gt 例如 Functor类型类 众所周知的事实是 在 Haskell 中 该类型类与其数学 即类别理论 类似物之间存在对应关系 概括 问题一 Haskell 中每个类型类的成员都是同类的吗 gt 相当于so
  • 如何使用Python 3.7提取视频文件的元数据? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个与Python 3 7兼容的简单库 它可以提取视频文件的元数据 特别是捕获 记录日期时间 视频拍摄的日期和时间 我主要希望对 mov
  • 在 rmarkdown/knitr 中注释以防止 R 评估

    The 推荐用于发表评论 Rmd使用 HTML 注释的文档是不够的 我想注释掉我的文档中包含内联评估的部分 I haven t defined x yet 编织失败 100 inline R code fragments processin
  • 如何将包含逗号的字符串字符串化?

    我想在编译命令中传递版本字符串 g Wall D VERSION 2013 12 03 02 15 21 commit cb060df o main main cpp 在我的代码中 我有以下内容 define TOSTR x x defin
  • 无法编辑 DataGrid WPF Framework 4.5 的单元格

    我的 ObservableCollection 有三个项目 并且行在数据网格中一致显示 我无法将 DataGrid 的单个单元格转变为编辑模式 我尝试单击 单击 双击 F2 但整行仍保持选中状态 我怎样才能让用户编辑数据网格 我在其他帖子中
  • 在依赖属性更改回调中获取“this”指针

    我在类中有以下依赖属性 class FooHolder public static DependencyProperty CurrentFooProperty DependencyProperty Register CurrentFoo t
  • appengine cloudbuild.yaml 是否需要自定义运行时?

    使用以下输出构建错误 使用 Rails 应用程序 ERROR gcloud app deploy There is a cloudbuild yaml in the current directory and the runtime fie
  • 如何检查使用新语言功能的程序中的 Python 版本?

    如果我有一个 Python 脚本 至少需要一个特定的 Python 版本 优雅失败的正确方法是什么 何时使用早期版本的 Python 来启动脚本 如何尽早获得控制权以发出错误消息 然后退出 例如 我有一个使用 ternery 运算符 2 5
  • 如何计算可用磁盘空间?

    我正在开发一个安装程序项目 需要将文件提取到磁盘 如何使用 C 计算 查找硬盘上的可用磁盘空间 http msdn microsoft com en us library system io driveinfo totalfreespace
  • 如何在webview中搜索文本

    我在 android 工作 我是这个领域的新手 我开发了一个 webview 我需要在 webview 中搜索特定文本 我搜索了一些问题 例如 thi但我没有得到正确的答案 我做了这么多代码 但执行时显示了网络视图 但我在代码中给出的按钮丢
  • Android-Facebook 应用程序的密钥哈希

    我正在开发一个 Android 应用程序 我想在其中集成 Facebook 发帖功能 我下载了Facebook Android SDK 我得到了 那里的 readme md 文本文件 其中提到生成 Android 的密钥哈希 我如何生成它
  • 减少内存流失的方法

    背景 我有一个 Spring 批处理程序 它读取一个文件 我正在使用的示例文件大小约为 4 GB 对文件进行少量处理 然后将其写到 Oracle 数据库中 我的程序使用 1 个线程来读取文件 并使用 12 个工作线程来进行处理和数据库推送