我正在使用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获得一个“合理”或“最佳”的堆大小。
非常感谢提前阅读这么长的信息和您的帮助。
1mb的-Xss值可以使用。当你启动你的应用程序时,包括下面的命令,这将有助于减少你的堆大小。
-XX:+UseConcMarkSweepGC
由于您的主机的最大值为16GB,因此您可以将最大堆大小设置为4Gb,如果需要,这仍然会为您提供一些在峰值期间扩展的空间。
您需要首先决定可以并行运行多少个线程,使用-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。有人能给我解释一下吗?
本文向大家介绍如何批量引入组件?相关面试题,主要包含被问及如何批量引入组件?时的应答技巧和注意事项,需要的朋友参考一下 vue中全局和局部引入批量组件方法 一、全局批量引入 创建一个.js文件,并在main.js中引入即可。 二、局部批量引入 三、动态组件使用方法 使用标签保存状态,即切换组件再次回来依然是原来的样子,页面不会刷新,若不需要可以去掉。 通过事件改变is绑定的isWhich值即可切换
有没有办法为Spring的NamedParameterJdbcTemplate对象设置批处理大小? 在我的项目中,我遇到了一些OutOfMemory问题,但我能够通过在一个较小的块循环中调用NamedParameterJdbcTemplate来解决它。但这需要一些额外的努力,比如确定块大小,将一个大列表拆分成更小的子列表等等。 我想知道NamedParameterJdbcTemplate是否有这样
问题内容: 有没有一种简单的方法来检查Golang项目的大小?它不是可执行文件,而是我要在自己的项目中导入的软件包。 问题答案: 您可以通过查看目录来查看库二进制文件的大小(如果未导出,则默认为)。 因此要检查一些http pkgs 的大小。首先安装它们: 我的64位MacOS()的KB二进制大小: 编辑: 库(包)的大小是一回事,但是在链接阶段之后,可执行文件中占用的空间可能有很大的不同。这是因