第 16 章 JVM

16.1. 关于 JVM

16.1.1. 关于 JVM 设置

对于受管域和独立服务器实例,Java 虚拟机(JVM)设置是不同的。在受管域里,JVM 设置是在 host.xmldomain.xml 配置文件里声明的,由负责启动和停止服务器进程的域控制器组件确定。而在独立服务器实例里,服务器的启动过程可以传入命令行参数。这可以通过命令行或管理控制台的 System Properties 屏幕里进行声明。
受管域

受管域的一个重要特征是可以定义多级别的 JVM 设置。您可以在主机、服务器组、服务器实例级别配置定义 JVM 设置。您可以用更专用的子元素覆盖父配置,这允许声明专有的服务器配置而无需在组或主机级别进行排除。这也允许其他级别继承父配置,直至在运行时传入或在配置文件里声明设置。

例 16.1. 域配置文件里的 JVM 设置

下面的例子展示了 domain.xml 配置文件里的服务器组的 JVM 声明。
<server-groups>
       <server-group name="main-server-group" profile="default">
           <jvm name="default">
               <heap size="64m" max-size="512m"/>
           </jvm>
           <socket-binding-group ref="standard-sockets"/>
       </server-group>
       <server-group name="other-server-group" profile="default">
           <jvm name="default">
               <heap size="64m" max-size="512m"/>
           </jvm>
           <socket-binding-group ref="standard-sockets"/>
       </server-group>
</server-groups>

在这个例子里,名为 main-server-group 的组声明了大小为 64MB 的堆,其最大堆大小为 512MB。属于这个组的任何服务器都将继承这些设置。你可以为整个组、为某个主机、或者单个服务器修改这些设置。

例 16.2. 主机配置文件里的域设置

下面的例子展示了 host.xml 配置文件里的服务器组的 JVM 声明。
<servers>
  <server name="server-one" group="main-server-group" auto-start="true">
    <jvm name="default"/>
  </server>
  <server name="server-two" group="main-server-group" auto-start="true">
    <jvm name="default">
      <heap size="64m" max-size="256m"/>
    </jvm>
    <socket-bindings port-offset="150"/>
  </server>
  <server name="server-three" group="other-server-group" auto-start="false">
    <socket-bindings port-offset="250"/>
  </server>
</servers>

在这个例子里,名为 server-two 的服务器属于 main-server-group 服务器组,它继承了 default JVM 组的设置。在前面的例子里,main-server-group 的主要堆大小是 512MB。通过声明更小的最大堆尺寸为 256MB,server-two 可以覆盖 domain.xml 设置来按需要调整性能。
运行时的独立服务器设置

独立服务器实例的 JVM 设置可以在启动服务器前通过设置 JAVA_OPTS 环境变量来声明。下面是在 Linux 命令行里设置 JAVA_OPTS 环境变量的例子:

[user@host bin]$ export JAVA_OPTS="-Xmx1024M"
相同的设置可以用于 Microsoft Windows 环境,如:
C:\> set JAVA_OPTS="Xmx1024M"
或者,可以将 JVM 设置添加到 EAP_HOME/bin 目录下的 standalone.conf 文件里,它包含了传入 JVM 的选项示例。

警告

设置 JAVA_OPTS 环境变量将重新定义 JAVA_OPTS 的默认值。这可以打断或终止 EAP 的启动。

16.1.2. 在管理控制台里显示 JVM 状态

独立服务器或受管域的 Java 虚拟机(Java Virtual Machine,JVM)状态都可以在管理控制台里显示。控制台显示了服务器的堆、线程的使用情况。虽然统计数据并非实时显示的,但您可以刷新控制台来显示 JVM 资源的最新状况。
JVM 状态包含下列数值。

表 16.1. JVM 状态属性

类型 描述
Max 可以用于内存管理的最大内存数量。最大可用的内存数用浅灰色条显示。
Used 已使用的内存数量,以深灰色的条显示。
Committed JVM 可使用的内存数量,以深灰色条显示。
Init JVM 从操作系统请求的用于内存管理的初始内存数量,以深灰色条显示。

过程 16.1. 在管理控制台里显示 JVM 状态

    • 显示独立服务器实例的 JVM 状态

      从屏幕顶部选择 Runtime 标签页。展开 Status 菜单,然后展开 Platform 菜单。选择 JVM
    • 显示受管域的 JVM 状态

      从屏幕顶部选择 Runtime 标签页。展开 Server Status 菜单,然后展开 Platform 菜单。选择 JVM
  1. 受管域可以提供服务器组里的所有服务器实例的可视性,但它只允许您在服务器菜单里一次查看一个服务器。要查看服务器组里其他服务器的状态,请点击屏幕左边的 Change Server 以选择组里显示的主机和服务器。选择所需的服务器或主机,JVM 细节将相应改变。点击 Close 完成。
结果

显示服务器实例的 JVM 设置的状态。

16.1.3. 配置 JVM

<jvm></jvm> 标签支持 <jvm-options></jvm-options>,它通过 <option value=""/> 标签来添加 JVM 配置参数。
例如

<jvm name="default"> <heap size="1303m" max-size="1303m"/> <permgen max-size="256m"/> <jvm-options> <option value="-XX:+UseCompressedOops"/> </jvm-options> </jvm>

用 CLI 配置 JVM

要用 CLI 配置 JVM,请使用以下语法:

# cd /server-group=main-server-group/jvm=default

		# :add-jvm-option(jvm-option="-XX:+UseCompressedOops")
			{
				"outcome" => "success",
				"result" => undefined,
				"server-groups" => undefined
			}

		# :read-resource

		# Expected Result:

			[domain@localhost:9999 jvm=default] :read-resource                                      
			{
				"outcome" => "success",
				"result" => {
					"agent-lib" => undefined,
					"agent-path" => undefined,
					"env-classpath-ignored" => undefined,
					"environment-variables" => undefined,
					"heap-size" => "1303m",
					"java-agent" => undefined,
					"java-home" => undefined,
					"jvm-options" => ["-XX:+UseCompressedOops"],
					"max-heap-size" => "1303m",
					"max-permgen-size" => "256m",
					"permgen-size" => undefined,
					"stack-size" => undefined,
					"type" => undefined
				}
			}

删除 jvm-options 条目

要删除 jvm-options 条目,请使用下列语法:

	# cd /server-group=main-server-group/jvm=default

	# :remove-jvm-option(jvm-option="-XX:+UseCompressedOops")

	# Expected Result:

		[domain@localhost:9999 jvm=default] :remove-jvm-option(jvm-option="-XX:+UseCompressedOops")
		{
			"outcome" => "success",
			"result" => undefined,
			"server-groups" => undefined
		}