Fortran Coder

标题: 如何在程序内输出程序所占用内存大小 [打印本页]

作者: ksfengjia    时间: 2017-11-13 11:28
标题: 如何在程序内输出程序所占用内存大小
环境:vs2010+ivf2013背景:程序存在内存泄露

问题:采用何种方式,输出fortran程序的内存占用情况?调用外部命令.or. ifot的特有模块?



作者: fcode    时间: 2017-11-13 12:51
[Fortran] 纯文本查看 复制代码
Program Main
  use Kernel32
  use ISO_C_Binding
  Implicit None
  type(T_MEMORYSTATUSEX) stMemStat
  integer i
  stMemStat%dwLength = c_sizeof(stMemStat)
  i = GlobalMemoryStatusEx ( stMemStat )
  write(*,*) "There is  ",stMemStat%dwMemoryLoad,"% percent of memory in use."
  write(*,*) "There are ",stMemStat%ullTotalPhys/1024," total KB of physical memory."
  write(*,*) "There are ",stMemStat%ullAvailPhys/1024," free  KB of physical memory."
  write(*,*) "There are ",stMemStat%ullTotalPageFile/1024," total KB of paging file."
  write(*,*) "There are ",stMemStat%ullAvailPageFile/1024," free  KB of paging file."
  write(*,*) "There are ",stMemStat%ullTotalVirtual/1024," total KB of virtual memory."
  write(*,*) "There are ",stMemStat%ullAvailVirtual/1024," free  KB of virtual memory."
  write(*,*) "There are ",stMemStat%ullAvailExtendedVirtual/1024," free  KB of extended memory."
End Program Main

作者: pasuka    时间: 2017-11-13 14:08
本帖最后由 pasuka 于 2017-11-13 14:13 编辑

ivf的官方解决方案之一:
https://software.intel.com/en-us ... -intel-inspector-xe
Intel Inspector XE provides two main categories of memory usage information about an application:

Memory growth information about memory that has been allocated, but not yet freed
Memory leak information about memory that has been allocated but can no longer be freed because the application has lost all references to it

下载网址
https://software.intel.com/en-us/intel-inspector-xe

高校或非盈利科研院所建议掏钱买正版,全套ivf单机版折扣价不会超过北上广深的法定最低月工资的5倍

作者: ksfengjia    时间: 2017-11-13 14:39
fcode 发表于 2017-11-13 12:51
[mw_shl_code=fortran,true]Program Main
  use Kernel32
  use ISO_C_Binding

非常感谢!
测试了下代码,有些疑问:
1.我的T_MEMORYSTATUSEX的type中ullTotalPhys相关参数存在lowpart和highpart子参数。
例如stMemStat%ullTotalPhys%lowpart和stMemStat%ullTotalPhys%highpart分别是指什么意思?
2.debug测试中stMemStat%ullTotalPhys%lowpart存在负值,是不是采用c接口的同时,这些参数是无符号数被强制转换了?
3.我的目标是查看本程序的内存量,是不是用ullTotalVirtual-ullTotalVirtual即可?

作者: ksfengjia    时间: 2017-11-13 14:52
pasuka 发表于 2017-11-13 14:08
ivf的官方解决方案之一:
https://software.intel.com/en-us ... -intel-inspector-xe

我测试过ivf2017版本的inspector,并不能完全解决memory leak的问题,有些问题还得自己找出来。
作者: pasuka    时间: 2017-11-13 16:20
ksfengjia 发表于 2017-11-13 14:52
我测试过ivf2017版本的inspector,并不能完全解决memory leak的问题,有些问题还得自己找出来。 ...

涉及C、C++混合编程的话,好多坑隐藏得很深,一时半会儿爬不出来。。。
作者: fcode    时间: 2017-11-13 17:12
对不起,我刚刚在 x64 编译器上测试的。

32位的编译器的话,可能有点问题。Intel 自己提供的Kernel32库里,32位的结构用的一个2个4字节的成员的 type 带表示1个8字节的整数,比较麻烦。

你可以自己定义一个 My_MEMORYSTATUSEX,然后调用时给一个 T_MEMORYSTATUSEX,然后调用完转换成 My_MEMORYSTATUSEX 使用。

这些成员的含义,见以下注释。
[Fortran] 纯文本查看 复制代码
Program Main
  use Kernel32
  use ISO_C_Binding
  Implicit None
  TYPE My_MEMORYSTATUSEX
   SEQUENCE
    integer(DWORD) dwLength ! knowns  DWORD
    integer(DWORD) dwMemoryLoad ! knowns  DWORD
    integer(DWORDLONG) ullTotalPhys ! knowns  DWORDLONG
    integer(DWORDLONG) ullAvailPhys ! knowns  DWORDLONG
    integer(DWORDLONG) ullTotalPageFile ! knowns  DWORDLONG
    integer(DWORDLONG) ullAvailPageFile ! knowns  DWORDLONG
    integer(DWORDLONG) ullTotalVirtual ! knowns  DWORDLONG
    integer(DWORDLONG) ullAvailVirtual ! knowns  DWORDLONG
    integer(DWORDLONG) ullAvailExtendedVirtual ! knowns  DWORDLONG   
  END TYPE
  type(T_MEMORYSTATUSEX)  stMemStat
  type(My_MEMORYSTATUSEX) stMyMemStat  
  integer i
  stMemStat%dwLength = c_sizeof(stMemStat)
  i = GlobalMemoryStatusEx ( stMemStat )
  stMyMemStat = transfer( stMemStat , stMyMemStat )
  write(*,*) "There is  ",stMyMemStat%dwMemoryLoad,"% percent of memory in use."!//内存使用百分比
  write(*,*) "There are ",stMyMemStat%ullTotalPhys/1024," total KB of physical memory."!//物理内存总量
  write(*,*) "There are ",stMyMemStat%ullAvailPhys/1024," free  KB of physical memory."!//物理内存可用量
  write(*,*) "There are ",stMyMemStat%ullTotalPageFile/1024," total KB of paging file."!//虚拟内存(页面文件)总量
  write(*,*) "There are ",stMyMemStat%ullAvailPageFile/1024," free  KB of paging file."!//虚拟内存(页面文件)可用量
  write(*,*) "There are ",stMyMemStat%ullTotalVirtual/1024," total KB of virtual memory."!//虚拟地址总量,32位固定为2GB
  write(*,*) "There are ",stMyMemStat%ullAvailVirtual/1024," free  KB of virtual memory."!//虚拟地址可用量(可以认为这个代表可用值)
  write(*,*) "There are ",stMyMemStat%ullAvailExtendedVirtual/1024," free  KB of extended memory."
End Program Main

作者: wenqiang0606    时间: 2018-11-2 16:53
fcode 发表于 2017-11-13 12:51
[mw_shl_code=fortran,true]Program Main
  use Kernel32
  use ISO_C_Binding

版主,跟您请教一个问题,我用您这个代码来输出程序占用内存的大小,我的思路是用总内存*内存占用率得到当前内存使用量,程序里用前后两个使用量相减得到内存占用量。
但是发现有点不太准,后来发现跟stMemStat%dwMemoryLoad是一个整数有关系,有办法解决这个问题吗,谢谢。
作者: fcode    时间: 2018-11-3 09:16
这个就是不准,没办法。内存的占用,从原始内存到操作系统内存管理,映射成平坦模式,是个复杂的问题。
作者: wenqiang0606    时间: 2018-11-4 10:10
fcode 发表于 2018-11-3 09:16
这个就是不准,没办法。内存的占用,从原始内存到操作系统内存管理,映射成平坦模式,是个复杂的问题。 ...

好的,谢谢版主。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2