【jvm系列-11】jvm性能调优篇---命令行工具的基本使用

news2024/10/7 9:21:18

JVM系列整体栏目


内容链接地址
【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460
【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963
【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈https://blog.csdn.net/zhenghuishengq/article/details/129684076
【四】运行时数据区共享区域之堆、逃逸分析https://blog.csdn.net/zhenghuishengq/article/details/129796509
【五】运行时数据区共享区域之方法区、常量池https://blog.csdn.net/zhenghuishengq/article/details/129958466
【六】对象实例化、内存布局和访问定位https://blog.csdn.net/zhenghuishengq/article/details/130057210
【七】执行引擎,解释器、JIT即时编译器https://blog.csdn.net/zhenghuishengq/article/details/130088553
【八】精通String字符串底层机制https://blog.csdn.net/zhenghuishengq/article/details/130154453
【九】垃圾回收底层原理和算法以及JProfiler的基本使用https://blog.csdn.net/zhenghuishengq/article/details/130261481
【十】垃圾回收器的种类以及内部的执行原理https://blog.csdn.net/zhenghuishengq/article/details/130261481
【十一】jvm性能调优篇之命令行工具的基本使用https://blog.csdn.net/zhenghuishengq/article/details/130641456

初始jvm调优命令行工具的基本使用

  • 一,JVM监控调优工具
    • 1,jvm调优篇概述
      • 1.1,生产环境中可能出现的问题
      • 1.2,性能优化的步骤
      • 1.3,性能测试指标
    • 2,JVM监控工具
      • 2.1,JPS
      • 2.2,jstat(重点)
      • 2.3,Jinfo
      • 2.4,jmap
      • 2.5,jhat
      • 2.6,jstack(重点)
      • 2.7,jcmd

一,JVM监控调优工具

从本文开始,正式进入jvm性能调优篇阶段

1,jvm调优篇概述

1.1,生产环境中可能出现的问题

  • 生产环境中发生了内存泄漏该如何处理?
  • 生产环境中该给服务器分配多少内存合适?
  • 如何对垃圾回收器的性能进行调优?
  • 生产环境中的CPU负载飙高该如何解决?
  • 生产环境应该给引用分配多少内存?
  • 不加日志,如何确定是否执行了某一行代码?
  • 不加日志,如何实时的查看某个方法的入参和返回值?

因此需要通过调优,来解决这些问题:防止出现OOM、解决OOM、减少Full GC出现的频率

1.2,性能优化的步骤

1,性能监控(发现问题): 通过一些监控工具来发现问题,然后对产生的问题的内容进行调优,一般可能出现的问题有:GC频繁、CPUload过高、OOM、内存泄漏、死锁、程序响应的时间较长等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKCtwiCa-1683872329325)(img/1682480566070.png)]

2,性能分析(排查问题): 可以通过GCviewer堆日志进行分析;也可以运用一些命令行工具,如jstack、jmap、jinfo等分析;也可以通过dump出堆文件,然后使用内存分析工具分析文件;或者直接AkiraArthas,或者jconsoleJViaual来查看实时的JVM状态;或者直接使用jstack查看堆栈信息

3,性能调优(解决问题): 适当的增加内存;优化代码;增加机器;合理的设置线程池线程数量;增加消息中间件,缓存、消息队列等。

1.3,性能测试指标

主要从以下面的几个参数就行分析

1,停顿时间: 提交请求和返回请求响应之间的时间,一般比较关注的是平均时间

2,吞吐量: 单位时间内完成的工作量

3,并发数: 同一时刻,对服务器有实际交互的请求数

4,内存占用: Java堆区所占的内存大小

在调优中,停顿时间和吞吐量是主要关注点。

2,JVM监控工具

2.1,JPS

Java Process Status,表示java进程的状态。通过这个命令,可以显示指定系统内所有的HotSpot虚拟机进程,可用于查询正在运行的虚拟机线程。

[root@VM-12-3-centos study]# jps
27586 Jps
29658 jar

除了使用这个jps查看,也可以在jps后面加上以下参数,分别是-l-q-m-v ,日常开发中,基本上很少用这些参数,当然,这些参数除了可以单独使用之外,还可以结合使用。

//输出应用程序主类的全名称
[root@VM-12-3-centos study]# jps -l
29658 study-0.0.1-SNAPSHOT.jar
30190 sun.tools.jps.Jps
//只能够看到进程id
[root@VM-12-3-centos study]# jps -q
29658
30190
//查看进程id以及mian方法中参数信息
[root@VM-12-3-centos study]# jps -m
29658 jar
3437 Jps -m
//列出虚拟机启动时的JVM参数
[root@VM-12-3-centos study]# jps -v
29658 study-0.0.1-SNAPSHOT.jar
30190 sun.tools.jps.Jps

随后也可以通过以下的命令查看对应的进程号的详情

ps -ef | grep 29658
ps -aux | grep 29658

如果在进程中,使用了 -XX:-UsePerfData 这个参数 ,那么jps将无法查看此进程的信息,同时也说明这个参数是默认开启的。

2.2,jstat(重点)

Jvm Statistics Monitoring Tool ,表示监视虚拟机运行状态的信息。他可以显示本地或者远程虚拟机进程中类加载、内存、垃圾收集、JIT即时编译等运行数据,常用于检测垃圾回收问题和内存泄漏问题。

输入这个jstat这个命令之后,可以查看到如何使用以及可加的参数。

[root@VM-12-3-centos study]# jstat
invalid argument count
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
       //<option> : 只要监视的对象信息,如class
       //-t:程序执行的总时间,显示在head头部的Timestamp中
       //-h:多少周期打印一次表头信息
       //<interval> : 周期,比如多长时间打印一次
       //<count> : 打印的总次数,默认只查询一次

这个option可以是很多选择的对象,这里以 class 为例,主要用于显示类加载的相关信息。这里表示的就是监视的是class对象,加了-t就会在前面通过这个Timestamp显示一个运行了多长时间,-h3表示每隔3个就会打印一次头部信息,接着的就是进程号,接着的就是1000 5,表示每间隔1秒打印一次,总共打印5次。

[root@VM-12-3-centos study]# jstat -class -t -h3 29658 1000 5
Timestamp     Loaded    Bytes    Unloaded    Bytes      Time   
6913.2         10912   19626.3       0        0.0       6.44
6914.3         10912   19626.3       0        0.0       6.44
6915.3         10912   19626.3       0        0.0       6.44
Timestamp     Loaded    Bytes    Unloaded    Bytes      Time   
6916.3  	   10912   19626.3       0        0.0       6.44
6917.3  	   10912   19626.3       0        0.0       6.44

接下来对上面的各个参数做一个解释

//Timestamp:程序运行的总时间
//Loaded:加载的类的个数  //Bytes:加载类的字节数
//Unloaded:卸载的类的个数 //Bytes:卸载的类的字节数
//Time:加载的总体时间

上面这个option只用过了class,除了class之外,还可以使用垃圾回收相关的参数

  • -gc:显示GC相关的堆信息。如新生代老年代的容量、已用空间等
  • -gccapacity:显示的内容和-gc的基本一致,关注的内容是Java堆的各个区域使用到的最大、最小空间
  • -gcutil:显示内容与 -gc 基本一致,关注的内容是已使用空间占总空间的百分比
  • -gccause:与-gcutil功能一样,会额外输出导致最后一次或者当前发生gc的原因
  • -gcnew:显示新生代GC状况
  • -gcnewcapacity:与-gcnew基本相同,输出主要是关注使用到的最大空间和最小空间
  • -geold:显示老年代GC状况
  • -gcoldcapacity:显示的内容与-gcold基本相同,输出关注点是使用到的醉倒和最小空间
  • -gcpermcapacity:显示永久代使用到的最大空间

接下来可以通过这个命令分析GC相关的具体参数

jstat -gc 进程号id
[root@VM-12-3-centos ~]# jstat -gc 29658
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
1024.0 1024.0  0.0   480.3  15872.0   5225.1   80384.0    71941.6   59992.0 56814.9 7808.0 7262.8   3727   11.990   3      0.321   12.312

接下来对上面的参数做一个详细的解释

//上面的S表示survivor区,C表示已经使用的容量,U表示已经使用的容量
//E表示Eden区,O表示old区,M表示方法区,CCS表示压缩
//YGC表示Young Gc次数,YGCT表示YoungGC时间
//FGC表示Full Gc次数,FGCT表示Full GC时间
//GCT表示总GC的时间,这里指的是Young GC和Full Gc的和

这些依旧可以和参数搭配使用

jstat -gc -t -h3 29658 1000 5

其结果如下,和上面的class的现象是一样的

[root@VM-12-3-centos ~]# jstat -gc -t -h3 29658 1000 5
Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
        86023.0 1024.0 1024.0  0.0   368.3  15872.0   6335.5   80384.0    71965.6   59992.0 56814.9 7808.0 7262.8   3753   12.074   3      0.321   12.395
        86024.0 1024.0 1024.0  0.0   368.3  15872.0   6335.5   80384.0    71965.6   59992.0 56814.9 7808.0 7262.8   3753   12.074   3      0.321   12.395
        86025.0 1024.0 1024.0  0.0   368.3  15872.0   6337.5   80384.0    71965.6   59992.0 56814.9 7808.0 7262.8   3753   12.074   3      0.321   12.395
Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
        86026.0 1024.0 1024.0  0.0   368.3  15872.0   6337.5   80384.0    71965.6   59992.0 56814.9 7808.0 7262.8   3753   12.074   3      0.321   12.395
        86027.0 1024.0 1024.0  0.0   368.3  15872.0   6339.6   80384.0    71965.6   59992.0 56814.9 7808.0 7262.8   3753   12.074   3      0.321   12.395

因此在实际开发中,可以通过这个jstat来对内存进行监控。并且可以通过这个Java进程启动的时间(TimeStamp)比上GC时间(GCT),得出GC时间占总运行时间的比例,如果该比例超过20%,则说明堆的压力较大,如果比例超过90%,则说明堆里面几乎没有可用空间,随时都可能出现OOM。

2.3,Jinfo

Configuration Info for Java,查看虚拟机配置参数的信息,也可以用于调整虚拟机的配置参数。在很多情况下,Java应用程序不会指定所有的Java虚拟机参数,开发人员可能不知道某一个具体参数的默认值,因此可以直接通过这个jinfo工具,开发人员可以很方便的找到java虚拟机参数的当前值。

jinfo的基本使用如下:

[root@VM-12-3-centos study]# jinfo --help
Usage:
   jinfo [option] <pid>
       (to connect to running process)
   jinfo [option] <executable <core>
       (to connect to a core file)
   jinfo [option] [server_id@]<remote server IP or hostname>
       (to connect to remote debug server)

where <option> is one of:
   -flag <name>         to print the value of the named VM flag
   -flag [+|-]<name>    to enable or disable the named VM flag
   -flag <name>=<value> to set the named VM flag to the given value
   -flags               to print VM flags
   -sysprops            to print Java system properties
   <no option>          to print both of the above
   -h | -help           to print this help message

在jinfo中,主要可以用来查看和修改配置参数,查看的具体命令可以如下

jinfo -flags PID  //查看一些曾经赋值过的一些参数
jinfo -flags 具体参数 PID  //查看某个java进程的一些参数的值
jinfo -flags UseParallel 29658  //查看当前进程是否用的是Parallel垃圾回收器

也可以修改参数,修改的具体命令如下

jinfo -flag 具体参数 PID
jinfo -flag PrintGcDetails 29658  //修改这个打印GC日志的状态,默认不打印,修改后为打印

2.4,jmap

JVM Memory Map,导出内存映像文件,显示内存的使用情况。 获取dump文件,同时也可以获取到Java进程的内存相关信息,如一些堆各个区域的使用情况,堆对象的统计信息,类加载信息等。可以通过jmap -help查看相关指令

[root@VM-12-3-centos ~]# jmap -help
Usage:
    jmap [option] <pid>(to connect to running process)
    jmap [option] <executable <core>(to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>(to connect to remote debug server)

jmap可以通过 -dump 生成Java堆转储快照dump文件,-dump:live只保存堆中存活的对象。可以通过该文件查看具体是什么原因导致的堆溢出,内存泄漏等问题。可以通过手动的方式生成,如下

jmap -dump:format=b,file=zhs.hprof  29658
jmap -dump:live:format=b,file=../zhs.hprof  29658    //只保存那一刻的存活对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cn7UOInD-1683872329326)(img/1682670110211.png)]

也可以通过自动的方式生成,会在系统即将要OOM的时候自动生成一个dump文件,其指令如下

-Xmx100m -XX:HeapDumpOnOutOfMemoryError -XX:heapDumpPath=zhs.hprof

可以通过 -heap 输出整个堆空间的详细信息,包括GC的使用,堆配置信息,以及内存的使用信息等,挺好用的

jmap -heap 29658

可以通过 -histo 输出堆对象中的统计信息,包括一些类、实例数量和总容量等

jmap -histo 29658
jmap -histo:live 29658   //只统计堆中存活的对象

可以通过-finalizerinfo 显示需要被回收的对象信息,但是该命令只在Linux下有效

jmap -finalizerinfo 29658  

总结: 由于jmap将访问堆中的对象,为了保证在此过程中不被打扰,jmap需要在安全点机制访问,即stw的时候访问数据,因此可能导致对快照的分析结果存在偏差。并且如果一直无法stw,那么jmap将一直等下去。相对于jstat而言,jstat是实时监控的,这方面的准确度比jmap高。

2.5,jhat

JVM Heap Analysts Tool ,显而易见,从这几个单词来看就是用来分析堆内存的工具。在jmap这个工具中,可以生成一个dump文件,而这个jhat就是为了配合这个jmap使用的。在jhat中,其内部内嵌了一个小型的服务器,生成dump文件的分析结果之后,用户可以在浏览器中查看分析结果。

使用了这个jhat命令,就相当于启动了一个http服务,访问地址为:localhost:7000。但是在JDK9,10之后已被删除,官方建议使用VisualVM图形化界面代替这个命令行工具。

2.6,jstack(重点)

jmap是用于打印堆空间的快照,这个jstack就是用于打印这个栈帧中的快照了。JVM StackTrace ,用于生成指定进程当前时刻的线程快照。线程快照指的就是虚拟机内每一条线程正在执行方法堆栈的集合。

生成线程快照的主要作用如下:可以用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待,阻塞等问题。

其基本语法如下:

[root@VM-12-3-centos study]# jstack 
Usage:
    jstack [-l] <pid>(to connect to running process)
    jstack -F [-m] [-l] <pid>(to connect to a hung process)
    jstack [-m] [-l] <executable> <core>(to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>(to connect to a remote debug server)

Options:
    -F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

接下来继续体验一下,直接通过这个jstack -pid

[root@VM-12-3-centos study]# jstack 29658
"C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f0790141000 nid=0x73e3 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f079013e000 nid=0x73e2 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
...

如下面模拟一段死锁问题,其代码如下

package com.zhs.study.test;

/**
 * @author zhenghuisheng
 * @date : 2023/5/12
 */
public class DeadBlockTest {
    public static void main(String[] args) {
        StringBuilder s1 = new StringBuilder();
        StringBuilder s2= new StringBuilder();
        new Thread(){
            @Override
            public void run() {
                synchronized (s1){
                    s1.append("a");
                    s1.append("b");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (s2){
                        s2.append("c");
                        s2.append("d");
                    }
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                synchronized (s2){
                    s1.append("a");
                    s1.append("b");
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (s1){
                        s2.append("c");
                        s2.append("d");
                    }
                }
            }
        }.start();
    }
}

运行上面的这一段代码之后,再通过jps获取其jvm对应的进程号,再通过jstack + 进程号即可,如我这边通过输入jps查到的进程号为12308,然后直接 jstack 12308 即可获取死锁等问题。

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x000000001ce7f608 (object 0x000000076b5b6a28, a java.lang.StringBuilder),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000001ce7cd78 (object 0x000000076b5b6a70, a java.lang.StringBuilder),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.zhs.study.test.DeadBlockTest$2.run(DeadBlockTest.java:42)
        - waiting to lock <0x000000076b5b6a28> (a java.lang.StringBuilder)
        - locked <0x000000076b5b6a70> (a java.lang.StringBuilder)
"Thread-0":
        at com.zhs.study.test.DeadBlockTest$1.run(DeadBlockTest.java:23)
        - waiting to lock <0x000000076b5b6a70> (a java.lang.StringBuilder)
        - locked <0x000000076b5b6a28> (a java.lang.StringBuilder)

Found 1 deadlock.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vn3KpHau-1683872329327)(img/1683866732686.png)]

除了死锁,其他的sleep长时间等待等等,也能查看得到。

2.7,jcmd

在jdk7之后,新增了一个命令行工具jcmd,可以实现除了jstat之外的所有命令,如导出堆、内存使用、查看java进程、导出线程信息、执行GC、jvm运行时间等。并且更加推荐jcmd代替jmap的使用。

可以通过 jcmd -l 获取所有的jvm的进程,jcmd pid help 查看指定线程所支持的所有命令,可以通过这个jcmd pid 具体命令 来显示指定进程的指令命令的数据。

可以先通过这个help命令查看有哪些命令可以执行

jcmd 1744 help

其执行结果如下

C:\Users\p'v>jcmd 1744 help
1744:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help

再通过查出来的命令来查看对应命令的数据

// 打印线程信息
jcmd 1744 Thread.print
// 查看gc的内存信息
jcmd 1744 GC.class_histogram
// 生成GC的dump文件
jcmd 1744 GC.heap_dump d:\\a.hprof
...

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

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

相关文章

智能优化算法——下山单纯型算法

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、算法流程1. 反射2. 膨胀…

马哈鱼SQLFLow数据流生成介绍

马哈鱼数据血缘分析器是当前最流行的数据血缘关系(data lineage)管理工具之一&#xff0c;它是一种通过分析SQL脚本来自动发现数据流向的工具。它通过生成一个简洁的图表来显示数据仓库中表/视图和列之间的数据流。支持超过20种流行的数据库&#xff0c;包括 bigquery, couchba…

项目风险的4种应对策略及实施条件

面对威胁或可能给项目带来消极影响的风险&#xff0c;我们一般采用规避、转移、缓解和接受的应对策略。 一、风险规避 风险规避策略是指项目团队采取行动来消除威胁&#xff0c;或保护项目免受风险影响的应对策略&#xff0c;通常包括改变项目管理计划&#xff0c;以完全消除威…

super_数学知识(质数筛选和约数学习)lesson08易错题记录

文章目录 回文质数第n小的质数素数个数 回文质数 先上代码 #include<iostream> #include<vector>//创建动态数组需要的头文件 #include<cstring>//使用memset需要的头文件 using namespace std; vector<int> q; bool arr[10000005]; //埃氏筛法找出所…

详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼

目录 一.软件开发的生命周期总括 二.项目架构分类 C/S架构 B/S架构 三.详解软件需求 需求分类 需求获取 需求分析 四.详解面向对象分析&#xff08;OOA&#xff09; 概念理解&#xff1a; 统⼀建模语⾔UML UML的重要组成部分&#xff1a; ⽤例图的元素 识别参与者…

怎么搭建个人小型渲染农场?搭建渲染农场配置

渲染农场是众多机器组成的渲染集群&#xff0c;通常用来渲染你的单帧效果图或动画项目&#xff0c;我们借助渲染农场的力量&#xff0c;可以满足3D项目交期时间迫在眉睫的需求&#xff0c;当你试着在自己的机器上渲染一个复杂的动画项目时&#xff0c;可能需要几十小时的等待时…

gdb与symbol符号表文件的调试

目录 1&#xff0c;剥离命令 2&#xff0c;gdbdebug 文件的调试 今天在调试程序的时候发现&#xff0c;在测试部测试的程序都是剥离了符号表的&#xff0c;导致用gdb无法调试&#xff0c;只有找到符号表文件才能继续gdb调试&#xff0c;好在符号表文件是和程序一起发布的。之…

浅谈作为程序员如何写好文档:了解读者

我作为从一名懵懂的实习生转变为工程师的工作经历中&#xff0c;伴随着技术经验的成长&#xff0c;也逐渐意识到了编写文档是知识和经验传递给其他人的最有效方式。通过文档&#xff0c;可以分享我的技术知识和最佳实践&#xff0c;使其他人更好地理解我的工作。在这里&#xf…

Postgres : 创建schema、创建表空间与指定用户权限

1. 创建新的Schema 要创建 PostgreSQL 中的一个新的 schema&#xff0c;并创建一个只有该 schema 权限的新用户&#xff0c;请按照以下步骤操作&#xff1a; &#xff08;1&#xff09;打开 PostgreSQL 客户端并连接到数据库服务器。 &#xff08;2&#xff09;创建一个新的…

如何在Oracle存储过程发生异常时获取out类型参数的值

Oracle存储过程关于在出现&#xff08;自定义/自带&#xff09;异常下out类型参数的获取问题的分析 ✈️ 场景: 有一些关于金额和时间的精确且量大的计算需要在存储过程中完成。存储过程中有一些自定义的异常。并且将在RAISE前通过out类型的参数将详细的异常原因返回。 但是在…

商业智能BI分析报表很慢是什么原因?应该如何优化?

当下&#xff0c;数据计算已成为了分析工作中必不可少的高频次操作之一&#xff0c;而且在大数据的发展背景下&#xff0c;应用性能往往关系着项目的成败&#xff0c;成为了大家最为关注的产品技术参数。那么我们先来分析一下BI分析表计算很慢的原因是什么&#xff0c;再对症下…

Microsoft Dynamics 365 Business Central 生产订单扣料的几种方法

学习目标&#xff1a; 掌握生产订单扣料的几种方法 学习内容&#xff1a; Forward flush by routing operation&#xff08;通过工序&#xff1a;向前扣料&#xff09;Backward flush by routing operation&#xff08;通过工序&#xff1a;向后扣料&#xff09;Forward flus…

Java-Redis持久化之RDB操作

Java-Redis持久化之RDB操作 1.为什么redis需要持久化&#xff1f;2.什么是RDB操作?3.请你用自己的话讲下RDB的过程?4.如何恢复rdb文件? 1.为什么redis需要持久化&#xff1f; Redis是内存数据库&#xff0c;如果不将内存数据库保存到磁盘&#xff0c;那么服务器进程退出&am…

匿名对象的特性和使用场景你知道吗?

目录 一、匿名对象的概念 二、单参数和多参数构造场景的匿名对象 ①只有一个参数的构造函数 ②多个参数的构造函数 三、使用匿名对象作为函数的参数的缺省值 四、只为调用类中的一个函数时 五、匿名对象的特性 1、匿名对象的生命周期只有一行 2、匿名对象具有常性 3、当匿…

今天去面一个点工,HR要我会数据库,Linux还有Python,这合理吗?

软件测试出路在哪&#xff1f; 业务编程&#xff01;&#xff01; 1、软件测试的变化趋势 变化趋势1&#xff1a; 功能测试是核心&#xff0c;但是价值降低 目前测试这个行业&#xff0c;还是有大量的点工。但是行业的进步&#xff0c;技术的创新&#xff0c;导致了企业的需求…

不用下载的网页版Axure在这里

作为一名产品经理&#xff0c;你一定需要一款能够帮助你更好更快地制作原型&#xff0c;更方便地和团队协作的软件。网页版Axure工具替代即时设计无需下载激活&#xff0c;就可免费使用。那么&#xff0c;Axure网页版工具替代即时设计是如何进行的呢&#xff1f; 首先&#xf…

【数据结构】双向带头循环链表

文章目录 一、什么是带头双向循环链表二、带头双向循环链表的实现&#xff08;一&#xff09;链表中结构体的声明&#xff08;二&#xff09;头节点的创建&#xff08;链表的初始化&#xff09;&#xff08;三&#xff09;新节点的创建&#xff08;四&#xff09;链表的尾插&am…

( 位运算 ) 231. 2 的幂 ——【Leetcode每日一题】

❓231. 2 的幂 难度&#xff1a;简单 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2 x n 2^x n2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&…

软考高级架构师笔记1-计算机硬件

目录 1. 前言 & 更新2. CPU组成3. CPU的指令集:4.存储器5. 总线1. 前言 & 更新 注意:绪论不考,直接略过。 计算机硬件章节19-21年没考过,在22年真题考过磁盘调度,根据趋势分析,以后考的概率也不大,了解即可。 本节删掉了第一版中的编码、海明码等内容。 2. CP…

一篇文章搞定《Android异常处理》

------《Android异常处理》 异常种类&#xff08;简述&#xff09;编译时异常运行时异常 运行时的异常和崩溃受检时的异常第一种做法&#xff1a;第二种做法&#xff1a; 不受检时的异常(崩溃Crash)异常的传播崩溃的兜底Looper 循环问题主流程抛出异常问题 安全气囊的实现方案设…