java - JVM 参数 -Xms 和 -Xss

标签 java jvm

我有几个 jvm 参数,但理解它们有些困难。

  1. 第一个问题是关于参数 -Xms20m 和 -Xss2M(第一个用于堆大小,第二个用于线程堆栈大小),m 和 M 是否具有相同的含义并且都表示 MB?
  2. 第二个问题是,我有以下代码片段,我希望很快就会出现运行时错误,因为堆栈大小设置为 512M,但代码会导致我的操作系统卡住并且永远不会给我运行时错误,任何人都知道这是为什么?

谢谢

/**
 *VM Args:-Xss512M
 */
public class JavaVMStackOOM{
    private void noStop(){
        while(true){
        }
    }
    public void stackLeakByThread(){
        while(true){
            Thread thread=new Thread(new Runnable() {
                @Override
                public void run() {
                    noStop();
                }
            });
            thread.start();
        }
    }
    public static void main(String[]args)throws Throwable{
        JavaVMStackOOM oom=new JavaVMStackOOM();
        oom.stackLeakByThread();
    }
}

最佳答案

1.The first question is for arguments -Xms20m and -Xss2M (the first one is for heap size and second for thread stack size), does m and M have the same meaning and all means MB?

是的,m 和 M 的含义相同,都表示 MB。

2.The second question is, I have the following code snippet, which I expect get a runtime error very quick since the stack size was set to 512M but the code cause my OS to stuck and never give me a runtime error, anyone knows why is that?

首先,Java 不仅仅使用堆内存。 JVM 在某些情况下使用非堆内存(调用策略、元空间等)。 This question回答这个情况。所以线程栈使用非堆内存。

证明:

运行应用程序XX:NativeMemoryTracking=summary并使用jcmd VM.native_memory命令检查已用内存。相关javadoc here .

首先,使用 -XX:NativeMemoryTracking=summary -Xms20m -Xss2M 参数运行应用程序,结果:

Native Memory Tracking:

Total: reserved=4581409KB, committed=171605KB

  • Java Heap (reserved=3121152KB, committed=20480KB) (mmap: reserved=3121152KB, committed=20480KB)

  • Thread (reserved=21567KB, committed=21567KB) (thread #16) (stack: reserved=21504KB, committed=21504KB) (malloc=45KB #82) (arena=18KB #27)

然后,使用 java -XX:NativeMemoryTracking=summary -Xms20m -Xss512M 参数运行相同的应用程序,结果:

Native Memory Tracking:

Total: reserved=7714849KB, committed=3305045KB

  • Java Heap (reserved=3121152KB, committed=20480KB) (mmap: reserved=3121152KB, committed=20480KB)

  • Thread (reserved=3155007KB, committed=3155007KB) (thread #16) (stack: reserved=3154944KB, committed=3154944KB) (malloc=45KB #82) (arena=18KB #27)

如您所见,两种情况下堆内存都没有变化,但线程 native 内存随着最后一种情况而增加。因为我们增加了每个堆栈的大小。因此应用程序永远不会给出运行时错误,因为堆栈不使用堆内存。

注意:保留内存代表我们的应用程序可能使用的内存总量。相反,提交的内存等于我们的应用程序当前使用的内存量。

注释 2:对于每个线程,JVM 都会创建一个存储在此处的运行时堆栈。该堆栈的每个 block 称为 Activity 记录/堆栈帧,用于存储方法调用。该方法的所有局部变量都存储在其相应的框架中。线程终止后,其运行时堆栈将被 JVM 销毁。它不是共享资源。

关于java - JVM 参数 -Xms 和 -Xss,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56661193/

相关文章:

java - -Djava.library.path 中的多个目录

java - 使用 Java 独立应用程序的 SSL 连接

java 。 Lock 类型的 isOpen() 方法未定义。还需要一些帮助修复一些代码/调试

java - 确保只有一个线程初始化对象

build - 在 Linux 上构建 OpenJDK 时可以设置多少个调试选项?

java - 附加到已经运行的 JVM

java - 在内存中保留最大整数数组所需的空间

java - 由于 Java 中的合法注释中的内容而导致的错误

java - Hibernate 在查询时抛出 StackOverflowError

java - 为嵌入式流媒体设备选择 JVM