Linux:查询当前进程或线程的资源使用情况
目录
在工作中,我们排除app出现的一些性能/资源问题时,通常要先知道当前app的资源使用情况,方能进一步思考改进措施。获取这些信息的途径有很多,我这里简单分享下两种:1)从proc文件系统;2)通过Linux 的API函数。
一、/proc/[PID]/下的各个文件
1、proc简介
/proc 目录是一个特殊的虚拟文件系统,它提供了对内核运行时信息的访问,包括进程、设备、网络、文件系统等各个方面的信息。它不是一个真正的文件系统,而是基于内核数据结构的一个接口,通过这个接口可以获取系统的运行时状态。
下面是 /proc 目录的一些重要子目录和关键内容的说明:
/proc/[PID]:此目录以进程的 ID(PID)命名,并包含与该进程有关的文件和目录,如之前所讲的 /proc/pid/目录。
/proc/cpuinfo:该文件包含有关 CPU(处理器)的信息,如厂商、型号、频率、缓存等。
/proc/meminfo:该文件包含有关系统内存的信息,如总内存、可用内存、缓存、交换分区等。
/proc/mounts:此文件列出了系统上已挂载的文件系统,包括文件系统类型、挂载点、挂载选项等信息。
/proc/net:此目录包含有关网络协议、接口和连接的信息,如 /proc/net/tcp、/proc/net/udp 等文件。
/proc/sys:此目录包含与内核参数和系统配置相关的文件。可以通过读写这些文件来修改内核的运行时行为。
/proc/version:该文件包含了当前正在运行的内核版本信息。
/proc/cmdline:此文件包含了系统引导时传递给内核的命令行参数。
/proc/uptime:该文件包含自系统开机以来的运行时间和空闲时间。
/proc/sys/kernel/hostname:此文件包含主机的名称(hostname)。
除了上述目录和文件,/proc 目录下还有很多其他文件和目录,涵盖了系统和进程的各个方面的信息。
需要注意的是,/proc 目录下的文件是动态生成的,信息在进程运行时改变。读取这些文件时,请确保有足够的权限,并理解每个文件的含义和用途。此外,不要轻易对 /proc 目录下的文件进行修改,因为这可能会导致系统不稳定或损坏。
2、/proc/[PID]/详解
arch_status:
该文件包含了有关进程所运行的指令集架构的信息
。例如,它可以显示进程在x86或ARM架构上运行。attr:
此目录包含与进程关联的文件、目录和进程的访问控制列表(ACL)信息。这些文件和目录的访问权限可以在这里进行管理和修改。
autogroup:
这个文件显示了进程是否被自动控制分组,以限制对CPU资源的访问。如果进程分配给自动控制分组,则该文件中的值为"1";否则,为"0"。
auxv:
此文件包含了进程的辅助向量信息,这些信息在加载动态链接器时向其传递参数。辅助向量为动态链接器提供有关进程环境和运行状态的信息。
cgroup:
该文件显示了进程所属的控制组(cgroup)的路径。控制组是一种组织和限制进程资源使用的方式。
cmdline:
该文件包含了启动进程时使用的命令行参数,以null字符分隔各个参数。可以通过读取该文件来获取进程的命令行参数信息。
comm:
进程的命令名可以通过这个文件获得。它可以是可执行文件名或进程自描述。
coredump_filter:
这个文件决定了进程在发生崩溃时生成核心转储(core dump)的内容。通过修改该文件的值,可以控制生成核心转储时包含的内容,这对于调试崩溃问题非常有用。可以使用 echo 命令将特定的值写入这个文件中,以修改核心转储的行为。
cpu_resctrl_groups:
这个文件是与 CPU 资源控制(Resource Control)相关的,用于管理进程对CPU资源的使用。通过这个文件,可以查询或配置进程关联的 CPU ResCtrl(CPU资源控制)组的信息。CPU资源控制是用于管理和限制进程对CPU资源的访问的一种技术,可以实现资源隔离、分配和监控。
cwd:
这是一个符号链接,指向进程的当前工作目录(current working directory)。
environ:
该文件包含了进程的环境变量,以null字符分隔各个环境变量。通过读取该文件,可以获取进程的环境变量信息。
cpuset:
这个文件包含了进程所属的 cpuset(CPU affinity)的信息,可以用于管理进程所能使用的 CPU 核心。 通过这个文件,可以查询或设置进程所在的 cpuset。
exe:
这是一个符号链接,指向进程正在执行的可执行文件。通过读取这个符号链接,可以获取进程当前正在执行的可执行文件的路径。
fdinfo:
这个目录包含了关于进程打开的文件描述符(file descriptor)的详细信息,如文件的偏移量(offset)等。
gid_map:
这个文件用于表示进程的实际组ID(GID)与其用户命名空间中的GID之间的映射关系。
io:
这个文件包含了有关进程的输入/输出统计信息,如读取和写入的字节数、I/O操作次数等。
limits:
这个文件包含了对进程资源限制的报告,显示了一些限制项目的值,比如内存限制、文件大小限制等。
loginuid:
这个文件记录了与进程关联的登录用户ID(login UID)。
map_files:
这个目录包含了进程打开的映射文件的相关信息,可以用于查询进程当前使用的文件映射情况。
fd:
此目录包含了进程打开的文件描述符(file descriptor)的符号链接。可以通过查看这些符号链接来获取进程打开的文件等信息。
maps:
该文件包含有关进程内存映射的信息,包括进程的内存地址范围、映射的文件等。
mounts:
此文件显示了进程的挂载点信息,包括进程当前挂载的各个文件系统的详细数据。
mem:
这个文件允许对进程的内存空间进行直接访问,可以用于调试、内存分析等目的。
mountinfo:
这个文件提供了有关进程所挂载的文件系统的详细信息,包括挂载点、挂载选项等。
mountstats:
此文件包含了有关挂载点的统计信息,如 I/O 统计等。
net:
目录包含了一系列与网络相关的文件和子目录,可以用于查询进程的网络连接、端口等信息。
ns:
这个目录包含了进程的各种命名空间相关的符号链接,可以用于查询和操作进程的命名空间。
numa_maps:
这个文件包含了有关进程内存使用和NUMA节点分布情况的信息,对于了解进程的NUMA相关性非常有用。
oom_adj:
这个文件包含了与进程的OOM(Out Of Memory)分级相关的信息,用于调整进程在内存不足情况下被系统杀死的优先级。
oom_score:
这个文件包含了进程的OOM分数,用于在系统内存不足时选择性地终止进程。
oom_score_adj:
与 oom_adj 类似,这个文件也用于调整进程在内存不足情况下被系统杀死的优先级。
pagemap:
这个文件提供了有关进程虚拟内存页面到物理内存帧的映射信息,对于内存管理方面的深入了解非常有用。
patch_state:
这个文件包含了有关进程的内核安全补丁状态的信息,通常用于安全审计和补丁管理。
personality:
这个文件包含了与进程的运行环境和虚拟机架构相关的信息,用于指定进程的特定行为。
projid_map:
在用户命名空间中使用的文件,用于表示进程实际项目ID(Project ID)与其用户命名空间中的项目ID之间的映射关系。
root:
这是一个符号链接,指向进程的根目录。
sched:
这个文件提供了与进程调度策略和优先级相关的信息,包括当前调度策略、优先级等。
schedstat:
这个文件包含了与进程调度统计相关的信息,如运行时间、等待时间等。
sessionid:
这个文件记录了与进程关联的会话ID。
setgroups:
这个文件包含了与进程的附加组(supplementary group)相关的信息。
smaps:
这个文件提供了详细的进程内存映射信息,包括每个内存区域的权限、大小、映射文件等。
smaps_rollup:
类似于 smaps 文件,但提供了按文件和库合并的内存映射信息,用于更简洁的内存分析。
stack:
这个文件记录了进程的当前栈的内容。
stat:
这个文件提供了与进程状态相关的信息,如进程ID、父进程ID、运行状态等。
statm:
这个文件提供了与进程内存使用量相关的信息,包括进程的总内存、共享内存、库内存、堆内存等。
status:
这个文件提供了有关进程的多种信息,包括进程状态、内存使用、文件描述符等。
syscall:
这个目录包含与进程相关的系统调用信息,可以用于跟踪和分析进程的系统调用。
task:
这个目录包含了进程的所有线程(task)的信息。
timens_offsets:
这个文件提供了与进程关联的时间命名空间偏移量的信息,用于跟踪进程的时间命名空间变化。
timers:
这个目录包含了与进程相关的定时器的信息,如定时器ID、时间值等。
timerslack_ns:
这个文件包含了与进程的定时器松弛值(timerslack)有关的信息,用于调整进程的定时行为。
uid_map:
这个文件用于表示进程的实际用户ID(UID)与其用户命名空间中的UID之间的映射关系。
wchan:
是一个用于描绘一个进程在等待什么的内核函数指针。它表示了进程当前正在等待的内核函数或系统调用。可用于调试和分析进程的等待状态。
这些文件和目录提供了关于特定进程的多种信息,如进程状态、资源使用情况、环境变量等,通常被用于性能调优、调试以及资源管理方面,对于普通用户来说可能并不经常需要直接操作这些文件。通过读取这些文件,可以了解并监视系统中各个进程的情况。请注意,有些文件是符号链接,需要使用readlink
或ls -l
等命令来获取其指向的真实路径。
知识补充:
命名空间(Namespace)在Linux系统中是一种用于隔离系统资源的机制。它允许在同一台物理机上创建多个隔离的环境,每个环境可以拥有自己独立的资源实例,例如进程ID、挂载点、网络、用户等。这种隔离使得不同的进程能够在同一系统上运行,而彼此之间互不干扰。
在Linux中,有多种类型的命名空间,包括但不限于以下几种:
PID 命名空间(PID Namespace):使得进程拥有自己独立的进程ID空间,进程在不同的PID命名空间中可以拥有相同的PID而不会相互影响。
挂载命名空间(Mount Namespace):使得进程拥有独立的文件系统挂载点,不同的挂载命名空间中可以有不同的文件系统视图。
网络命名空间(Network Namespace):允许每个命名空间中拥有独立的网络设备、IP地址等网络资源,实现网络隔离。
IPC 命名空间(IPC Namespace):用于隔离进程间通信资源,如消息队列和共享内存等。
UTS 命名空间(UTS Namespace):用于隔离系统标识,如主机名等。
用户命名空间(User Namespace):允许分配不同的用户和组ID给进程,从而实现用户隔离。
通过使用命名空间,容器技术得以实现,并且不同的容器可以在相互隔离的环境中运行,从而实现更高效的资源利用和更好的安全性。
二、通过Linux API获取当前进程或线程的资源使用情况
要获取当前进程或线程的资源使用情况,可以使用Linux提供的一些系统调用或API。以下是一些常用的方法:
1、getrusage
getrusage
是一个用于获取进程或线程的资源使用情况的系统调用函数,在 Linux 系统中的头文件 <sys/resource.h>
中定义。
#include <sys/time.h>
#include <sys/resource.h>
int getrusage(int who, struct rusage *usage);
参数who
用于指定获取资源使用情况的对象,包括以下两个选项:
- RUSAGE_SELF: 获取当前进程的资源使用情况。
- RUSAGE_CHILDREN: 获取当前进程创建的所有子进程的资源使用情况的汇总信息。
参数 usage
是一个指向 struct rusage 结构体的指针,用于存储获取到的资源使用情况信息。
//struct rusage 结构体包含了一系列字段,用于表示不同类型的资源使用情况
struct rusage {
struct timeval ru_utime; /* user CPU time used */
struct timeval ru_stime; /* system CPU time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims (soft page faults) */
long ru_majflt; /* page faults (hard page faults) */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* IPC messages sent */
long ru_msgrcv; /* IPC messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};
ru_utime
:用户级别的 CPU 时间(执行用户程序的时间)。ru_stime
:系统级别的 CPU 时间(执行系统调用的时间)。ru_maxrss
:进程最大的常驻内存大小(以 KB 为单位)。ru_ixrss
:进程的共享内存大小。ru_idrss
:进程的非共享数据段的大小。ru_isrss
:进程的栈大小。ru_minflt
:产生的次缺页错误(对不存在的内存页面发生的访问,需要从硬盘加载)。ru_majflt
:产生的主缺页错误(必须从硬盘加载数据)。ru_nswap
:发生的交换次数(从内存到磁盘或反之)。ru_inblock
:从块设备读取的次数。ru_oublock
:向块设备写入的次数。ru_msgsnd
:发送的消息数。ru_msgrcv
:接收的消息数。ru_nsignals
:发出的信号数。ru_nvcsw
:从等待状态唤醒的上下文切换次数(通过虚拟终端 I/O、文件系统路径名查找、等待 CPU 时间等方式)。ru_nivcsw
:无法满足进程需求而导致的上下文切换次数。
这些资源使用情况信息对于进程性能分析和系统监控非常有用。getrusage
函数返回的资源使用情况是关于当前进程或线程的信息。要获取其他进程的资源使用情况,需要使用相应的进程相关的系统调用(如 wait4
),并将返回的 rusage
结构体作为参数传递给 wait4
。
wait4
是一个用于等待子进程结束并获取其状态信息的系统调用函数。在 Linux 系统中的头文件 <sys/wait.h>
中定义。wait4
函数的原型为:
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
其中参数含义如下:
pid
:指定要等待的子进程的 ID。传入-1
表示等待任意子进程结束。status
:用于获取子进程的退出状态信息。options
:用于指定等待的选项,包括一些控制子进程状态获取行为的选项。rusage
:用于获取子进程的资源使用情况信息,即上一条回答中提到的struct rusage
结构体。
wait4
函数会阻塞父进程,直到指定的子进程结束。当子进程结束后,父进程将获得子进程的退出状态信息存储在 status
中,并且如果传入了 rusage
参数,则会获取子进程的资源使用情况信息。
通常情况下,wait4
函数与 fork
函数结合使用,父进程通过 fork
创建子进程,然后通过 wait4
等待子进程结束,并获取其状态信息。这样可以实现父子进程之间的同步和协作。
#include <sys/resource.h>
int main() {
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
// 打印CPU时间
printf("CPU时间: %ld.%06ld 秒\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);
// 打印最大使用的内存
printf("最大内存使用量: %ld 字节\n", usage.ru_maxrss);
// 其他资源使用情况,可以在usage结构体中查看
// ...
return 0;
}
2、sysinfo
sysinfo
是一个用于获取系统信息的系统调用函数,在 Linux 系统中的头文件 <sys/sysinfo.h>
中定义。函数原型如下:
int sysinfo(struct sysinfo *info);
参数 info
是一个指向 struct sysinfo
结构体的指针,用于存储获取到的系统信息。
//Since Linux 2.3.23 (i386) and Linux 2.3.48 (all architectures) the structure is:
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* Swap space still available */
unsigned short procs; /* Number of current processes */
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* Memory unit size in bytes */
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding to 64 bytes */
};
long uptime
:系统已经运行的时间(以秒为单位)。unsigned long loads[3]
:系统的平均负载值,分别代表过去1分钟、5分钟和15分钟的平均负载。这些值是无符号长整型数,表示了负载值乘以 2^16 的结果。unsigned long totalram
:系统总共的物理内存大小(以字节为单位)。unsigned long freeram
:系统可用的物理内存大小(以字节为单位)。unsigned long sharedram
:被共享的物理内存大小(以字节为单位)。unsigned long bufferram
:被用作缓冲区的物理内存大小(以字节为单位)。unsigned long totalswap
:交换空间的总大小(以字节为单位)。unsigned long freeswap
:可用的交换空间大小(以字节为单位)。unsigned short procs
:当前进程数量。unsigned long totalhigh
:可用的高位内存大小(以字节为单位)。unsigned long freehigh
:空闲的高位内存大小(以字节为单位)。unsigned int mem_unit
:内存单元大小(以字节为单位)。
sysinfo
函数的返回值为 0 表示成功,-1 表示失败,并且可以通过 errno
来获取具体错误信息。
#include <sys/sysinfo.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
struct sysinfo info;
sysinfo(&info);
// 打印总内存大小
printf("总内存大小: %ld 字节\n", info.totalram * info.mem_unit);
// 打印已使用内存大小
printf("已使用内存大小: %ld 字节\n", (info.totalram - info.freeram) * info.mem_unit);
// 其他资源使用情况,可以在info结构体中查看
// ...
return 0;
}
在struct sysinfo
结构体中,loads
数组中的数值表示了负载值乘以 2^16 的结果,这是因为 sysinfo
结构体中的 loads
数组使用了 unsigned long
类型。
在 Linux 内核中,负载值是以固定点数的格式表示的,使用了定点数表示方式来保留小数部分。在这里,每个负载值都被乘以了 2^16(65536),以便将小数部分转换为整数。
这种表示方式的好处在于,它可以比较精确地表示系统的负载情况,同时又不需要使用浮点数来表示,因为浮点数的运算会耗费相对更多的 CPU 时间。通过将负载值乘以一个固定的倍数(2^16),可以在不牺牲太多精度的情况下,使用整数进行表示和计算,这样会更高效。
当我们从 struct sysinfo
结构体中获取负载值时,需要将其除以 2^16 来得到真实的负载值。例如,在上面的示例代码中,打印负载值时并没有除以 2^16,因此实际的负载值应当是 info.loads[x] / 65536
才能得到系统的实际负载情况。
总之,通过将负载值乘以 2^16 来表示,Linux 内核可以在保持较高精度的同时,使用更高效的整数表示方式,用于存储和计算系统的负载情况。
3、times
times
函数是一个用于获取进程和子进程的系统和用户 CPU 时间的系统调用,其原型如下:
#include <sys/times.h>
clock_t times(struct tms *buf);
buf
是一个指向tms
结构的指针,它用来存储 CPU 时间的信息。
struct tms
结构包含了进程和子进程的 CPU 时间信息,其定义如下:
struct tms {
clock_t tms_utime; // 进程在用户态花费的时间
clock_t tms_stime; // 进程在内核态花费的时间
clock_t tms_cutime; // 所有已终止子进程在用户态花费的时间
clock_t tms_cstime; // 所有已终止子进程在内核态花费的时间
};
tms_utime
表示进程在用户态花费的 CPU 时间。tms_stime
表示进程在内核态花费的 CPU 时间。tms_cutime
表示所有已终止子进程在用户态花费的 CPU 时间。tms_cstime
表示所有已终止子进程在内核态花费的 CPU 时间。
示例代码如下所示,演示了如何使用 times
函数来获取进程的 CPU 时间信息:
#include <stdio.h>
#include <sys/times.h>
#include <time.h>
#include <unistd.h>
int main() {
struct tms tms_buf;
clock_t start, end;
// 获取起始时间
start = times(&tms_buf);
printf("Starting time: %ld\n", start);
// 模拟一些工作
for (int i = 0; i < 100000000; ++i) {
// do something
}
// 获取结束时间
end = times(&tms_buf);
printf("Ending time: %ld\n", end);
// 计算 CPU 时间消耗
clock_t user_time = tms_buf.tms_utime;
clock_t sys_time = tms_buf.tms_stime;
printf("User CPU time: %ld\n", user_time);
printf("System CPU time: %ld\n", sys_time);
return 0;
}
这个示例代码中,我们首先调用 times
函数获取了进程的 CPU 时间信息,并输出了起始时间。然后进行了一些模拟工作,之后再次调用 times
函数获取了结束时间,最后计算了用户态和内核态的 CPU 时间消耗。
相关文章:

SpringCloud Alibaba集成 Gateway(自定义负载均衡器)、Nacos(配置中心、注册中心)、Loadbalancer
要为未被某些网关路由谓词处理的请求提供相同的CORS配置,请将属性spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping设置为true。断言(Predicate):Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是 Spring5.0框架中的ServerWebExchange。对于所有GET请求的路径,来自docs.spring.io的请求都将允许CORS请求。

【Linux之升华篇】Linux内核锁、用户模式与内核模式、用户进程通讯方式
alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。字符设备描述符 struct cdev,cdev_alloc()用于动态的分配 cdev 描述符,cdev_add()用于注。外,还支持语义符合 Posix.1 标准的信号函数 sigaction(实际上,该函数是基于 BSD 的,BSD。从最初的原子操作,到后来的信号量,从。(2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的。

iced 入门一
本教程的目标是创建一个简单的购物清单应用程序。我们希望允许添加和删除购物清单中的项目。在编写代码之前,我们必须首先了解 Iced 构建的结构:Elm 架构。它是 GUI 库使用的架构,最初用于 Elm 编程语言。它的核心原则很简单。它围绕三个概念构建:模型、视图和更新。

shell编程
简单来说“Shell 编程就是对一堆 Linux 命令的逻辑化处理”。

@Scheduled注解的scheduler属性什么作用
注解是 Spring Framework 提供的一种机制,用于定义计划任务,即周期性执行的任务。 注解可以应用于方法上,以指示 Spring 容器在特定的时间间隔或按照某种调度规则来调用该方法。 属性是 注解的一个可选属性,它的作用是允许开发者指定一个自定义的 对象来控制任务的调度方式。默认情况下, 注解使用 Spring 内部的 来执行任务,但如果需要更高级的定制化需求,可以通过 属性指定一个自定义的 实现。自定义调度器:共享调度器资源:高级调度需求:假设你想使用 作为调度器,并且希望所有带有

Ubuntu下安装和配置Redis
找到 /ect/redis/redis.conf 文件修改如下:注释掉 127.0.0.1 ,如果不需要远程连接redis则不需要这个操作。使用客户端向 Redis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG。默认情况下,Redis服务器不允许远程访问,只允许本机访问,所以我们需要设置打开远程访问的功能。执行sudo apt-get install redis-server 安装命令。查看 redis 是否启动,重新打开一个窗口。停止/启动/重启redis。

过滤器、拦截器、aop的先后顺序和作用范围&拦截器preHandle(),postHandle(),afterComplation()方法执行顺序
在Spring框架中,过滤器(Filter)、拦截器(Interceptor)和面向切面编程(AOP)都是用于处理请求和处理流程的组件,但它们的作用范围和触发时机有所不同。下面我会解释这三者的先后顺序和作用范围。执行顺序:请注意,这个顺序可能因具体的配置和使用的技术而有所不同。在实际应用中,建议根据项目的具体需求来合理配置和使用这些组件。拦截器执行流程图:实现拦截器需要实现这个接口,这个 接口中有三个默认方法,这三个方法的执行顺序:我们实现接口然后重写这三个方法,就会在对应的时机被自动执行。这里就是调用处理

spring.factories文件的作用
即spring.factories文件是帮助spring-boot项目包以外的bean(即在pom文件中添加依赖中的bean)注册到spring-boot项目的spring容器中。在Spring Boot启动时,它会扫描classpath下所有的spring.factories文件,加载其中的自动配置类,并将它们注入到Spring ApplicationContext中,使得项目能够自动运行。spring.factories文件是Spring Boot自动配置的核心文件之一,它的作用是。

linux常用操作指令—— 查看磁盘、内存使用情况(df、du、free、top)
显示指定磁盘文件的可用空间。如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以 1KB为单位进行显示,除非环境变量 POSIXLY_CORRECT 被指定,那样将以512字节为单位进行显示。free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。当文件系统也确定删除了该文件后,这时候du与df就一致了。实例4:显示目前磁盘空间和使用情况 (最常用)top:“实时查看” ,按。退出 (实时动态显示)

在Java中使用WebSocket
WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2011年成为标准。

替代Druid,HakariCP 为什么这么快?
这次源码探究,真的感觉看到了无数个小细节,无数个小优化,积少成多。平时开发过程中,一些小的细节也一定要“扣”。

Jackson 用起来!
你可以创建自定义序列化器和反序列化器以自定义特定字段或类的序列化和反序列化行为。为此,请创建一个实现或接口的类,并在需要自定义的字段或类上使用和注解。@Override// ...其他代码...优势性能优异:Jackson在序列化和反序列化过程中表现出优秀的性能,通常比其他Java JSON库更快。灵活性:通过注解、自定义序列化器/反序列化器等功能,Jackson提供了丰富的配置选项,允许你根据需求灵活地处理JSON数据。易于使用:Jackson的API设计简洁明了,易于学习和使用。

TCP协议-TCP连接管理
TCP协议是 TCP/IP 协议族中一个非常重要的协议。它是一种面向连接、提供可靠服务、面向字节流的传输层通信协议。TCP(Transmission Control Protocol,传输控制协议)。

一键部署 SpringCloud 微服务,这套流程值得学习一波儿!
一键部署 springcloud 微服务,需要用到 Jenkins K8S Docker等工具。本文使用jenkins部署,流程如下图开发者将代码push到git运维人员通过jenkins部署,自动到git上pull代码通过maven构建代码将maven构建后的jar打包成docker镜像 并 push docker镜像到docker registry通过k8s发起 发布/更新 服务 操作其中 2~5步骤都会在jenkins中进行操作。

计算机网络TCP/IP协议-从双绞线到TCP
消息响应也是同理,这种带端口的消息发送方式,其实就是UDP协议,UDP简单粗暴,但是UDP存在很多问题,所以我们需要设计一个稳定可靠的协议,TCP协议,首先,网络是不稳定的,我们发送的消息很有可能会在中途丢失,所以需要设置重试机制,当消息发送失败时重新发送,为了判断是否成功,还需要要求接收方收到消息后,必须发送确认消息,这样就可以保证消息必达,另外大段的内容发送,很容易造成部分丢失,导致全部内容都要重新发送,于是我们可以将数据分包,分成多个包发送。到这,也行你会发现了,演示中的IP地址是怎么设置的呢?

SpringCloud远程调用为啥要采用HTTP,而不是RPC?
通俗的说法就是:比如说现在有两台服务器A和B,一个应用部署在A服务器上,另一个应用部署在B服务器上,如果A应用想要调用B应用提供的方法,由于他们不在一台机器下,也就是说它们不在一个JVM内存空间中,是无法直接调用的,需要通过网络进行调用,那这个调用过程就叫做RPC。建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket ,套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

Graphics2D API:Canvas操作
在中已经介绍了Canvas基本的绘图方法,本篇介绍一些基本的画布操作.注意:1、画布操作针对的是画布,而不是画布上的图形2、画布变换、裁剪影响后续图形的绘制,对之前已经绘制过的内容没有影响。

Java8 以后的 LocalDateTime,你真的会用吗?
本文从 LocalDateTime 类的创建、转换、格式化与解析、计算与比较以及其他操作几个方面详细介绍了 LocalDateTime 类在 Java 8 中的使用。掌握 LocalDateTime 类的使用可以大大提高日期时间处理效率和质量,希望本文对读者有所帮助。

AbstractMap详解
/ 包:java.util// 包:java.util package java . util;Map.Entry;同 SimpleEntry 一样,都继承了 Map.Entry 和 序列化接口。

一键部署 SpringCloud 微服务,这套流程值得学习一波儿!
一键部署 springcloud 微服务,需要用到 Jenkins K8S Docker等工具。本文使用jenkins部署,流程如下图开发者将代码push到git运维人员通过jenkins部署,自动到git上pull代码通过maven构建代码将maven构建后的jar打包成docker镜像 并 push docker镜像到docker registry通过k8s发起 发布/更新 服务 操作其中 2~5步骤都会在jenkins中进行操作。

Linux下netstat命令详解&&netstat -anp | grep 讲解
Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

Linux命令——根据端口号查进程
查出的数据第二列(16615)是elasticsearch的进程号。通常我们会根据端口号查进程号,或者通过进程号查端口号。linux环境下,我们常常会查询进程号pid。最常用ps -ef |grep xx。根据端口port查进程。根据端口port查进程。根据进程pid查端口。根据进程pid查端口。

Velocity Engine基础
回到顶部Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 , 填充到模板中,从而实现界面和java代码的分离!Velocity Template Language (VTL) , 是Velocity 中提供的一种模版语言 , 旨在提供最简单和最干净的方法来将动态内容合并到网页中。简单来说VTL可以将程序中的动态数展示到网页中注释非解析内容 , 引用和指令。

第三方消息推送回调Java app消息推送第三方选择
由于最先集成的是极光,因此根据官方给的推送设备区分方式中,选择了使用标签tag来进行区分管理方式,其接口提供了设置和清理标签, 每次设置会覆盖上次的结果,当然这个需要和极光后台进行交互,是异步返回的。5、由于其接口没有使用免费和付费区分,对于接口的访问没有限制,从使用的情况来看,经常会出现不准的情况,并且设置标签的效果其实是添加,导致业务需要改变标签时,需要先清除在设置,然而接口又经常出问题,导致这部分也是一塌糊涂了;如果想使用不受免费版本限制特性的推送服务,可以联系平台提供的商务对接,购买付费版本。

Java 类型判断方法
Java 类型判断方法有三种,分别是instanceof是关键字,isInstance和isAssignableFrom是Class中的方法。> cls);

Linux搜索文件&搜索文件名&替换文件内容
locate是Linux系统提供的一种快速检索全局文件的系统命令,它并不是真的去检索所以系统目录,而是检索一个数据库文件locatedb(Ubuntu系置/var/cache/locate/locatedb),该数据库文件包含了系统所有文件的路径索引信息,所以查找速度很快。time结尾的选项,其单位为天,min结尾的选项其单位为分钟,这些选项的值都为一个正负整数, 如+7,表示,7天以前被访问过的文件,-7表示7天以内被访问过的文件,7表示恰好7天前被访问的文件。:快速返回某个指定命令的位置信息。

Lock和Synchronize区别详解
synchronized是Java中的一个关键字,当我们调用它时会从在虚拟机指令层面加锁,关键字为monitorenter和monitorexitLock是Java中的一个接口,它有许多的实现类来为它提供各种功能,加锁的关键代码为大体为Lock和unLock;synchronized可对实例方法、静态方法和代码块加锁,相对应的,加锁前需要获得实例对象的锁或类对象的锁或指定对象的锁。说到底就是要先获得对象的监视器(即对象的锁)然后才能够进行相关操作。

JAVA 中 13 种锁的实现方式
分布式系统时代,线程并发,资源抢占,慢慢变得很重要。那么常见的锁都有哪些?

synchronized对象锁与类锁用法&如何用synchronized锁字符串对象,这里面的坑要注意
我们使用synchronized通常都有这样一个误区:synchronized锁住的代码块一定是所有线程都互斥的。其实不然!首先我们明确一点,synchronized锁住的是一个对象!如果锁住的这个对象,在多个线程中相同,那么这些线程访问synchronized修饰的代码块时,总是互斥的。但是!如果锁住的这个对象,在多个线程中是不同的,那么这些线程访问synchronized修饰的代码块,是不会互斥的!

synchronized用法详解
synchronized 是 Java 中的关键字,是一种同步锁。主要应用于多线程环境下保证线程的安全性。A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。