启动JAVA程序时,参数-Xms及Xmx有啥用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启动JAVA程序时,参数-Xms及Xmx有啥用相关的知识,希望对你有一定的参考价值。

个人之见,欢迎指正:
Xmx是java的一个选项,用来设置你的应用程序能够使用的最大内存数(看好,致使你的应用程序,不是整个jvm),如果你的程序要花很大内存的话,那就需要修改缺省的设置,比如配置tomcat的时候,如果流量啊程序啊都很大的话就需要加大这个值了,不过有一点是要记住的,不要大得超过你的机器的内存,那样你的机器会受不了的,到时候就死翘翘了。
Xms是另一个设置内存的参数,用它来设置程序初始化的时候内存栈的大小,增加这个值的话你的程序的启动性能会得到提高。不过同样有前面的限制,以及受到xmx的限制。
另外,一个操作系统通常都只使用jvm,这就是你说的“运行在同一个JVM中的程序”,不同的虚拟机的实现虽然千差万别,但是他们的运行模式都是一样的,只是性能有所不同罢了。
参考技术A

-Xms是用来设置你的应用程序能够使用的最大内存数,如果程序要花很大内存的话,那就需要修改增加此数的值。

Xms是用它来设置程序初始化的时候内存栈的大小,增加这个值的话你的程序的启动性能会得到提高。

所以根据程序的大小,还有电脑的实际配置,来进行这两个的参数配置即可,参数的单位都是m(兆)。

Java简介

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

主要组成

Java由四方面组成:

●Java编程语言,即语法。

●Java文件格式,即各种文件夹、文件的后缀。

●Java虚拟机(JVM),即处理*.class文件的解释器。

●Java应用程序接口(Java API)。

体系

Java分为三个体系,分别为:

Java SE(J2SE,Java2 Platform Standard Edition,标准版),

JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企业版),

Java ME(J2ME,Java 2 Platform Micro Edition,微型版)。

参考技术B Xmx是用来设置你的应用程序能够使用的最大内存数,如果程序要花很大内存的话,那就需要修改增加此数的值。
Xms是用它来设置程序初始化的时候内存栈的大小,增加这个值的话你的程序的启动性能会得到提高。
所以根据程序的大小,还有电脑的实际配置,来进行这两个的参数配置即可,参数的单位都是m(兆)。
参考技术C Xmx不能超过物理内存的大小的,另外如果你的机器是32位的那jvm最多也只能用2G
参考技术D Xss设定栈容量。
Xms设定最小堆内存,Xmx设定最大堆内存。

启动JVM时-Xms和-Xmx参数是啥?

【中文标题】启动JVM时-Xms和-Xmx参数是啥?【英文标题】:What are the -Xms and -Xmx parameters when starting JVM?启动JVM时-Xms和-Xmx参数是什么? 【发布时间】:2013-01-23 15:48:31 【问题描述】:

请解释XmsXmx 参数在JVM 中的使用。它们的默认值是什么?

【问题讨论】:

当使用-Xmx128m -Xms64m 时,它可以在275m RES 内存附近达到峰值,但是当使用-Xmx128m -Xms128m 时,它可以在550m RES 内存附近达到峰值使用Java 8 最好的办法是强调GC 并查看在发生什么... 只是好奇,275m 和 550m - 它们是如何计算的? 【参考方案1】:

标志Xmx 指定Java 虚拟机(JVM) 的最大内存分配池,而Xms 指定初始内存分配池。

这意味着您的 JVM 将以 Xms 的内存量启动,并且将能够使用最多 Xmx 的内存量。例如,像下面这样启动 JVM 将使用 256 MB 内存启动它,并允许进程使用多达 2048 MB 的内存:

java -Xms256m -Xmx2048m

内存标志也可以指定为不同的大小,如千字节、兆字节等。

-Xmx1024k
-Xmx512m
-Xmx8g

Xms 标志没有默认值,Xmx 通常有 256 MB 的默认值。这些标志的常见用途是当您遇到java.lang.OutOfMemoryError

使用这些设置时,请记住这些设置是针对 JVM 的 的,并且 JVM 可以并且将使用比仅分配给堆的大小更多的内存。来自Oracle's documentation:

请注意,JVM 使用的内存不仅仅是堆。例如,Java 方法、线程堆栈和本机句柄被分配在与堆分开的内存中,以及 JVM 内部数据结构中。

【讨论】:

当内存使用量超过 Xmx 时,我们得到 jvm 内存不足异常。 是的,没错。当它试图超过该值时,尽管它可能收集垃圾以尝试释放足够的内存。如果仍然没有足够的内存来满足请求并且堆已经达到最大大小,则会出现OutOfMemoryError 当我使用 ForkJoin 框架时,我的计算机崩溃了,因为它占用了太多内存。有没有可能在 OpenJDK 上默认没有对内存的硬限制? 正如Does java -Xmx 1G mean 1 GB or 2^30 B? 所阐明的那样,通过-Xms256m 表示您开始使用多少内存的明确方式是“256 MiB”,而不是“256 MB”,因为它是通过二进制幂而不是十次方。见en.wikipedia.org/wiki/Binary_prefix。另外,由于为额外的Survivor空间池预留了一些不可用的空间,所以根据Runtime.getRuntime().maxMemory()实际可用的内存量小于通过-Xmx指定的值 与堆大小相关的常见错误的有用指南:blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size【参考方案2】:

运行命令java -X,您将获得所有-X 选项的列表:

C:\Users\Admin>java -X
-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
-Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
-Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
-Xdiag            show additional diagnostic messages
-Xnoclassgc       disable class garbage collection
-Xincgc           enable incremental garbage collection
-Xloggc:<file>    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms<size>        set initial Java heap size.........................
-Xmx<size>        set maximum Java heap size.........................
-Xss<size>        set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni       perform additional checks for JNI functions
-Xshare:off       do not attempt to use shared class data
-Xshare:auto      use shared class data if possible (default)
-Xshare:on        require using shared class data, otherwise fail.
-XshowSettings    show all settings and continue
-XshowSettings:all         show all settings and continue
-XshowSettings:vm          show all vm related settings and continue
-XshowSettings:properties  show all property settings and continue
-XshowSettings:locale      show all locale related settings and continue

-X 选项是非标准的,如有更改,恕不另行通知。

我希望这将帮助您了解XmsXmx 以及许多其他最重要的事情。 :)

【讨论】:

【参考方案3】:

您可以在 IDE 中指定它。例如,对于 Run ConfigurationsVM arguments 中的 Eclipse。可以输入-Xmx800m -Xms500m

【讨论】:

在 OSX 上的 RubyMine 中,它位于帮助菜单 > 编辑自定义 VM 选项中。 这不能回答问题。问题在于它们的用途,而不是如何设置它们。 @Hearen 如何在 intellij 中设置??【参考方案4】:

上面已经解决了问题本身。 只需添加部分默认值即可。

根据http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

Xmx 的默认值取决于平台和系统中可用的内存量。

【讨论】:

对于其他 JVM(除了 JRockit),请参阅这篇文章以确定您的 JVM 的默认 Xmx/Xms 值:***.com/questions/4667483/…【参考方案5】:

-Xms 启动时的初始堆大小,但是在工作过程中,由于用户不活动或 GC 迭代,堆大小可能小于 -Xms。 这不是所需的最小堆大小。

-Xmx 最大堆大小

【讨论】:

您能否提供更多关于“由于用户不活动或 GC 迭代”的详细信息?那么初始堆大小和最小堆大小有什么区别?

以上是关于启动JAVA程序时,参数-Xms及Xmx有啥用的主要内容,如果未能解决你的问题,请参考以下文章

启动JAVA程序时,参数-Xms及Xmx有啥用

启动JVM时-Xms和-Xmx参数是啥?

JVM之对分配参数详解

Azure 应用服务App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?

JVM 参数配置及详解 -Xms -Xmx -Xmn -Xss 调优总结

JVM 参数配置及详解 -Xms -Xmx -Xmn -Xss 调优总结