当前位置: 首页 > 知识库问答 >
问题:

为什么java-XX:PrintFlagsFinal和jinfo-flag MaxHeapSize之间的MaxHeapSize值不同

呼延曜灿
2023-03-14

我正在docker容器中的apline linux系统上运行java应用程序,我想找出MaxHeapSize的值,所以我使用了几个命令:java-XX:printflasfinal、jinfo-flag MaxHeapSize、jmap-heap,但输出让我感到困惑。jinfo-flag MaxHeapSize、jmap-heap的输出是一致的。然而,java-XX:PrintFlagsFinal的输出是不同的。那么,为什么会发生这种情况?

默认容器内存限制设置为4096MiB。

在此处输入图像描述

java conond的输出如下所示。(我在图片中标记了一些重要部分)

bash-5.0# jps -v
9 jar -Dfile.encoding=utf-8 -XX:+UseG1GC -XX:+UseStringDeduplication -XX:-OmitStackTraceInFastThrow -XX:MaxRAMPercentage=60.0 -XX:InitialRAMPercentage=20.0 -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:log/gc-%t.log -Duser.timezone=Asia/Shanghai -Delastic.apm.service_name=SUPER-STUDENTS -Delastic.apm.environment=k8s-prod-th-zhidao-manhattan -Delastic.apm.server_urls= -Delastic.apm.trace_methods= -Delastic.apm.trace_methods_duration_threshold=100ms -Delastic.apm.application_packages=outfox -Delastic.apm.capture_body=all -Delastic.apm.ignore_message_queues=* -Delastic.apm.profiling_inferred_spans_enabled=true -Delastic.apm.profiling_inferred_spans_sampling_interval=10ms -Delastic.apm.profiling_inferred_spans_min_duration=50ms -Dskywalking.agent.service_name=super-students -Dskywalking.agent.instance_name=super-students-75f964dbbd-5gfnv -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1234
64155 Jps -Dapplication.home=/opt/java/openjdk -Xms8m
bash-5.0# java -XX:+PrintFlagsFinal -version | grep -Ei "maxheapsize|maxram"
    uintx DefaultMaxRAMFraction                     = 4                                   {product}
    uintx MaxHeapSize                              := 1073741824                          {product}
 uint64_t MaxRAM                                    = 137438953472                        {pd product}
    uintx MaxRAMFraction                            = 4                                   {product}
   double MaxRAMPercentage                          = 25.000000                           {product}
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.282-b08, mixed mode)
bash-5.0# jinfo -flag MaxHeapSize 9
-XX:MaxHeapSize=2577399808
bash-5.0# jmap -heap 9
Attaching to process ID 9, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.282-b08

using thread-local object allocation.
Garbage-First (G1) GC with 1 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 2577399808 (2458.0MB)
   NewSize                  = 1363144 (1.2999954223632812MB)
   MaxNewSize               = 1545601024 (1474.0MB)
   OldSize                  = 5452592 (5.1999969482421875MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage:
G1 Heap:
   regions  = 2458
   capacity = 2577399808 (2458.0MB)
   used     = 320120112 (305.2903289794922MB)
   free     = 2257279696 (2152.709671020508MB)
   12.420273758319455% used
G1 Young Generation:
Eden Space:
   regions  = 53
   capacity = 654311424 (624.0MB)
   used     = 55574528 (53.0MB)
   free     = 598736896 (571.0MB)
   8.493589743589743% used
Survivor Space:
   regions  = 10
   capacity = 10485760 (10.0MB)
   used     = 10485760 (10.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 247
   capacity = 389021696 (371.0MB)
   used     = 254059824 (242.2903289794922MB)
   free     = 134961872 (128.7096710205078MB)
   65.30736630174992% used

63962 interned Strings occupying 6772928 bytes.

在此处输入图像描述

共有1个答案

丌官嘉福
2023-03-14

这些都不是在比较同一件事。

当运行jmapjstack时,这些附加到带有PID 9的现有进程,如第一个jps命令中列出的。

当运行java-XX:PrintFlagsFinal-version时,这将创建一个新的JVM进程,并打印该新进程的信息。请注意,原始PID 9进程有许多其他标志,这些标志可能会影响计算的堆大小。

为了进行更准确的比较,您可以在容器启动时向主命令运行中添加-XX:PrintFlagsFinal标志。我希望这与jinfo和jmap返回的值相匹配。

 类似资料:
  • 问题内容: 今天,我刚刚发现了一个问题,因为我的一个单元测试由于从Java 7升级到Java 8而失败了。该单元测试调用一个方法,该方法试图在子类上注释的方法上找到注释,但返回类型不同。 在Java 7中,似乎只有在代码中确实声明了注释时,才会找到注释。在Java 8中,似乎包含在子类中声明的注释。 为了说明这一点,我创建了一个简单的(??)测试类IAPTest(用于IsAnnotationPre

  • 我不明白为什么下面的代码在Java中会出错: 错误发生在部分。错误有: I:\documents\netbeansprojects\testingground\src\testingground\TestClass.java:22:错误:非静态变量这不能从静态上下文引用public static final TestClass常量=new InnerClass(5);^I:\documents\n

  • 我正在学习React Route来帮助我构建一个应用程序,在成功登录后可以从登录页面重定向到主页。 我在这里阅读了官方教程:https://github.com/reactjs/react-router-tutorial/tree/master/lessons/12-navigating 在本课中,他们介绍了两种以编程方式导航的方法,即browserHistory和context.route。他们

  • 尽管有值,但我不能得到一个用户的值的和时间。 即使用户17有工作时间值,我也会在sumTW列中得到该用户的NULL值。我该怎么解决? 这就是我的查询看起来的样子: 下面是表格代码: (这个表和原来的不一样,原来的有外键。我去掉它们只是为了能够再现同样的问题,同样的问题被报告了)。

  • 问题内容: 以下使用argparse的子解析器的代码在Python 3上失败,但在Python 2中按预期运行。在比较了文档之后,我仍然不知道为什么。 Python 2.7.6的输出为: 在Python 3.3.5中,我得到: 问题答案: 最新版本改变了它测试所需参数的方式,而次级解析器也陷入了困境。它们不再是“必需的”。 http://bugs.python.org/issue9253#msg1

  • 问题内容: 以下代码在Java 8和9中都可以编译,但是行为不同。 当我使用Java 8运行它时,它返回: 但是当我用Java 9运行它时,输出却不同: 为什么? 问题答案: 在Java文档是Unicode标准的一致性出来。Javadoc弄混了应该匹配的内容。内容为: 任何Unicode换行符序列都等效于 该Java文档是错误的。在R1.6换行符的小节中,有关正则表达式的Unicode技术标准#1