Linux 系统 当前进程使用的内存堆栈可以从task_struct->mm_struct->total_vm中获得虚拟内存使用总量
每个进程都有完全属于自己的,独立的,不被干扰的内存空间。此空间,被分成几个段(Segment),分别是Text, Data, BSS, Heap, Stack。用户进程内存空间,也是系统内核分配给该进程的VM(虚拟内存),但并不表示这个进程占用了这么多的RAM(物理内存)。这个空间有多大?命令top输出的VIRT值告诉了我们各个进程内存空间的大小(进程内存空间随着程序的执行会增大或者缩小)。你还可以通过/proc//maps,或者pmap –d 了解某个进程内存空间都分布,比如:
#cat /proc/1449/maps
…
0012e000-002a4000 r-xp 00000000 08:07 3539877 /lib/i386-linux-gnu/libc-213so
002a4000-002a6000 r--p 00176000 08:07 3539877 /lib/i386-linux-gnu/libc-213so
002a6000-002a7000 rw-p 00178000 08:07 3539877 /lib/i386-linux-gnu/libc-213so
002a7000-002aa000 rw-p 00000000 00:00 0
…
08048000-0875b000 r-xp 00000000 08:07 4072287 /usr/local/mysql/libexec/mysqld
0875b000-0875d000 r--p 00712000 08:07 4072287 /usr/local/mysql/libexec/mysqld
0875d000-087aa000 rw-p 00714000 08:07 4072287 /usr/local/mysql/libexec/mysqld
…
当前任务的task_struct中有两个结构,utime和stime分别描述了当前任务在用户态和内核态所消耗的CPU时间,start_time描述了当前任务的起始运行时间,通过单位换算和计算,就可以获得当前任务的CPU率了!
参考资料: Windows 获取进程内存占用大小
>
itjobJava老师讲过:1)线程堆栈概述及基础知识
2)线程堆栈的生成原理以及相关工具
3)不同JVM线程堆栈的格式的差异(SunHotSpot、IBMJRE、OracalJRockit)
4)线程堆栈日志介绍以及解析方法
5)线程堆栈的分析和相关的技术
6)常见的问题模板(线程竟态、死锁、IO调用挂死、垃圾回收/问题、死循环等)
7)线程堆栈问题实例分析
我希望这一系列的培训能给你带来确实的帮助,所以请持续关注每周的文章更新。
但是如果我在学习过程中有疑问或者无法理解文章中的内容该怎么办?
不用担心,把我当做你的导师就好。任何关于线程堆栈的问题都可以咨询我(前提是问题不能太low)。请随意选择下面的几种方式与我取得联系:
1)直接本文下面发表评论(不好意思的话可以匿名)
2)将你的线程堆栈数据提交到RootCauseAnalysisforum
3)发Email给我,地址是@@hotmail
能帮我分析我们产品上遇到的问题么?
当然可以,如果你愿意的话可以把你的堆栈现场数据通过邮件或论坛RootCauseAnalysisforum发给我。处理实际问题是才是学习提升技能的王道。
我真心期望大家能够喜欢这个培训。所以我会尽我所能去为你提供高质量的材料,并回答大家的各种问题。
在介绍线程堆栈分析技术和问题模式之前,先要给大家讲讲基础的内容。所以在这篇帖子里,我将先覆盖到最基本的内容,这样大家就能更好的去理解JVM、中间件、以及JavaEE容器之间的交互。
JavaVM概述
Java虚拟机是JaveEE平台的基础。它是中间件和应用程序被部署和运行的地方。
JVM向中间件软件和你的Java/JavaEE程序提供了下面这些东西:
_(二进制形式的)Java/JavaEE程序运行环境
_一些程序功能特性和工具(IO基础设施,数据结构,线程管理,安全,监控等等)
_借助垃圾回收的动态内存分配与管理
你的JVM可以驻留在许多的 *** 作系统(Solaris,AIX,Windows等等)之上,并且能根据你的物理服务器配置,你可以在每台物理/虚拟服务器上安装1到多个JVM进程
JVM与中间件之间的交互
下面这张图展示了JVM、中间件和应用程序之间的高层交互模型。
如你所见,标准JavaEE应用程序的线程的分配实在中间件内核与JVM之间完成的。(当然也有例外,应用程序可以直接调用API来创建线程,这种做法并不常见,而且在使用的过程中也要特别的小心)
同时,请注意一些线程是由JVM内部来进行管理的,典型的例子就是垃圾回收线程,JVM内部使用这个线程来做并行的垃圾回收处理。
因为大多数的线程分配都是由JavaEE容器完成的,所以能够理解和认识线程堆栈跟踪,并能从线程堆栈数据中识别出它来,对你而言很重要这可以让你能够快速的知道JavaEE容器正要执行的是什么类型的请求
从一个线程转储堆栈的分析角度来看,你将能了解从JVM发现的线程池之间的不同,并识别出请求的类型
最后一节会向你提供对于HotSopVM而言什么是JVM线程堆栈的一个概述,还有你将会遇到的各种不同的线程而对IBMVM线程堆栈形式详细内容将会在第四节向你提供
请注意你可以从根本原因分析论坛获得针对本文的线程堆栈示例
JVM线程堆栈——它是什么
JVM线程堆栈是一个给定时间的快照,它能向你提供所有被创建出来的Java线程的完整清单
4字节或8字节,虽然同为win32,但还取决于程序运行的模式(32位系统还是64位系统或是64位系统下的32位程序)。我所知的所有cpu的栈单元都是当前cpu运行模式字长,比如32位系统,则栈单元为32位
忘了回答第二个问题,你的发现是正确的,参数确实按照宏所揭示的方式排列
再补充一下,虽然没有明确在文档上看过确切的原因,但在我看来,和cpu运行模式等字长是很有必要的,比如函数调用的返回地址,很多系统都将其压栈,如果栈单元大小不合适,则这种基本 *** 作将很别扭,就这点来说,也得将栈的单元长设为与字长相等才好
以上就是关于怎么获取内核进程的内存占用全部的内容,包括:怎么获取内核进程的内存占用、linux下,一个运行中的程序,究竟占用了多少内存、你如何在Java中获取线程堆栈等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)