linxu下proc是个很重要的文件系统,很多和内核相关的信息都存在这里.
maps
40000000-40009000 r-xp 00000000 ca:01 12550177 /opt/java/jdk-1.6.0_32/bin/java 40108000-4010a000 rwxp 00008000 ca:01 12550177 /opt/java/jdk-1.6.0_32/bin/java // 以上是进程的启动命令 ... // 这里开始是分配给这个线程堆区的物理地址开始位置,包含了每个加载的文件的起始地址 40bbf000-40c24000 rwxp 00000000 00:00 0 [heap] 40c24000-40c27000 ---p 00000000 00:00 0 ... d0000000-100000000 rwxp 00000000 00:00 0 3671800000-367181c000 r-xp 00000000 ca:01 2261321 /lib64/ld-2.5.so 3671a1c000-3671a1d000 r-xp 0001c000 ca:01 2261321 /lib64/ld-2.5.so 3671a1d000-3671a1e000 rwxp 0001d000 ca:01 2261321 /lib64/ld-2.5.so 7f07c04ec000-7f07c1bb7000 rwxp 00000000 00:00 0 7f07c1bb7000-7f07c1bbc000 r-xp 00000000 ca:01 12551958 /opt/java/jdk-1.6.0_32/jre/lib/amd64/headless/libmawt.so 7f07c1bbc000-7f07c1cbb000 ---p 00005000 ca:01 12551958 /opt/java/jdk-1.6.0_32/jre/lib/amd64/headless/libmawt.so 7f07c1cbb000-7f07c1cbd000 rwxp 00004000 ca:01 12551958 /opt/java/jdk-1.6.0_32/jre/lib/amd64/headless/libmawt.so 7f07c1cbd000-7f07c1d4f000 r-xp 00000000 ca:01 12551964 /opt/java/jdk-1.6.0_32/jre/lib/amd64/libawt.so 7f07c1d4f000-7f07c1e4e000 ---p 00092000 ca:01 12551964 /opt/java/jdk-1.6.0_32/jre/lib/amd64/libawt.so 7f07c1e4e000-7f07c1e68000 rwxp 00091000 ca:01 12551964 /opt/java/jdk-1.6.0_32/jre/lib/amd64/libawt.so ... 7f07e0bb4000-7f07e0bbc000 rwxs 00000000 ca:01 16678915 /tmp/hsperfdata_admin/22892 7f07e0bbc000-7f07e0bc3000 r-xs 00000000 ca:01 4981946 /usr/lib64/gconv/gconv-modules.cache 7f07e0bc3000-7f07e0bc4000 rwxp 00000000 00:00 0 7f07e0bc4000-7f07e0bc5000 r-xp 00000000 00:00 0 7f07e0bc5000-7f07e0bc6000 r-xp 00000000 ca:01 5996807 /usr/local/snoopy/lib/snoopy.so 7f07e0bc6000-7f07e0dc6000 ---p 00001000 ca:01 5996807 /usr/local/snoopy/lib/snoopy.so 7f07e0dc6000-7f07e0dc7000 rwxp 00001000 ca:01 5996807 /usr/local/snoopy/lib/snoopy.so 7f07e0dc7000-7f07e0dca000 rwxp 00000000 00:00 0 7fff73ffc000-7fff74016000 rwxp 00000000 00:00 0 [stack] // 用户态栈区 7fff74098000-7fff74099000 r-xp 00000000 00:00 0 [vdso] // Virtual Dynamically-linked Shared Object ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] // 内核区
第一列: 虚拟内存区域的起始和终止地址
第二列: 虚拟内存的读写权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
第三列: 文件在虚拟内存区域的偏移量
第四列: 文件的主设备号和次设备号
第五列: 设备的节点号,0表示没有节点与内存相对应
第六列: /lib/ld-2.3.4.so 被映射文件的文件名,可以为空
执行命令:ldd /opt/taobao/install/jdk-1.6.0_32/bin/java
linux-vdso.so.1 => (0x00007fffef7ff000) /usr/local/snoopy/lib/snoopy.so (0x00007f3d00308000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3d000da000) libjli.so => /opt/taobao/install/jdk-1.6.0_32/bin/../jre/lib/amd64/jli/libjli.so (0x00007f3cfffd0000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f3cffdcc000) libc.so.6 => /lib64/libc.so.6 (0x00007f3cffa73000) /lib64/ld-linux-x86-64.so.2 (0x0000003671800000)
可以看到,为了运行这个命令,内核已经加载了哪些文件,这些文件就是内核映射的代码入口(系统本身并不存在这样的链接库文件,ldd命令展示用的)。
maps记录的是进程的简单信息,可以看堆区是不是在一直增长来判断是不是内存溢出。jvm的内存是虚拟内存,直接映射到os的物理内存中。有时候jvm中的虚拟内存是没什么问题,但是堆外内存一直在增长,这里是可以看出来的。详细内容见smaps
smaps
40bbf000-40c24000 rwxp 00000000 00:00 0 [heap] Size: 404 kB // 虚拟内存大小 Rss: 324 kB // 实际使用物理内存大小 Pss: 324 kB Shared_Clean: 0 kB // 页面被改,则是dirty,否则是clean,页面引用计数>1,是shared,否则是private Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 324 kB Referenced: 324 kB Anonymous: 324 kB AnonHugePages: 0 kB Swap: 0 kB // 处于交换区的页面大小 KernelPageSize: 4 kB // 操作系统一个页面大小 MMUPageSize: 4 kB // 体系结构MMU一个页面大小
status
Name: java // 启动命令 State: S (sleeping) // 任务状态,运行/睡眠/僵死 Tgid: 22892 // 线程组号 Pid: 22892 // 进程id PPid: 22881 // 父进程id TracerPid: 0 Uid: 505 505 505 505 Gid: 505 505 505 505 Utrace: 0 FDSize: 1024 Groups: 505 VmPeak: 1757412 kB // 内存使用峰值 VmSize: 1756360 kB // 进程虚拟地址空间大小 VmLck: 0 kB // 进程锁住的物理内存大小,锁住的物理内存无法交换到硬盘 VmHWM: 817696 kB VmRSS: 817688 kB // 进程正在使用的物理内存大小 VmData: 1578852 kB // 进程数据段大小 VmStk: 108 kB // 进程用户态栈大小 VmExe: 36 kB // 进程代码段大小 VmLib: 100032 kB // 进程使用的库映射到虚拟内存空间的大小 VmPTE: 2176 kB // 进程页表大小 VmSwap: 0 kB // 交换区 Threads: 162 SigQ: 0/31611 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000002223 SigCgt: 1000000181005ccc CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: ffffffffffffffff Cpus_allowed: 7fff Cpus_allowed_list: 0-14 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 1 nonvoluntary_ctxt_switches: 6
linux下内存占用是一个比较复杂的概念,不能简单通过一个单一指标就判断某个程序“内存消耗”大小:
- 进程所申请的内存不一定真正会被用到(malloc或mmap的实现)
- 真正用到了的内存也不一定是只有该进程自己在用 (比如动态共享库)
相关推荐
ProC-C++编程指南 详细目录列表 包括内容.
proc-macro2 编译器proc_macro板条箱的程序宏API的包装器。 该库有两个目的: 将类似于proc-macro的功能带到诸如build.rs和main.rs之类的其他上下文中。 proc_macro中的类型完全特定于过程宏,并且永远不会存在于...
用于neo4j数据库中的算法插件包,下载后需要放入plugin文件夹下,并修改neo4j的config文件,最后重启服务可以使用
ITCMMI-PROC-PM-002行软件开发管理办法.pdfITCMMI-PROC-PM-002行软件开发管理办法.pdf
前端开源库-swint-proc-opsswint proc ops,swint的过程运算符
前端开源库-proc-statsproc stats,获取进程的使用状态
perl-Proc-Daemon-0.14-8.3.noarch。
QM-PROC-QMP-02-软件项目立项管理模板-V4.0借鉴.pdf
前端开源库-gobem-proc-uglifygobem proc uglify,处理器为gobem builder缩小javascript文件。
QM-PROC-QMP-09-软件项目技术预研模板(软件技术预研报告模板)-V4.0.pdf
QM-PROC-QMP-11-软件系统设计模板(软件系统设计说明书模板)-V4.0.pdf
QM-PROC-QMP-10-软件项目需求开发模板(软件需求开发说明书模板)-V4.0.pdf
proc-macro2 编译器proc_macro板条箱的程序宏API的包装器。 该库有两个目的: 将类似于proc-macro的功能带到诸如build.rs和main.rs之类的其他上下文中。 proc_macro中的类型完全特定于过程宏,并且永远不会存在于...
资源分类:Python库 所属语言:Python 资源全名:k3proc-0.2.9-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源来自pypi官网。 资源全名:proc-0.2.2.tar.gz
从各种/proc/:pid/*文件描述符中读取数据。 安装 $ npm install proc-tools --save 用法 获取进程的/proc/:pid/status 。 var status = require ( 'proc-tools' ) . status status ( process . pid , function ( ...
混合模型(hybrid model)是几种不同模型组合而成的一种模型。它允许一个项目能沿着最有效的路径发展。也可定义为由固定效应和随机效应(随机误差除外)两部分组成的统计分析模型。如由几个高斯分布混合起来的模型叫...
亲爱的:Rust proc-macro属性解析器
用代码进行数据库链接