当前位置: 首页 > 知识库问答 >
问题:

如何确定批量引入项目的堆大小的 Xmx

寿元白
2023-03-14

我正在使用REST APIs和Spring Boot为Alfresco做一个大约500万个文档(每个大小在200KB-3MB之间)的批量摄取项目。我的fat jar将在开发和测试环境中这样运行,没有任何问题:

 java -Xms64m -Xmx1G -jar MyApplication.jar --spring.config.location=file:///Users/home/config/jdbc.properties

对于生产环境,服务器有16GB可用内存。给定每个文档的大小(200KB - 3MB)和它们的大小-500万,我如何决定最小和最大堆大小?我的意思是,“合理的”最小最大堆大小应该是多少?

java -Xms?? -Xmx?? -jar MyApplication.jar --spring.config.location=file:///Users/home/config/jdbc.properties

模糊的问题:如果我使用-Xms64m-Xmx1G,这是否意味着在峰值时间(当jvm完全启动时),我的jvm在任何给定时间都不会处理批量大小超过1GB的文档?或者简单地说,在这种情况下,1GB将在何处燃烧?或者JVM将如何利用这个1GB?

这方面的任何相关信息/链接将不胜感激。

更新:

按照毗湿奴的评论,我找到了这些(还在努力理解):https://alvinalexander . com/blog/post/Java/Java-xmx-xms-memory-heap-size-control/https://www.baeldung.com/jvm-configure-stack-sizes https://alvinalexander . com/Java/Java-stack-heap-definitions-memory/

然后我试了几个ss参数,如下所示:

java -Xss1k -jar MyApplication.jar

结果:

The Java thread stack size specified is too small. Specify at least 136k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

当我尝试这个:

java -Xss136k -jar MyApplication.jar

我明白了。

Exception in thread "main" java.lang.StackOverflowError
    at org.springframework.boot.loader.data.RandomAccessDataFile$FileAccess.access$400(RandomAccessDataFile.java:205)
    at org.springframework.boot.loader.data.RandomAccessDataFile.read(RandomAccessDataFile.java:117)
    at org.springframework.boot.loader.data.RandomAccessDataFile.read(RandomAccessDataFile.java:102)
    at org.springframework.boot.loader.jar.CentralDirectoryFileHeader.load(CentralDirectoryFileHeader.java:82)
    at org.springframework.boot.loader.jar.CentralDirectoryFileHeader.fromRandomAccessData(CentralDirectoryFileHeader.java:183)
    at org.springframework.boot.loader.jar.JarFileEntries.getEntry(JarFileEntries.java:321)
    at org.springframework.boot.loader.jar.JarFileEntries.getEntry(JarFileEntries.java:307)
    at org.springframework.boot.loader.jar.JarFileEntries.doGetEntry(JarFileEntries.java:295)
    at org.springframework.boot.loader.jar.JarFileEntries.getEntry(JarFileEntries.java:250)
    at org.springframework.boot.loader.jar.JarFileEntries.containsEntry(JarFileEntries.java:206)
    at org.springframework.boot.loader.jar.JarFile.containsEntry(JarFile.java:240)
    at org.springframework.boot.loader.jar.JarURLConnection.get(JarURLConnection.java:263)
    at org.springframework.boot.loader.jar.Handler.openConnection(Handler.java:83)
    at java.base/java.net.URL.openConnection(URL.java:1074)
    at java.base/jdk.internal.loader.URLClassPath$Loader.getResource(URLClassPath.java:643)
    at java.base/jdk.internal.loader.URLClassPath.getResource(URLClassPath.java:314)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:455)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
    at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166)
    at java.base/java.lang.Class.getDeclaredMethod(Class.java:2473)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:47)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:107)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)

它导致上述SOF误差从136-240k,但工作

我知道毗湿奴的评论,这个错误试图表明我脑海中正在发生的事情。什么?我能在这里得到一个简单的(更简单或最简单的会更好:P)答案吗?

我再次尝试为我的应用程序的jar获得一个“合理”或“最佳”的堆大小。

非常感谢提前阅读这么长的信息和您的帮助。

共有2个答案

丌官嘉福
2023-03-14

1mb的-Xss值可以使用。当你启动你的应用程序时,包括下面的命令,这将有助于减少你的堆大小。

-XX:+UseConcMarkSweepGC

由于您的主机的最大值为16GB,因此您可以将最大堆大小设置为4Gb,如果需要,这仍然会为您提供一些在峰值期间扩展的空间。

贺博厚
2023-03-14

您需要首先决定可以并行运行多少个线程,使用-Xss param分配线程堆栈内存。我想在64位的1.8版本中,每个线程的默认内存是1Mb。

尝试在Java选项中使用并发GC,这将有助于减少堆。

 类似资料:
  • 问题内容: 如果我从Java命令行中省略了该选项,那么将使用默认值。根据Java文档 “根据系统配置在运行时选择默认值” 哪些系统配置设置会影响默认值? 问题答案: 在Windows上,你可以使用以下命令查找运行应用程序的系统上的默认设置。 堆大小 寻找的选项(对),并为。 在系统上,你可以 我相信结果输出以字节为单位。

  • 问题内容: 如何确定Linux中程序的当前堆栈大小? 据说每个程序的堆栈大小在Linux中将是8 MB,但是当您使用cat / proc // mmap时,它将显示不同的大小。 另外,如何确定相关线程的堆栈大小?既然说线程有自己的私有堆栈? 问题答案: 如果仅需要当前的堆栈大小,则可以在main()的顶部声明一个变量,获取其地址,然后将其与在定义“当前”的位置声明的变量的地址进行比较。差异应为堆栈

  • 最小堆由 2047 个元素组成,确定最大元素数所需的最大比较数为 _。 对于这个,我使用了方法,因为这是一个最小堆,最小元素将在根节点中。所以要找到最大值,我们必须一直到树的末尾,直到叶节点级别,并且必须与所有值进行比较。所以比较将是n-1,但ans不是2046,而是1043。有人能给我解释一下吗?

  • 有没有办法为Spring的NamedParameterJdbcTemplate对象设置批处理大小? 在我的项目中,我遇到了一些OutOfMemory问题,但我能够通过在一个较小的块循环中调用NamedParameterJdbcTemplate来解决它。但这需要一些额外的努力,比如确定块大小,将一个大列表拆分成更小的子列表等等。 我想知道NamedParameterJdbcTemplate是否有这样

  • 本文向大家介绍如何批量引入组件?相关面试题,主要包含被问及如何批量引入组件?时的应答技巧和注意事项,需要的朋友参考一下 vue中全局和局部引入批量组件方法 一、全局批量引入 创建一个.js文件,并在main.js中引入即可。 二、局部批量引入 三、动态组件使用方法 使用标签保存状态,即切换组件再次回来依然是原来的样子,页面不会刷新,若不需要可以去掉。 通过事件改变is绑定的isWhich值即可切换

  • 问题内容: 有没有一种简单的方法来检查Golang项目的大小?它不是可执行文件,而是我要在自己的项目中导入的软件包。 问题答案: 您可以通过查看目录来查看库二进制文件的大小(如果未导出,则默认为)。 因此要检查一些http pkgs 的大小。首先安装它们: 我的64位MacOS()的KB二进制大小: 编辑: 库(包)的大小是一回事,但是在链接阶段之后,可执行文件中占用的空间可能有很大的不同。这是因