JVM的默认参数

如果在META-INF/MANIFEST.MF文件里面设置了Main-Class属性,那么你就可以很方便的通过java -classpath myapp.jar Main命令甚至更简洁的java -jar myapp.jar命令,来启动java虚拟机。这些命令会使用默认的设置来启动JVM。

要想看到JVM执行时使用在使用哪些参数以及其各参数默认值,可以使用这个命令:

java -XX:+PrintFlagsFinal -version

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

bool PrintHeapAtGC                             = false           {product rw}

bool PrintHeapAtGCExtended                     = false           {product rw}

...

uintx AdaptiveSizeDecrementScaleFactor          = 4               {product}

uintx AdaptiveSizeMajorGCDecayTimeScale         = 10              {product}

uintx AdaptiveSizePausePolicy                   = 0               {product}

...

bool UseCompressedOops                        := true            {lp64_product}

...

bool UseXmmRegToRegMoveAll                     = true            {ARCH product}

bool VMThreadHintNoPreempt                     = false           {product}

intx VMThreadPriority                          = -1              {product}

intx VMThreadStackSize                         = 1024            {pd product}

intx ValueMapInitialSize                       = 11              {C1 product}

intx ValueMapMaxLoopSize                       = 8               {C1 product}

intx ValueSearchLimit                          = 1000            {C2 product}

bool VerifyMergedCPBytecodes                   = true            {product}

...

如果这些参数还不够全,你可以打开几个开关:

java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version

大部分的参数都可以安全的看到默认值,但是某些参数需要在生产环境运行时来调整。

(后面花括号里面有product的表示可以在启动参数中设置的,花括号里面是“product rw”的表示你还可以在jvm启动后使用类似下面的命令来设置这些参数)

jinfo -flag -PrintHeapAtGC=true <pid>

基本的内存参数设置

对java应用而言,最基本的设置莫过于java堆大小的初始值和最大值设置了(一般认为生产环境初始值和最大值设置成一样的比较合适)。

  • -Xms<size> 设置java堆大小的初始值
  • -Xmx<size> 设置java堆大小的最大值

如果你使用的java7或者更早版本的jdk,你可能发现“OutOfMemoryError: PermGen space”,这时你需要使用-XX:MaxPermSize=<size>参数来增大Perm区大小。server虚拟机默认的Perm区大小是64M,但很多应用所需的Perm区空间不止64M。

如果JVM虚拟机耗尽了堆空间,且GC垃圾回收不了时,会抛出“java.lang.OutOfMemoryError:Java heap space”,要分析内存占用情况,可以添加参数-XX:+HeapDumpOnOutOfMemoryError参数,这个参数会在抛出java.lang.OutOfMemoryError异常时,dump堆空间的数据到当前工作目录下的一个文件中,-XX:HeapDumpPath=<path>可以指定这个dump文件的具体位置

垃圾回收(GC)

垃圾回收策略有很多,这里不细说,可以参考Java Garbage Collection Distilled

不管你正在使用那一个垃圾收集器,你都可以用日志的方式记录一段事件的垃圾回收的过程,来观察垃圾回收的效果。你可以添加参数-verbose:gc来把垃圾回收日志输出到标准输出(STDOUT),但更好的方式是通过参数-Xloggc:<pathtofile>把垃圾回收日志输出到指定的文件。

同时添加-XX:+PrintGCDateStamps参数可以记录下垃圾回收的时间戳,添加-XX:+PrintGCDetails可以记录下垃圾回收的事件细节。

默认情况下,垃圾回收日志文件不断变大,但JVM还内置支持回转日志文件(rotating the file),可搭配使用这三个参数:

  • -XX:+UseGCLogFileRotation 开启回转日志文件
  • -XX:GCLogFileSize=8K 设置单个文件最大的文件大小
  • -XX:NumberOfGCLogFiles=1 设置回转日志文件的个数

最后,你可能需要使用-XX:+DisableExplicitGC参数来显性的关闭手动GC功能(即调用jdk的建议GC的api:System.gc()),让System.gc()方法变成一个空方法,让垃圾回收托管给JVM的垃圾收集器。

实例

java -Xms10g -Xmx10g -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/var/log/myapp/gc.log -XX:+UseGCLogFileRotation -XX:GCLogFileSize=10M -XX:NumberOfGCLogFiles=20 -jar myapp.jar

这个例子使虚拟机分配10GB内存和256MB给perm区(java7)。内存溢出时dump堆空间的共鞥启动了,使用G1(garbage first)垃圾收集器,垃圾收集日志记录到/var/log/myapp/gc.log中,同时开启了日志文件回转功能。

Referece

原创文章:【译】JVM的默认参数,转载请注明:转载自戎码一生

时间: 2024-11-05 11:29:02

JVM的默认参数的相关文章

JVM日志和参数的理解

jvm日志和参数 一:理解GC日志格式,读GC日志的方法 1:开启日志 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/gc.log -XX:+UseGCLogFileRotation  启用GC日志文件的自动转储 (Since Java) -XX:NumberOfGClogFiles=1  GC日志文件的循环数目 (Since Java) -XX:GCLogFileSize=1M  控制GC日志文件的大小

转: jvm调优参数总结

JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:young generation,tenured generation和permanet generation.绝大部分的objec被分配在young gener

JVM调优参数

堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作系统对内存无限制.我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m.典型设置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-Xmx3550m:设置JVM最大可用内存为3550M.-Xms3550m:设

Resin调优(JVM,性能参数,apache集成)

一.resin性参监控 1.在resin.conf文件下加入以下几段: <servlet-mapping servlet-class='com.caucho.servlets.ResinStatusServlet'> <url-pattern>/resin-status</url-pattern> <init enable="read"/> </servlet-mapping> 当访问http://域名/resin-statu

1.java应用jvm原理及参数调优

什么是jvm? 虚拟机 ,字节码,平台无关 jvm是按照运行时数据的存储结构来划分内存结构的,jvm在运维java程序时,将它们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据.运行时数据包括java程序本身的数据信息和jvm运行java需要的额外数据信息. jvm堆配置参数 1  -Xms 初始堆大小 默认物理内存的1/641(<1g) 2  -Xms 最大堆大小 默认物理内存的1/4(<1GB),实际中建议不大于4G. 3 一般建议设置 -Xms= -Xmx 好处

移植u-boot-2015.10到JZ2440开发板(五)——设置nand分区,环境变量保存地址和其它默认参数

在下载内核或文件系统时,我们可以直接在命令中写明烧到nandflash的具体地址,但较麻烦,我们可以给nandflash分区,这样就可直接写烧到那个分区就行了,较为方便.如何设置呢?首先我们在uboot中输入mtdparts命令,看看默认的分区,结果提示mtdids not defined, no default present.搜索"mtdids not defined",定位到common/cmd_mtdparts.c的mtdparts_init函数中,分析发现是mtdids_de

/etc/fstab下的挂载类型defaults默认参数

[[email protected] data]# cat /etc/fstab UUID=da4d312a-dee1-4433-98c0-59dbbcf8b040 / ext4 defaults 1 1 UUID=e4ab7a0c-500f-4305-bcd2-a77be0ce5326 /boot ext4 defaults 1 2 UUID=ecac3aab-5a27-4cdb-9c52-6f5deb254d26 swap swap defaults 0 0 tmpfs /dev/shm t

Effective C++ .37 virtual函数中默认参数的表现

#include <iostream> #include <cstdlib> using namespace std; class Pen { public: virtual void write(int color = 0) { cout<<"write with color:"<<color<<endl; } }; class Pencil : public Pen{ public: void write(int colo

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直