Java 虚拟机
JVM的启动参数
运行一个java程序,在命令行中输入命令:
jps: 显示当前运行在虚拟机上的进程,可以查看我们自己的程序的进程号:3272
然后输入下面命令:该命令会打印当前进程运行的 虚拟机的参数配置信息,这些参数是虚拟机启动时自己的默认参数
jinfo -flags 3272
查看一下这些参数代表的是什么意思:可以到下面的链接中去查找
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-XX:CICompilerCount=4:设置用于编译的编译器线程数。当然这个参数在服务端上跟客户端上可能会不一样,还有机器的配置也会影响到虚拟机的该默认参数的值,在我的设备上是4.
-XX:InitialHeapSize=31457280:设置内存分配池的初始大小(以字节为单位)。此值必须是 0 或 1024 的倍数且大于 1 MB。附加字母k
或K
以指示千字节,m
或M
指示兆字节,g
或G
指示千兆字节。默认值是在运行时根据系统配置选择的。我的电脑上显示的没有指定单位,说明它是以字节为单位的,占用了31457280个字节
-XX:MaxHeapSize=31457280:设置内存分配池的最大大小(以字节为单位)。此值必须是 1024 的倍数且大于 2 MB。附加字母和上面的-XX:InitialHeapSize代表的含义是一样的。默认值是在运行时根据系统配置选择的。它与-XX:InitialHeapSize这个值 一般设置成一样的。
-XX:MaxMetaspaceSize=31457280:设置可为类元数据分配的最大本机内存量。默认情况下,大小不受限制。应用程序的元数据量取决于应用程序本身、其他正在运行的应用程序以及系统上可用的内存量。
-XX:MaxNewSize=10485760:为年轻代 设置堆的最大大小(以字节为单位)
-XX:MaxTenuringThreshold=6:设置用于自适应 GC 大小调整的最大任期阈值。最大值为 15。并行(吞吐量)收集器的默认值为 15,CMS 收集器的默认值为 6。垃圾回收一次,没有被回收掉的对象,它的GC年龄会加1,这个阈值的意思就是经过6次回收,对象仍然存活,这时就要将对象从年轻代,移动到老年代了。
-XX:MinHeapDeltaBytes=196608:这个值竟然没有在上面的文档中找到
-XX:NewSize=10485760:为年轻代 设置堆的初始大小(以字节为单位),与上面的-XX:MaxNewSize设置年轻代的最大大小是相对应的。堆的年轻代区域用于新对象。GC 在该区域执行的频率高于其他区域。如果年轻代的大小太小,则会执行大量的minor GC。如果大小太大,则只会执行完整的 GC,这可能需要很长时间才能完成。Oracle 建议您将年轻代的大小保持在整个堆大小的一半到四分之一之间。
-XX:OldPLABSize=16:
-XX:OldSize=20971520:
-XX:-UseCompressedOops:禁用压缩指针的使用。默认情况下启用此选项,当 Java 堆大小小于 32 GB 时使用压缩指针。启用此选项后,对象引用表示为 32 位偏移量而不是 64 位指针,这通常会在运行 Java 堆大小小于 32 GB 的应用程序时提高性能。此选项仅适用于 64 位 JVM。当 Java 堆大小大于 32GB 时,也可以使用压缩指针。
为老年代启用 CMS 垃圾收集器。Oracle 建议您在吞吐量 ( -XX:+UseParallelGC
) 垃圾收集器无法满足应用程序延迟要求时使用 CMS 垃圾收集器。G1 垃圾收集器 ( -XX:+UseG1GC
) 是另一种选择。
-XX:+UseConcMarkSweepGC:默认情况下,此选项处于禁用状态,并根据机器的配置和 JVM 的类型自动选择收集器。当启用该选项时,-XX:+UseParNewGC
选项将自动设置,你不应该禁用它,因为下面的选项组合已经在JDK 8被弃用:-XX:+UseConcMarkSweepGC -XX:-UseParNewGC
。
-XX:+UseParNewGC:启用在年轻代中使用并行线程进行收集。默认情况下,此选项处于禁用状态。当您设置该-XX:+UseConcMarkSweepGC
选项时,它会自动启用, 它与上面的 个是配对使用的。
-XX:+UseFastUnorderedTimeStamps:
-XX:-UseLargePagesIndividualAllocation:
-Xms30m:设置堆的最小值和初始大小(以字节为单位)。此值必须是 1024 的倍数且大于 1 MB。附加字母k
或K
以指示千字节,m
或M
指示兆字节,g
或G
指示千兆字节。-Xms与上面的-XX:InitalHeapSize是等效的。
-Xmx30m:以字节为单位指定内存分配池的最大大小(以字节为单位)。此值必须是 1024 的倍数且大于 2 MB。附加字母k
或K
以指示千字节,m
或M
指示兆字节,g
或G
指示千兆字节。默认值是在运行时根据系统配置选择的。-Xmx与上面的-XX:MaxHeapSize参数配置是等效的。
上面的这些参数也可以在java程序启动时手动修改:
- 如果是在IDE中运行程序的话,可以在VM Options配置中修改我们想要设置的参数;
- 如果是用java命令执行的话,可以在java命令后面跟上这些参数,并以空格分开。