在阅读一些关于性能调优的说明时,我确实注意到了设置内存大小时的一个建议:
Java应用程序应该将初始和最大永久生成大小调整为相同的值,因为增长或收缩永久生成空间需要完整的GC。在设置堆大小时给出了类似的建议,即-Xmx=-Xms。
我的问题是,那么为什么我们有-Xms设置呢?
此外,如果-Xmx和-Xms的值不同,而-Xmx和-Xms的大小相同,为什么GC会经常被触发。
为了补充我的第二个问题,如果我从64M和最大512 M的最小堆大小开始,我相信除非我的应用程序使用的内存达到512M,否则不会触发完整的GC。
类似地,如果我从-Xmx和-Xms的512M开始,当我的应用程序内存使用达到这个限制时,JVM仍然会触发完全GC。那么,为什么建议将最大值和最小值设置为相同的值?
拥有Xms的一个原因
-Xms=64m-Xmx=512m并不意味着“启动时堆的大小在64到512 MB之间”。它指示JVM在启动时请求64MB的提交内存和512MB的保留内存。堆开始时为64MB,当堆满时,将扩展到为其保留的空间。因此,对于64MB的Xms,在堆填充到64MB之前,您将看到完整的集合。
如果您以较低的Xms值启动应用程序,并打开GC日志记录(
-verbose:GC-Xloggc:FILENAME),日志文件将显示堆和生成大小在应用程序运行时的变化。
较小的集合可能更频繁地使用较低的Xms,因为新的一代将更小(假设您使用的是比例生成大小而不是显式),因此填充速度更快。
设置标志是在VM进行分代增量收集之前设计的。在这种情况下,所有的收藏都是完整的。在更现代的收藏家中,完整的收藏品是罕见的。这很好,因为增量收集通常需要几毫秒,因此用户界面体验不会改变。完成大型竞技场的收集可能需要几秒钟或更长时间。正如文件所说,改变竞技场的大小可以保证每次都能吸引到全套观众。
指导并非百分之百完美。允许竞技场发展是合理的应用程序很少。
问题内容: 大家好,我观察到在设置堆大小时人们倾向于使用值64,128,256,1024。如果我在这些数字之间输入一个值(例如500),jvm是否会接受该值?为什么这些数字很重要且更受欢迎?为什么我们也以这种模式升级RAM。 请帮助我理解。 在此先感谢哈宾 问题答案: JVM将接受任何值,这没有问题。使用2 ^ n值只是一个“惯例”,在实践中使用其他值不会有负面影响。
问题内容: 有没有一种方法可以通过编程而不是作为vm参数来设置最大Java堆大小? 就像是: 问题答案: 不适用于任何Hotspot JVM。只能在命令行上指定JVM堆参数,然后在JVM的生存期内对其进行固定。 使用Hotspot Java实现,“更改”应用程序堆大小的唯一方法是使用不同的命令行参数在新的JVM中重新启动它。 (我隐约记得,其他一些供应商的JVM 确实 允许在运行的JVM中更改某些
问题内容: 我正在运行具有以下属性的服务器: Windows Server 2008 R2 Standard-64位4GB RAM 我正在尝试将应用程序的堆大小设置为3gb。我正在使用-Xmx3G -Xms3G标志。使用标志运行会导致以下错误: VM初始化期间发生错误。无法为对象堆保留足够的空间。无法创建Java虚拟机。 我一直在玩设置,看我的天花板是多少,发现1568是我的天花板。我想念什么?
问题内容: 为了确定Java堆大小,我使用了以下命令: 但是,我无法理解ErgoHeapSizeLimit,HeapSizePerGCThread,InitialHeapSize,LargePageHeapSizeThreshold,MaxHeapSize等的含义。有人可以简要解释一下这些术语。其实我是Java的新手 其实我需要确定我的机器可以分配给进程的堆大小吗?因为我的应用程序之一需要以下参数
本文向大家介绍Java Max Heap(堆),包括了Java Max Heap(堆)的使用技巧和注意事项,需要的朋友参考一下 最大堆是一个完整的二叉树,其中,每个步骤中根节点的值都大于或等于子节点中的值。 以下是使用库函数实现的Max Heap。 示例 输出结果 名为Demo的类,在主函数中,定义了优先级队列的实例,并使用“add”函数将元素添加到其中。定义了一个迭代器 用于迭代优先级队列中的元
我面临一些关于内存问题的问题,但我无法解决它。非常感谢您的帮助。我不熟悉Spark和pyspark功能,试图读取大约5GB大小的大型JSON文件,并使用 每次运行上述语句时,都会出现以下错误: 我需要以RDD的形式获取JSON数据,然后使用SQLSpark进行操作和分析。但是我在第一步(读取JSON)本身就出错了。我知道要读取如此大的文件,需要对Spark会话的配置进行必要的更改。我遵循了Apac