java提升-常见的java调试工具介绍

常见工具罗列

当然,以下是整合了之前两个答案中关于JDK自带命令行工具的全面列表:

JDK自带的命令行工具在Java开发、测试、调试以及管理Java应用程序中扮演着重要角色。以下是一些关键的JDK命令行工具:

  1. javac:Java编译器,用于将Java源代码(.java文件)编译成字节码(.class文件)。

  2. java:Java解释器,用于运行编译后的Java应用程序(.class文件或.jar文件)。

  3. jar:Java归档工具,用于打包多个Java类文件、相关元数据和资源文件到一个JAR文件中。

  4. javap:Java类文件反汇编器,用于查看Java编译后的字节码(.class文件)的详细信息。

  5. javah(已废弃,JDK 10及更高版本中不再提供):Java头文件生成器,用于从Java类生成C/C++的头文件(主要用于JNI编程)。

  6. jdb:Java调试器,用于调试Java程序,支持设置断点、单步执行代码、查看变量值等。

  7. jinfo:Java配置信息工具,用于打印Java进程的VM参数和系统属性,也可以动态地添加或修改系统属性。

  8. jmap:Java内存映射工具,用于生成Java堆的内存映射,包括堆中对象的统计信息、类直方图等。

  9. jstack:Java堆栈跟踪工具,用于打印给定Java进程的Java和本地线程堆栈跟踪,有助于分析线程死锁等问题。

  10. jstat:Java虚拟机统计信息监控工具,用于监视JVM的性能和资源消耗情况。

  11. javadoc:Javadoc文档生成器,用于从Java源代码中自动生成API文档。

  12. jps:Java虚拟机进程状态工具,用于显示当前系统中所有Java虚拟机进程的列表。

  13. jhat:Java堆转储快照分析工具,与jmap结合使用,用于分析堆转储快照文件。

  14. jcmd:Java命令工具,用于向正在运行的Java进程发送诊断命令。

  15. jrunscript:JavaScript执行引擎,允许在Java环境中运行和测试JavaScript代码。

  16. jdeps:依赖关系分析工具,用于分析Java类文件之间的依赖关系。

  17. jlink(JDK 9及更高版本):Java模块化工具,用于创建自定义的JRE镜像,根据应用程序需求裁剪和优化JRE。

如何使用jar

使用jar命令行主要涉及几个关键的操作,包括打包(创建jar文件)、查看jar文件内容、解压jar文件以及运行jar文件。以下是详细的步骤和说明:

1. 打包(创建jar文件)

打包jar文件通常使用jar命令的cvf选项,其中c代表创建新的归档文件,v代表在创建过程中生成详细输出(可选),f指定归档文件的名称。基本命令格式如下:

jar cvf your_jar_file.jar -C directory_to_include/ .
  • your_jar_file.jar是你想要创建的jar文件的名称。
  • -C directory_to_include/ 指定了包含要打包的文件的目录,.表示该目录下的所有文件和子目录都将被打包。

如果你的jar文件需要指定主类(即包含public static void main(String[] args)方法的类),你还需要在jar文件中包含一个Manifest文件,并在该文件中指定主类。这通常涉及到创建一个Manifest文件,然后在打包jar文件时将其包含进去。

2. 查看jar文件内容

使用jar命令的tf选项可以查看jar文件的内容,即列出jar文件中的所有文件和目录。命令格式如下:

jar tf your_jar_file.jar

3. 解压jar文件

解压jar文件可以使用jar命令的xf选项,或者使用其他解压缩工具如unzip(在支持的系统上)。使用jar命令解压的格式如下:

jar xf your_jar_file.jar

这将在当前目录下解压jar文件的所有内容。

4. 运行jar文件

运行jar文件通常使用java命令的-jar选项。在运行之前,请确保你的jar文件是可执行的,并且包含了必要的Manifest文件,其中指定了主类。命令格式如下:

java -jar your_jar_file.jar

如果jar文件需要传递参数,可以在命令后添加这些参数,用空格分隔。

注意事项

  • 在执行上述命令之前,请确保你的系统已经安装了Java,并且javajar命令可以在命令行中直接执行。这通常涉及到将Java的安装目录添加到系统的PATH环境变量中。
  • 如果你的jar文件依赖于其他jar文件,并且这些依赖没有被打包进你的jar文件中,你可能需要使用-cp-classpath选项来指定类路径,以便Java虚拟机能够找到这些依赖。
  • 在处理复杂的Java项目时,通常会使用构建工具(如Maven或Gradle)来自动化打包和运行过程,这些工具能够处理复杂的依赖关系和构建逻辑。

如何使用jps

jps命令行详细介绍

jps(Java Virtual Machine Process Status Tool)是Java开发工具包(JDK)中的一个命令行工具,用于显示当前用户有权访问的主机上Java进程的信息。它可以帮助开发人员和系统管理员监视和调试Java应用程序。以下是jps命令的详细介绍:

基本用法

  • 无参数使用:直接在命令行中输入jps,将列出当前系统中所有正在运行的Java进程的进程ID(PID)和主类名(或JAR文件名)。

选项参数

jps命令支持多种选项参数,用于定制输出内容和格式。以下是一些常用的选项:

  1. -l:输出应用程序主类的完整包名或应用程序JAR文件的完整路径名。这有助于区分具有相同名称但不同包路径的Java进程。

  2. -m:输出传递给main方法的参数。对于嵌入式JVM,输出可能为空。这个选项有助于了解Java进程是如何被启动的,特别是当它们依赖于特定的命令行参数时。

  3. -v:输出传递给JVM的参数。这些参数通常包括JVM的堆大小、垃圾收集器设置等,对于性能调优和故障排查非常有用。

  4. -q:只输出JVM进程的PID,不显示主类名或任何其他信息。这个选项在需要快速获取Java进程列表以进行进一步处理时非常有用。

  5. -V:通过flags文件(如.hotspotrc文件或通过-XX:Flags=参数指定的文件)输出传递给JVM的参数。这个选项不常用,但在需要查看特定JVM实例的详细配置时可能很有用。

  6. -Joption:将选项传递给jps调用的java启动器。这允许用户为jps命令本身设置JVM参数,例如-J-Xms48m将启动内存设置为48兆字节。

示例输出

  • jps:默认输出格式,显示PID和主类名(或JAR文件名)。

    1234 MyApp
    5678 AnotherApp
    
  • jps -l:显示PID、主类的完整包名或JAR文件的完整路径名。

    1234 com.example.MyApp
    5678 /path/to/AnotherApp.jar
    
  • jps -m:显示PID、主类名和传递给main方法的参数。

    1234 MyApp arg1 arg2
    5678 AnotherApp
    
  • jps -v:显示PID、主类名、传递给main方法的参数(如果有的话)和JVM参数。

    1234 MyApp -Xmx512m -XX:+UseG1GC
    5678 AnotherApp
    

注意事项

  • 当jps无法正常工作时,可能是因为磁盘权限问题、临时文件丢失或Java进程信息存储位置不在默认目录。解决这些问题可能涉及检查目录权限、确认临时文件未被清理以及确保-Djava.io.tmpdir设置正确。
  • jps命令在jdk的JAVA_HOME/bin/目录下面,使用时需要确保该目录已经添加到系统的PATH环境变量中,以便在任意位置都能调用jps命令。

jps命令是Java开发和系统管理中不可或缺的工具之一,通过它可以快速了解系统中Java进程的状态和配置信息,为后续的调试和性能优化提供有力支持。

如何使用jinfo

jinfo是JDK提供的一个命令行工具,主要用于查看和调整Java虚拟机(JVM)的配置参数和系统属性。以下是关于如何使用jinfo的详细指南:

基本语法

jinfo的基本语法如下:

jinfo [options] <pid>

其中,<pid>是Java进程的进程ID(Process ID),用于指定要操作的JVM实例。

常用选项

  • -flag <name>:打印指定JVM参数的值。
  • -flag [+|-]<name>:启用或禁用指定的布尔类型JVM参数。
  • -flag <name>=<value>:设置指定JVM参数的值。
  • -flags:打印传递给JVM的所有命令行参数。
  • -sysprops:以键值对形式打印Java系统属性。
  • -h-help:打印帮助信息。

使用示例

  1. 查看JVM配置信息

    假设有一个Java进程的进程ID为1234,你可以使用以下命令查看该进程的JVM配置信息:

    jinfo 1234
    

    如果不指定任何选项,jinfo将打印出该JVM实例的所有配置参数和系统属性。

  2. 查看特定JVM参数的值

    如果你只对某个特定的JVM参数感兴趣,比如最大堆内存(-Xmx),但不确定它是否被设置以及设置的值是多少,你可以使用-flag选项来查看:

    jinfo -flag MaxHeapSize 1234
    

    注意:MaxHeapSize可能不是直接可用的参数名,这里仅作为示例。实际上,你可能需要查看如-Xmx这样的参数,但jinfo通常不直接显示-Xmx的值,因为它是一个启动参数。不过,你可以通过-flags选项来查看所有启动参数。

  3. 启用或禁用布尔类型JVM参数

    对于布尔类型的JVM参数,你可以使用-flag [+|-]<name>来启用或禁用它。例如,要启用简单GC日志模式(如果它支持的话),你可以尝试(但请注意,并非所有参数都支持这种方式):

    jinfo -flag+PrintGC 1234
    

    禁用则使用-

    jinfo -flag-PrintGC 1234
    

    但请注意,并非所有JVM参数都支持在运行时启用或禁用。

  4. 设置JVM参数的值

    对于某些JVM参数,你可以使用-flag <name>=<value>来设置其值。但同样地,这取决于参数是否支持在运行时修改。例如,尝试修改空闲堆空间的最小百分比(如果支持的话):

    jinfo -flag MinHeapFreeRatio=30 1234
    

    但请注意,并非所有参数都可以这样修改。

  5. 查看Java系统属性

    使用-sysprops选项可以以键值对形式打印Java系统属性:

    jinfo -sysprops 1234
    

注意事项

  • 并非所有JVM参数都支持在运行时查看或修改。
  • 修改JVM参数可能会对应用程序的性能和稳定性产生影响,因此请谨慎操作。
  • 在使用jinfo之前,请确保你有足够的权限来访问目标Java进程。
  • jinfo是JDK自带的一个工具,因此你不需要单独安装它。只需确保你的系统已经安装了JDK,并且jinfo命令的路径已经添加到了系统的PATH环境变量中。

如何使用jmap

jmap是一个功能强大的Java命令行工具,用于生成Java进程的内存映像,显示Java堆中对象的详细情况,以及执行其他与内存相关的诊断任务。以下是如何使用jmap的详细步骤和说明:

基本用法

jmap的基本命令格式如下:

jmap [option] pid
  • option:可选参数,用于指定jmap的行为。
  • pid:Java进程的进程ID(Process ID),表示要对哪个Java进程执行jmap命令。

常用选项

  1. -dump:生成Java堆转储快照。可以使用-dump:format=b,file=指定生成文件的格式(默认为二进制格式)和路径。

    • 示例:jmap -dump:format=b,file=heapdump.bin 1234,这将为进程ID为1234的Java进程生成一个名为heapdump.bin的堆转储文件。
  2. -heap:打印堆的概要信息,包括最大堆大小、堆的配置参数、各代的使用情况等。

    • 示例:jmap -heap 1234,这将显示进程ID为1234的Java进程的堆内存详细信息。
  3. -histo:打印堆中各个类的实例统计信息,包括实例数量和占用内存大小。可选参数:live只显示活动对象。

    • 示例:jmap -histo 1234jmap -histo:live 1234,这将显示进程ID为1234的Java堆中对象的统计信息。
  4. -finalizerinfo:打印处于等待Finalizer线程执行finalize方法的对象的信息。

    • 示例:jmap -finalizerinfo 1234,这将显示进程ID为1234的Java进程中等待Finalizer线程执行的对象信息。
  5. -clstats:打印类加载器的统计信息,包括加载类的数量和占用内存大小。

    • 示例:jmap -clstats 1234,这将显示进程ID为1234的Java进程中类加载器的统计信息。
  6. -F:在使用-dump参数时,如果进程没有响应,可以使用-F参数强制生成堆转储快照。

    • 示例:jmap -F -dump:format=b,file=heapdump_forced.bin 1234,这将尝试强制为进程ID为1234的Java进程生成堆转储文件。

注意事项

  1. 权限要求:使用jmap命令时,需要具有对应Java进程的权限。如果没有足够的权限,命令可能会失败。
  2. 对生产环境的影响:在生产环境中使用jmap命令时,应谨慎操作,以免对系统正常运行造成影响。特别是生成堆转储文件时,可能会占用大量磁盘空间。
  3. 文件命名和存放路径:在生成堆转储文件时,应注意文件的命名和存放路径,以便于后续的分析和管理。
  4. Java JDK安装:确保已经安装了Java JDK,并且jmap命令的路径已正确配置在系统的PATH环境变量中,以便在命令行中直接调用。

总结

jmap是Java开发和系统管理中用于内存分析和问题排查的重要工具。通过合理使用jmap命令及其选项,可以深入了解Java进程的内存使用情况,帮助开发人员和系统管理员优化内存使用、排查内存泄漏等问题。

如何使用jstack

jstack命令是Java开发工具包(JDK)中的一个重要工具,用于生成Java应用程序的线程堆栈跟踪信息。这对于分析Java程序中的线程问题,如死锁、线程阻塞等,非常有帮助。以下是使用jstack命令的详细步骤和说明:

1. 查找Java进程的进程ID(PID)

在使用jstack命令之前,首先需要找到目标Java进程的PID。这可以通过多种命令实现,如psjps等。

  • 使用ps命令:在Linux系统中,可以通过ps -ef | grep java命令查找所有Java进程的详细信息,并通过grep过滤出目标进程。
  • 使用jps命令:jps是JDK提供的一个专门用于列出当前Java进程信息的命令,它更直接地列出了Java进程的PID和主类名(或JAR文件名)。

2. 使用jstack命令

找到目标Java进程的PID后,就可以使用jstack命令来生成线程堆栈跟踪信息了。

  • 基本用法:在命令行中输入jstack PID,将PID替换为目标Java进程的进程ID。例如,如果目标Java进程的PID为12345,则命令为jstack 12345
  • 输出内容:执行命令后,jstack会输出该进程中所有线程的堆栈跟踪信息,包括线程ID、线程状态、线程优先级、调用堆栈等。这些信息对于分析线程问题非常有用。

3. 分析输出结果

jstack命令的输出结果包含了丰富的线程信息,通过分析这些信息,可以了解每个线程的执行状态、调用关系以及可能存在的问题。

  • 线程状态:Java线程的状态包括RUNNABLE、BLOCKED、WAITING、TIMED_WAITING等。通过分析线程状态,可以判断线程是否处于正常执行状态,或者是否存在阻塞、等待等问题。
  • 调用堆栈:调用堆栈显示了线程执行时的函数调用序列。通过分析调用堆栈,可以了解线程在特定时刻的执行路径,以及导致线程问题的原因。
  • 死锁检测:如果Java应用程序中存在死锁问题,jstack命令的输出结果会包含相关的线程信息和锁信息。通过分析这些信息,可以定位死锁的原因,并采取相应的措施解决死锁问题。

4. 常用选项

jstack命令还支持一些常用选项,以提供不同的输出格式或行为。

  • -F:当Java进程没有响应时,强制生成堆栈转储。这个选项可能会导致Java进程不稳定,因此应谨慎使用。
  • -l:长格式显示堆栈转储,包括线程锁的拥有者和等待队列信息。
  • -m:混合模式显示堆栈转储,包括Java和本地线程的堆栈信息。
  • -h--help:显示帮助信息,列出所有可用的选项和它们的说明。

5. 注意事项

  • 权限问题:jstack命令需要对目标Java进程有读取内存和线程信息的权限。在某些系统上,可能需要以root用户身份运行jstack命令。
  • 稳定性问题:在某些情况下,jstack命令可能会对目标Java进程产生一定的影响,特别是在使用-F选项时。因此,建议在非生产环境中使用jstack命令,并尽量避免在生产环境中频繁使用。
  • 准确性问题:虽然jstack命令是分析Java线程问题的有力工具,但其输出结果也可能受到Java虚拟机(JVM)内部实现和优化的影响。因此,在分析jstack命令的输出结果时,需要综合考虑多种因素,以确保分析的准确性。

如何使用jstat

jstat(Java Virtual Machine Statistics Monitoring Tool)是一个用于监控基于HotSpot的JVM中资源消耗和性能表现的工具。它主要通过JVM内建的指令来实时地监控Java应用程序的资源和性能。以下是使用jstat的基本步骤和常用选项:

1. 基本命令格式

jstat [ generalOption | outputOptions ] vmid [interval [s|ms]] [count]
  • generalOption:简单的通用命令行选项,如-help、-options、-version等。
  • outputOptions:一个或多个由statOption组成的输出选项,以及任何-t、-h和-J选项。
  • vmid:虚拟机标识符,表示目标JVM的字符串,通常是Java进程的PID。
  • interval:采样间隔,单位为秒(s)或毫秒(ms),默认是毫秒。
  • count:要显示的样本数量,默认值是无穷大,即持续显示直到JVM停止或jstat命令被终止。

2. 常用选项

  • -class:显示有关类加载器行为的统计信息。
  • -compiler:显示有关Java HotSpot VM即时编译器行为的统计信息。
  • -gc:显示有关垃圾回收堆的行为的统计信息。
  • -gccapacity:显示各个垃圾回收代容量(young, old, perm/metaspace)及其空间统计信息。
  • -gccause:显示垃圾收集统计信息的摘要,以及最近两次垃圾回收事件的原因。
  • -gcnew:显示新生代行为的统计信息。
  • -gcnewcapacity:显示新生代及其空间大小的统计信息。
  • -gcold:显示老年代和metaspace的统计信息(JDK 1.8及以后版本)。
  • -gcoldcapacity:显示老年代容量的使用情况。
  • -gcmetacapacity:显示metaspace的大小和使用情况(JDK 1.8及以后版本)。
  • -gcutil:显示关于垃圾收集统计信息的摘要。
  • -printcompilation:显示Java HotSpot VM编译方法统计信息。

3. 示例命令

  • 查看垃圾收集统计信息

    jstat -gcutil 6483 250 7
    

    这条命令会查看PID为6483的Java进程,以250毫秒的间隔取7个样本,并显示垃圾收集统计信息。包括各个堆空间的使用百分比、新生代和老年代GC的次数和时间等。

  • 显示新生代行为的统计信息

    jstat -gcnew 836 250
    

    这条命令会显示PID为836的Java进程,以250毫秒为时间间隔,统计新生代的行为。包括各个Survivor空间、Eden空间的大小和使用情况,以及新生代GC的次数和时间。

  • 显示老年代和永久代(或Metaspace)的统计信息

    jstat -gcold 5856 500 3
    

    对于JDK 1.8之前的版本,这条命令会显示老年代和永久代的统计信息;对于JDK 1.8及以后版本,会显示老年代和Metaspace的统计信息。这里以500毫秒为间隔打印3次。

4. 其他选项

  • -t:在输出信息前面加上时间戳,显示程序运行的时间。
  • -h:在周期性输出数据时,指定在输出多少行数据后,跟着输出一次表头信息。
  • -J:将选项传递给java程序,例如-J-Xms48m将启动内存设置为48MB。

5. 注意事项

  • 确保jstat命令在你的系统路径中,或者你需要提供完整的路径来执行它。
  • jstat命令可能不适用于所有Java版本或所有类型的JVM实现。
  • 使用jstat时,请确保你有足够的权限来访问目标JVM进程。

通过上述步骤和示例,你应该能够开始使用jstat来监控Java应用程序的性能和资源使用情况。

如何使用jhat

jhat(Java Heap Analysis Tool)是一个用于分析Java堆转储(heap dump)文件的命令行工具,它允许用户通过浏览器查看堆转储中的对象、类、引用关系等信息,帮助诊断内存泄漏、对象占用、类分布等问题。以下是使用jhat的详细步骤:

1. 生成堆转储文件

首先,需要有一个Java堆转储文件。这可以通过多种方式生成,但最常用的方法是使用jmap命令。例如,可以使用以下命令为指定Java进程生成堆转储文件:

jmap -dump:format=b,file=heapdump.hprof <PID>

其中,<PID>是目标Java进程的进程ID。执行该命令后,将在当前目录下生成一个名为heapdump.hprof的堆转储文件。

2. 使用jhat分析堆转储文件

一旦获得了堆转储文件,就可以使用jhat命令来分析了。假设堆转储文件名为heapdump.hprof,可以使用以下命令启动jhat:

jhat heapdump.hprof

执行上述命令后,jhat会启动一个内置的HTTP服务器,分析堆转储文件,并将结果以HTML形式展示。默认情况下,服务器会在本地主机的7000端口上运行。但也可以通过-port参数指定其他端口号,例如:

jhat -port 8080 heapdump.hprof

3. 浏览分析结果

启动jhat后,打开浏览器,访问http://localhost:7000(如果你没有指定端口,则使用默认端口7000;如果指定了其他端口,则相应修改URL中的端口号)。在浏览器中,你将看到jhat提供的堆分析界面,可以浏览以下信息:

  • 类摘要:显示堆中所有类的统计信息,如实例数量、占用内存等。
  • 对象查询:允许你根据对象的类名、哈希码等条件查询对象信息。
  • 引用查询:可以查询对象的引用链,帮助理解对象之间的关系。
  • 类直方图:以图形化的方式展示堆中类的分布情况。
    通过这些信息,你可以深入分析Java应用的内存使用情况,定位内存泄漏、优化内存使用等。

注意事项

  • 权限问题:确保你有足够的权限来访问目标Java进程和堆转储文件。
  • 内存和性能:分析大型堆转储文件可能需要大量的内存和计算资源。确保你的系统有足够的资源来支持jhat的运行。
  • 安全性:在生产环境中使用jhat时,请注意不要暴露敏感信息,如服务器IP地址和端口号。

通过以上步骤,你应该能够成功使用jhat来分析Java堆转储文件,并获取有关Java应用内存使用的详细信息。

如何使用jdeps

jdeps是Java Development Kit (JDK)中的一个命令行工具,用于分析和检查Java类的依赖关系。它可以帮助开发者理解和管理Java应用程序或库的依赖关系,以及检查其是否符合模块化编程的要求。以下是使用jdeps的基本步骤和常用选项:

1. 确保JDK已安装

首先,确保你的计算机上已经安装了JDK,并且jdeps命令可以在命令行中直接使用。通常,jdeps会随着JDK一起安装。

2. 打开命令行终端

在Windows上,你可以使用命令提示符(CMD)或PowerShell;在Linux或macOS上,你可以使用终端(Terminal)。

3. 导航到目标目录

使用cd命令导航到包含你想要分析的Java类文件或JAR文件的目录。

4. 使用jdeps命令

在命令行中输入jdeps命令及其参数来执行依赖分析。基本语法如下:

jdeps [options] <class or jar files>
  • [options]:可选参数,用于指定jdeps的行为,如输出格式、类路径等。
  • <class or jar files>:要分析的Java类文件或JAR文件的列表,可以使用通配符(如*.class*.jar)来指定多个文件。

5. 常用选项

  • -dotoutput <directory>:将依赖关系输出为DOT文件,这些文件可以使用Graphviz等工具进行可视化。
  • -verbose:class:显示详细的类级别依赖关系。
  • -classpath <path>-cp <path>:指定类路径,以便jdeps能够找到所需的类文件。
  • -s-summary:仅输出被依赖对象的概要信息。

6. 示例

假设你有一个名为MyApp.jar的JAR文件,并希望查看其依赖关系,你可以使用以下命令:

jdeps -cp . MyApp.jar

这个命令会分析MyApp.jar文件,并显示其依赖关系。如果你还希望将依赖关系输出为DOT文件以便可视化,可以这样做:

jdeps -dotoutput ./dot_output -cp . MyApp.jar

执行后,jdeps会在./dot_output目录下生成一系列DOT文件,每个文件代表一个类及其依赖关系。

7. 注意事项

  • 在使用jdeps命令时,请确保你的JDK版本支持该命令(JDK 8及以上版本)。
  • 对于大型项目或复杂的依赖关系,jdeps可能需要较长时间来分析和生成报告。
  • 生成的依赖关系报告应结合实际情况进行判断和分析,以便更好地理解和优化你的项目。

通过以上步骤,你应该能够使用jdeps命令来分析和检查Java类的依赖关系了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问道飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值