常用的JVM参数
JVM 或Java虚拟机是物理机的软件实现,也可以说是抽象机。 Java的设计理念是 WORA(一次编写,随处运行),它在 VM 上运行。它是一个规范,它提供了一个经常执行Java字节码的运行时环境。编译器将Java文件编译为Java .class 文件,然后将该 .class 文件输入到 JVM 中,JVM 加载并执行该类文件。
JVM由三个基本子单元构成
- 类加载器子系统
- 运行时数据区
- 执行引擎
现在让我们讨论最常用的JVM参数,即3个如下:
- Java堆大小
- 垃圾收集器
- 打印 GC
参数 1: Java堆大小
以下三个 JVM 选项指定运行Java程序时的初始和最大堆大小以及线程堆栈大小:
-Xms - set initial Java heap size
-Xmx - set maximum Java heap size
-Xss - set java thread stack size
参数 2:垃圾收集器
垃圾收集算法用于获得更好的应用程序稳定性。垃圾收集跟踪 JVM 堆空间中可用的每个对象并删除未使用的对象。
Java为我们提供了 4 种实现垃圾回收的方法,分别是:
- -XX:+UseSerialGC
- -XX:+UseParallelGC
- -XX:+USeParNewGC
- -XX:+UseG1GC
例子:
Java
// Class
// To test garbage collection
public class GFG {
// Method 1 - finalize()
// finalize() method is invoked each time
// before the "Test example garbage collection"
public void finalize(){System.out.println("Test example garbage collection");}
// Method 2
// Main driver method
public static void main(String args[]){
// Creating anonymous objects of
// GFG class in amin() method
GFG object1 = new GFG();
GFG object2 = new GFG();
// Assigning objects NULL references
object1 = null;
object2 = null;
// CAlling(invoking) garbage collection
// using gc() method
System.gc();
}
}
Java
// Java Program to illustrate Print GC
public class Application {
private static Map stringContainer = new HashMap<>();
public static void main(String[] args) {
System.out.println("Start!");
String stringWithPrefix = "Prefix";
// Load Java Heap with 3 M java.lang.String instances
for (int i = 0; i < 3000000; i++) {
String newString = stringWithPrefix + i;
stringContainer.put(newString, newString);
}
System.out.println("MAP size: " + stringContainer.size());
// Explicit GC!
System.gc();
// Remove 2 M out of 3 M
for (int i = 0; i < 2000000; i++) {
String newString = stringWithPrefix + i;
stringContainer.remove(newString);
}
System.out.println("MAP size: " + stringContainer.size());
System.out.println("End");
}
}
输出:
Test example garbage collection
Test example garbage collection
参数 3:打印 GC
这些 JVM 选项启用垃圾收集日志记录,这对于延迟敏感的操作非常有效。
使用以下参数,我们可以记录 GC 活动:
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log
例子:
Java
// Java Program to illustrate Print GC
public class Application {
private static Map stringContainer = new HashMap<>();
public static void main(String[] args) {
System.out.println("Start!");
String stringWithPrefix = "Prefix";
// Load Java Heap with 3 M java.lang.String instances
for (int i = 0; i < 3000000; i++) {
String newString = stringWithPrefix + i;
stringContainer.put(newString, newString);
}
System.out.println("MAP size: " + stringContainer.size());
// Explicit GC!
System.gc();
// Remove 2 M out of 3 M
for (int i = 0; i < 2000000; i++) {
String newString = stringWithPrefix + i;
stringContainer.remove(newString);
}
System.out.println("MAP size: " + stringContainer.size());
System.out.println("End");
}
}