62 一次 Promotion failed 的调试

news2024/9/23 17:25:08

前言 

最近 有一个想法就是, 调试一下 DefNewGeneration 里面的晋升失败的情况 

呵呵 对于这块的代码上面, 看着感觉有一些疑问的地方, 因此想通过 实际的调试, 来验证一下 实际的情况 

然后 之前写了一个用例, 但是 和心中的期望差距甚大, 当然 主要的问题 还是自己对于 细节的把控不足, 参见 一次 younggc fullgc 的调试 

因此 这次又来了, 当然 这个用例 在 vm 层面上做了一定的修改, 以方便 调试 "Promotion failed"

以下代码, 截图 基于 jdk9 

一下调试可能是来自于多次调试, 因此 地址信息, 内存大小信息 未必能够对上  

测试用例

package com.hx.test08;

import org.openjdk.jol.vm.VM;
import org.openjdk.jol.vm.VirtualMachine;

import static com.hx.test07.Test30PromotionFailed.touchMinorGc;

/**
 * Test01PromotionFailed
 *
 * @author Jerry.X.He <970655147@qq.com>
 * @version 1.0
 * @date 2020-08-16 15:43
 */
public class Test01PromotionFailed {

  // identStr
  private String identStr = "identStr";

  public Test01PromotionFailed(String identStr) {
    this.identStr = identStr;
  }

  // Test01PromotionFailed
  // -Xmx32M -XX:+UseSerialGC -XX:NewRatio=1 -XX:MaxTenuringThreshold=1 -XX:+PrintGCDetails -cp .:/Users/jerry/.m2/repository/org/openjdk/jol/jol-core/0.8/jol-core-0.8.jar
  // 需要运行时 调整 DefNewGeneration 的相关代码, 这个示例 还需要在稍微调整一下, 能够体现出关系的
  public static void main(String[] args) throws Exception {

    VirtualMachine vm = VM.current();
    int _1M = 1 * 1024 * 800;

    Test01PromotionFailed[] alreadyInOld = new Test01PromotionFailed[3 * _1M];
    alreadyInOld[0] = new Test01PromotionFailed("alreadyInOld[0]");
    System.out.println("alreadyInOld : " + vm.addressOf(alreadyInOld));
    System.out.println("alreadyInOld[0] : " + vm.addressOf(alreadyInOld[0]));
    touchMinorGc();
    System.out.println("alreadyInOld : " + vm.addressOf(alreadyInOld));
    System.out.println("alreadyInOld[0] : " + vm.addressOf(alreadyInOld[0]));

    System.out.println(" ------------ alreadyInOld ------------ ");

    Test01PromotionFailed[] promotionFailed = new Test01PromotionFailed[3 * _1M];
    promotionFailed[0] = new Test01PromotionFailed("promotionFailed[0]");
    promotionFailed[1] = alreadyInOld[0];
    System.out.println("promotionFailed : " + vm.addressOf(promotionFailed));
    System.out.println("promotionFailed[0] : " + vm.addressOf(promotionFailed[0]));
    touchMinorGc();
    System.out.println("promotionFailed : " + vm.addressOf(promotionFailed));
    System.out.println("promotionFailed[0] : " + vm.addressOf(promotionFailed[0]));
    System.out.println("alreadyInOld : " + vm.addressOf(alreadyInOld));
    System.out.println("alreadyInOld[0] : " + vm.addressOf(alreadyInOld[0]));

    System.out.println(" ------------ promotionFailed ------------ ");

  }

}

执行之后 日志如下 

[0.025s][warning][gc] -XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.
Signal: SIGSEGV (signal SIGSEGV)
[2.545s][info   ][gc] Using Serial
[2.545s][info   ][gc,heap,coops] Heap address: 0x00000007be000000, size: 32 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
Signal: SIGSEGV (signal SIGSEGV)
# WARNING: Unable to get Instrumentation. Dynamic Attach failed: null. You may add this JAR as -javaagent manually.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.openjdk.jol.vm.sa.ServiceabilityAgentSupport (file:/Users/jerry/.m2/repository/org/openjdk/jol/jol-core/0.8/jol-core-0.8.jar) to field sun.management.RuntimeImpl.jvm
WARNING: Please consider reporting this to the maintainers of org.openjdk.jol.vm.sa.ServiceabilityAgentSupport
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
# WARNING: Unable to attach Serviceability Agent. You can try again with escalated privileges. Two options: a) use -Djol.tryWithSudo=true to try with sudo; b) echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
[15.909s][info   ][gc,start     ] GC(0) Pause Young (Allocation Failure)
max_promotion_in_bytes = 1 = (size_t) 1
[20.978s][info   ][gc,heap      ] GC(0) DefNew: 13184K->1600K(14784K)
[20.979s][info   ][gc,heap      ] GC(0) Tenured: 0K->468K(16384K)
[20.979s][info   ][gc,metaspace ] GC(0) Metaspace: 11260K->11260K(1060864K)
[20.985s][info   ][gc           ] GC(0) Pause Young (Allocation Failure) 12M->2M(30M) 5069.789ms
[20.985s][info   ][gc,cpu       ] GC(0) User=0.10s Sys=0.21s Real=5.08s
alreadyInOld : 33253750272
alreadyInOld[0] : 33253505256
max : 12M, used : 10M, touchMinorGc created 4 byte[1M] 
[21.304s][info   ][gc,start     ] GC(1) Pause Young (Allocation Failure)
max_promotion_in_bytes = 1 = (size_t) 1
[22.969s][info   ][gc,heap      ] GC(1) DefNew: 14781K->391K(14784K)
[22.969s][info   ][gc,heap      ] GC(1) Tenured: 468K->11651K(16384K)
[22.969s][info   ][gc,metaspace ] GC(1) Metaspace: 12040K->12040K(1060864K)
[22.969s][info   ][gc           ] GC(1) Pause Young (Allocation Failure) 14M->11M(30M) 1665.263ms
[22.969s][info   ][gc,cpu       ] GC(1) User=0.11s Sys=0.00s Real=1.67s
alreadyInOld : 33270016504
alreadyInOld[0] : 33266216512
 ------------ alreadyInOld ------------ 
promotionFailed : 33254801960
promotionFailed[0] : 33254540032
max : 12M, used : 11M, touchMinorGc created 3 byte[1M] 
[22.996s][info   ][gc,start     ] GC(2) Pause Young (Allocation Failure)
max_promotion_in_bytes = 1 = (size_t) 1
[23.969s][info   ][gc,promotion ] Promotion failed
[24.825s][info   ][gc,start     ] GC(3) Pause Full (Allocation Failure)
[24.827s][info   ][gc,phases,start] GC(3) Phase 1: Mark live objects
[25.017s][info   ][gc,phases      ] GC(3) Phase 1: Mark live objects 190.929ms
[25.017s][info   ][gc,phases,start] GC(3) Phase 2: Compute new object addresses
[25.031s][info   ][gc,phases      ] GC(3) Phase 2: Compute new object addresses 13.600ms
[25.031s][info   ][gc,phases,start] GC(3) Phase 3: Adjust pointers
[25.145s][info   ][gc,phases      ] GC(3) Phase 3: Adjust pointers 113.455ms
[25.145s][info   ][gc,phases,start] GC(3) Phase 4: Move objects
[25.153s][info   ][gc,phases      ] GC(3) Phase 4: Move objects 8.183ms
[25.178s][info   ][gc             ] GC(3) Pause Full (Allocation Failure) 24M->21M(30M) 353.170ms
[25.178s][info   ][gc,heap        ] GC(2) DefNew: 13320K->9600K(14784K)
[25.178s][info   ][gc,heap        ] GC(2) Tenured: 11651K->12026K(16384K)
[25.178s][info   ][gc,metaspace   ] GC(2) Metaspace: 12040K->12040K(1060864K)
[25.179s][info   ][gc             ] GC(2) Pause Young (Allocation Failure) 24M->21M(30M) 2183.003ms
[25.179s][info   ][gc,cpu         ] GC(2) User=0.40s Sys=0.00s Real=2.18s
promotionFailed : 33252442112
promotionFailed[0] : 33262272528
alreadyInOld : 33270016504
alreadyInOld[0] : 33281179280
 ------------ promotionFailed ------------ 
[25.184s][info   ][gc,heap,exit   ] Heap
[25.184s][info   ][gc,heap,exit   ]  def new generation   total 14784K, used 12163K [0x00000007be000000, 0x00000007bf000000, 0x00000007bf000000)
[25.184s][info   ][gc,heap,exit   ]   eden space 13184K,  92% used [0x00000007be000000, 0x00000007bebe0d00, 0x00000007bece0000)
[25.184s][info   ][gc,heap,exit   ]   from space 1600K,   0% used [0x00000007bee70000, 0x00000007bee70000, 0x00000007bf000000)
[25.184s][info   ][gc,heap,exit   ]   to   space 1600K,   0% used [0x00000007bece0000, 0x00000007bece0000, 0x00000007bee70000)
[25.184s][info   ][gc,heap,exit   ]  tenured generation   total 16384K, used 12026K [0x00000007bf000000, 0x00000007c0000000, 0x00000007c0000000)
[25.184s][info   ][gc,heap,exit   ]    the space 16384K,  73% used [0x00000007bf000000, 0x00000007bfbbea60, 0x00000007bfbbec00, 0x00000007c0000000)
[25.184s][info   ][gc,heap,exit   ]  Metaspace       used 12046K, capacity 12844K, committed 13056K, reserved 1060864K
[25.184s][info   ][gc,heap,exit   ]   class space    used 1305K, capacity 1466K, committed 1536K, reserved 1048576K
[25.189s][info   ][gc,verify,start] Verifying 
[25.570s][info   ][gc,verify      ] Verifying  381.932ms

从上面可以看到, 整个过程中 总共是触发了 四次 gc 

在 分配 alreadyInOld 之前空间不够 触发了一次 young gc 

然后 之后 alreadyInOld 之后的 touchMinorGc 触发了一次 young gc, 吧 alreadyInOld 放到了 old(to空间不够, promotion 到了 old)

然后 promotionFailed 之后又触发了一次 gc, 这次 young gc 发生了 "Promotion failed ", 然后 之后 又触发了一次 full gc 

我们这里 核心需要关注的是 第三次 gc, 也就是 发生了 "Promotion failed " 的这一次 

第一次 gc 的触发时机 

第二次 gc, alreadyInOld 的去向

上面日志中有一行 "max_promotion_in_bytes = 1 = (size_t) 1", 这个是为了 更轻松的构造 "Promotion failed ", 运行时修改了一个条件, 修改的是 如下的 collection_attempt_is_safe() 

  // If the next generation is too full to accommodate promotion
  // from this generation, pass on collection; let the next generation
  // do it.
  if (!collection_attempt_is_safe()) {
    log_trace(gc)(":: Collection attempt not safe ::");
    gch->set_incremental_collection_failed(); // Slight lie: we did not even attempt one
    return;
  }

第三次 gc, Promotion failed

我们这里主要关注几个东西, alreadyInOld[0], promotionFailed, promotionFailed[0] 这三个引用对应的 oop, 以及这三个引用本身  

alreadyInOld 在这里并不是那么重要, 仅仅是一个 占用 old 的 dummy 

首先来看一下 promotionFailed 

[Lcom.hx.test08.Test01PromotionFailed; 
{0x00000007be33f6f8} - klass: 'com/hx/test08/Test01PromotionFailed'[]
 - length: 2457600
 -   0 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007be200300}
 -   1 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007bed22ef8}
 -   2 : NULL
 -   3 : NULL

结合日志 发现这里的地址是对上的 

alreadyInOld : 33270017464
alreadyInOld[0] : 33266216696
 ------------ alreadyInOld ------------ 
promotionFailed : 33255847672
promotionFailed[0] : 33254540032

我们再来看一下 对于 promotionFailed 的处理 

promotionFailed 的 age 为 0, to 里面分配不了空间, 因此尝试 promotion 到 old, old 里面也分配不了空间, 然后 记录了一下 "Promotion failed ", 最后返回的是  promotionFailed 对应的 oop 的地址, 所以 young gc 之后 promotionFailed  对应的 oop 是没有变化的 

promotionFailed 这个引用本身, 也没有变化, 也还是 0x00000007be33f6f8 

再来看一下 promotionFailed[0]

com.hx.test08.Test01PromotionFailed 
{0x00000007be200300} - klass: 'com/hx/test08/Test01PromotionFailed'
 - ---- fields (total size 2 words):
 - private 'identStr' 'Ljava/lang/String;' @12  "promotionFailed[0]"{0x00000007be200310} (f7c40062 5)

再来看一下 promotionFailed[0] 的处理, 通过 刚才 "Promotion failed " 的 promotionFailed 找到了 promotionFailed[0]

吧 promotionFailed[0] 复制到了 to, 因此 promotionFailed[0] 被复制到了 to 

promotionFailed[0] 这个引用 也指向了 新的地址 

再来看一下 alreadyInOld[0]/promotionFailed[1]

com.hx.test08.Test01PromotionFailed 
{0x00000007bed22ef8} - klass: 'com/hx/test08/Test01PromotionFailed'
 - ---- fields (total size 2 words):
 - private 'identStr' 'Ljava/lang/String;' @12  "alreadyInOld[0]"{0x00000007becea2e0} (f7d9d45c d)

再来看一下 alreadyInOld[0] 的处理, 通过 刚才 "Promotion failed " 的 promotionFailed 找到了 alreadyInOld[0]

吧 alreadyInOld[0] 复制到了 to, 因此 alreadyInOld[0] 被复制到了 to 

alreadyInOld[0] 这个引用 也指向了 新的地址 

最后, 来到这一次 gc 的末尾, 我们看一下 各个地址的情况 

可以看懂 promotionFailed 最后还是在该对象原来的位置, promotionFailed[0], promotionFailed[1] 指向的是 这两个 oop 复制之后的位置

promotionFailed[0], promotionFailed[1] 这两个 oop 之前的位置的数据还在, 因为 "Promotion failed " 不能清理空间, 但是已经没有 引用引用 这两个 oop 了 

[1145.114s][info   ][gc,promotion ] Promotion failed
[Lcom.hx.test08.Test01PromotionFailed; 
{0x00000007be33f6f8} - klass: 'com/hx/test08/Test01PromotionFailed'[]
 - length: 2457600
 -   0 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007bee70000}
 -   1 : a 'com/hx/test08/Test01PromotionFailed'{0x00000007bfb680a8}
 -   2 : NULL
 -   3 : NULL
 - 省略掉预览的其他 251 个 oop 的展示
 - <2457344 more elements, increase MaxElementPrintSize to print>
com.hx.test08.Test01PromotionFailed 
{0x00000007be200300} - klass: 'com/hx/test08/Test01PromotionFailed'
 - ---- fields (total size 2 words):
 - private 'identStr' 'Ljava/lang/String;' @12  "promotionFailed[0]"{0x00000007be200310} (f7c40062 5)
com.hx.test08.Test01PromotionFailed 
{0x00000007bed22ef8} - klass: 'com/hx/test08/Test01PromotionFailed'
 - ---- fields (total size 2 words):
 - private 'identStr' 'Ljava/lang/String;' @12  "alreadyInOld[0]"{0x00000007becea2e0} (f7d9d45c 5)
com.hx.test08.Test01PromotionFailed 
{0x00000007bee70000} - klass: 'com/hx/test08/Test01PromotionFailed'
 - ---- fields (total size 2 words):
 - private 'identStr' 'Ljava/lang/String;' @12  "promotionFailed[0]"{0x00000007bee70028} (f7dce005 d)
com.hx.test08.Test01PromotionFailed 
{0x00000007bed22ef8} - klass: 'com/hx/test08/Test01PromotionFailed'
 - ---- fields (total size 2 words):
 - private 'identStr' 'Ljava/lang/String;' @12  "alreadyInOld[0]"{0x00000007becea2e0} (f7d9d45c 5)

第四次 gc 

上面的调试输出是 第三次 gc 期间的运行时的数据 

第四次 之后的日志 便是上面的, 当然 我们这里 并不是那么关心, 因此 不多赘述 

promotionFailed : 33252442112
promotionFailed[0] : 33262272528
alreadyInOld : 33270017464
alreadyInOld[0] : 33281179816

 第四次 gc 触发的时机 

完 

参考

一次 younggc fullgc 的调试 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSDN 算法技能树 蓝桥杯-基础 刷题+思考总结

切面条-蓝桥杯-基础-CSDN算法技能树https://edu.csdn.net/skill/algorithm/algorithm-530255df51be437b967cbc4524fe66ea?category188 目录 切面条 大衍数列 门牌制作 方阵转置 微生物增殖 成绩统计 星系炸弹 判断闰年的依据: 特别数的和 *日志统计*&#xff08;双指…

结构体与引用

1.结构体基本概念结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同的数据类型2.结构体定义和使用语法: struct 结构体 { 结构体成员列表 };通过结构体创建变量的方式有三种:struct 结构体名 变量名struct 结构体名 变量名 { 成员1值&#xff0c;成员2值...}定义结构…

《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)

简介   在实际工作中&#xff0c;有些接口请求完以后会重定向到别的url&#xff0c;而你却需要重定向前的url。URL主要是针对虚拟空间而言&#xff0c;因为不是自己独立管理的服务器&#xff0c;所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…

分布式session共享解决方案

分布式session共享解决方案 1.分布式 Session 问题 示意图 解读上图&#xff0c;假如我们去购买商品 当 Nginx 对请求进行负载均衡后, 可能对应到不同的 Tomcat比如第 1 次请求, 均衡到 TomcatA, 这时 Session 就记录在 TomcatA, 第 2 次请求&#xff0c; 均衡到 TomcatB, 这…

【Mysql8.0取消严格区分大小】已安装的mysql8.0取消严格区分大小写及mysql8.0重装与赋权限详解(2023年亲测有效)

【写在前面】其实故事要从my.cnf为空&#xff0c;且lower-case-table-names为0开始&#xff0c;linux环境下mysql8.0及其之后的版本对表名和数据库是严格区分大小写的&#xff0c;从而导致我们运行项目时候会报错Table xxx.QRTZ_LOCKS doesnt exist。但是我已经装好了mysql8.0咋…

17.CSS伪类

举一个简单的例子来说明什么是伪类&#xff1f; 从之前的代码中&#xff0c;如下图&#xff0c;我们像给这两个列表中的某一列单独设置样式&#xff0c;我们该如何做呢&#xff1f; 我们肯定会选择在li标签上添加class去实现&#xff0c;如下 开始标记结束标记实际元素 <…

python--matplotlib(2)

前言 Matplotlib画图工具的官网地址是 http://matplotlib.org/ Python环境下实现Matlab制图功能的第三方库&#xff0c;需要numpy库的支持&#xff0c;支持用户方便设计出二维、三维数据的图形显示&#xff0c;制作的图形达到出版级的标准。 实验环境 Pycharm2020.2.5社区版,w…

算法练习-链表(二)

算法练习-链表&#xff08;二&#xff09; 文章目录算法练习-链表&#xff08;二&#xff09;1. 奇偶链表1.1 题目1.2 题解2. K 个一组翻转链表2.1 题目2.2 题解3. 剑指 Offer 22. 链表中倒数第k个节点3.1 题目3.2 题解3.2.1 解法13.2.2 解法24. 删除链表的倒数第 N 个结点4.1 …

中国智能物流行业市场规模及未来发展趋势

中国智能物流行业市场规模及未来发展趋势编辑中国智能物流行业市场规模正在快速增长。随着电子商务、物流配送、物联网等行业的发展&#xff0c;物流行业需求不断提高&#xff0c;智能物流产品应运而生。智能物流行业主要通过智能化管理、智能路径规划、智能定位、物流配送等方…

Java特性之设计模式【工厂模式】

一、工厂模式 概述 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式 在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通…

投票需要什么流程微信投票互助平台的免费投票平台搭建

“最美家政人”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票小程序能够提高工作效…

Java-集合(5)

Map接口 JDK8 Map接口实现子类的特点 Map和Collection是并列关系&#xff0c;Map用于保存具有映射关系的数据&#xff1a;Key-ValueMap中的key和value可以是任何引用类型的数据&#xff0c;会封装到HashMap$Node对象中Map中的key不允许重复&#xff0c;原因和HashSet一样Map…

2023年美赛MCM 问题C:预测Wordle结果 ​

目录2023年美赛MCM 问题C: 预测Wordle结果 ​1. 背景2. 要求3. 附件1. 数据文件。2. 纽约时报网站上发布的 Wordle 指南4. 参考2023年美赛MCM 问题C: 预测Wordle结果 ​ 1. 背景 Wordle 是纽约时报目前每天提供的流行拼图。 玩家尝试通过在六次或更少的尝试中猜测一个五个字母…

记录一次Binder内存相关的问题导致APP被杀的BUG排查过程

事情的起因的QA压测过程发生进程号变更&#xff0c;怀疑APP被杀掉过&#xff0c;于是开始看日志 APP的压测平台会上报进程号变更时间点&#xff0c;发现是在临晨12&#xff1a;20分&#xff0c;先大概确定在哪个日志文件去找关键信息一开始怀疑是crash&#xff0c;然后就在日志…

shiro CVE-2020-1957

0x00 前言 在之前只是单纯的复现了漏洞&#xff0c;没有记笔记&#xff0c;所以补充了这篇分析笔记。 影响版本&#xff1a;shiro < 1.5.2 0x01 环境搭建 环境用的是&#xff1a;https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic 0x02 漏…

用python实现对AES加密的视频数据流解密

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 在做网络爬虫的时候,会遇到经过AES加密的数据,可以使用python来进行解密。 在做爬虫的时候,通常可以找到一个key,这个key是一个十六进制的一串字符,这传字符是解密的关键。所以对于…

SpringBoot2.X整合ClickHouse项目实战-从零搭建整合(三)

一、ClickHouseSpringBoot2.XMybatisPlus整合搭建 二、需求描述和数据库准备 三、ClickHouse统计SQL编写实战和函数使用 四、ClickHouseSpringBoot2.X案例-基础模块搭建 controller/request层 mapper层 model层 service层 五、ClickHouseSpringBoot2.X案例-数据统计接口 …

城市轨道交通供电系统研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

一文告诉你什么是财务数据治理?

大家好&#xff0c;我是梦想家Alex&#xff0c;今天是周末&#xff0c;就不给大家分享技术文了&#xff5e;应出版社老师推荐&#xff0c;文末给大家送几本DAMA中国主席力荐&#xff0c;20位行业专家历时2年共同打造的《财务数据治理实战》&#xff0c;将数据治理理论应用于财务…

怎样查询PMP成绩?

【如何查询成绩】1、输入网址&#xff08;PMI官网&#xff0c;不知道网址的私戳&#xff09;&#xff0c;点击 Log In如果忘记 PMI 的账号和密码了&#xff0c;怎么办&#xff1f;可以在你报名机构官网的个人中心的学习中心的我的报名处查看 PMI 的注册名和密码2、点击 Exam An…