以下为例子,判断计算机内存并释放程序内存。

# coding=utf8
import time
import psutil, gc, commands,os from logger_until import LoggerUntil
from until import keep_circulating logger = LoggerUntil(name="Monitor").getlog(logfilename='Monitor.log', loglevel=2, add_StreamHandler=1) need_monitor_procces_names = [ ##需要检测的进程的cmd命令放到这里,支持模糊匹配
'touna0627.py',
'dailiip.py',
'redis-server',
'mongod',
] class Monitor(object):
def __init__(self):
self.specified_process_list = self.get_specified_process()
self.current_process = self.get_current_process() @staticmethod
def print_all_cmdlines():
for pid in psutil.pids():
p = psutil.Process(pid)
print p.cmdline() @staticmethod
def get_specified_process():
all_pids = psutil.pids()
process_list = []
for pid in all_pids:
p = psutil.Process(pid)
p_cmdline = p.cmdline()
for argx in p_cmdline:
for name in need_monitor_procces_names:
if argx.find(name) > -1:
if p.status() != 'stopped':
process_list.append(p) p_pid_set = set()
process_list2 = []
for p in process_list:
if p.pid not in p_pid_set:
process_list2.append(p)
p_pid_set.add(p.pid)
return process_list2 @staticmethod
def monitor_system():
psutil.cpu_percent()
time.sleep(1)
mem = psutil.virtual_memory() mem_total = mem.total / 1000000
mem_available = mem.available / 1000000
mem_percent_str = str(mem.percent) + '%' cpu_count = psutil.cpu_count()
cpu_percent_str = str(psutil.cpu_percent()) + '%' msg = '本机总内存是:{0}M , 本机可用内存是:{1}M, 本机内存使用率是:{2}, 本机cpu核数是:{3}, 本机cpu使用率是:{4}\n\n'.format(mem_total, mem_available, mem_percent_str, cpu_count, cpu_percent_str)
logger.info(msg) def monitor_specified_process(self):
for p in self.specified_process_list:
p.cpu_percent(None)
time.sleep(1)
for p in self.specified_process_list:
# p = psutil.Process(0)
""":type :psutil.Process"""
cmdline_str = ' '.join(p.cmdline()).ljust(60, ' ')
p_cpu_percent_str = str(round(p.cpu_percent(), 2)) + '%'
p_memory_percent_str = str(round(p.memory_percent(), 2)) + '%'
p_strated_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(p.create_time()))
p_pid_str = str(p.pid) msg = '进程' + cmdline_str + ' 的pid是:' + p_pid_str + ' cpu使用率是:' + p_cpu_percent_str + ' 内存使用率是:' + p_memory_percent_str \
+ ' 进程的启动时间是:' + p_strated_time
logger.info(msg) @staticmethod
def get_current_process():
return psutil.Process() def is_need_release(self,threshold):
print self.current_process.memory_percent()
if self.current_process.memory_percent() < threshold:
return 0
else:
logger.info('回收当前 %s 进程id的内存' % self.current_process.pid)
return 1 def free_current_process_memory(self, threshold):
"""回收python所处的当前进程的内存"""
if self.is_need_release(threshold) == 1:
gc.collect() class MemoryReleaser():
def __init__(self,threshold,cmd_name_str='touna0627.py'):
"""
:type threshold:float
"""
self.threshold = threshold # 内存使用率的阈值
self.cmd_name_str =cmd_name_str
self.stutus, self.output = self.__get_memory_available() def __get_memory_available(self):
# status, output = commands.getstatusoutput("free -m | grep Mem | awk '{print $4}'") ##shell命令查询计算机可用内存
status, output = commands.getstatusoutput("ps aux | grep %s | sort -k4,4nr|head -1| awk '{print $4}'"%(self.cmd_name_str)) ##shell命令查询程序的内存使用率
return status, output def release_memory(self):
if float(self.output) > self.threshold:
logger.info('程序的内存使用率是 {}% ,程序需要释放内存'.format(self.output))
gc.collect() @keep_circulating(10)
def monitoring():
MemoryReleaser(40).release_memory() ###这一行来释放内存
monitor = Monitor()
monitor.monitor_specified_process()
monitor.monitor_system() if __name__ == "__main__":
pass
a = list(range(10000000))
del a
time.sleep(30)
monitoring()

如果把MemoryReleaser(600).release_memory() 注释掉,程序将一直是占用大内存。

程序中使用了

free -m | grep Mem | awk  '{print $7}'
来判断计算机可用内存。 虽然psutil可以判断内存,但使用psutil判断内存,内存就无法回收了。 把MemoryReleaser(600).release_memory() 放到monitoring函数中的最后一行,那就回收不了内存了。 尝试了很多次使用
 if psutil.Process().memory_percent() > 0: 
  gc.collect()

这种方式不能回收内存。
写成if true是可以回收内存的。

python垃圾回收,判断内存占用,手动回收内存,二的更多相关文章

  1. linux下使用free命令查看实际内存占用(可用内存)

    转:http://blog.is36.com/linux_free_command_for_memory/ linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free -m ...

  2. C&C++动态分配内存(手动分配内存)三种方式

    1. malloc函数 函数原型:void *malloc(unsigned int size)函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址. 可以看到 ...

  3. python 垃圾回收笔记

    目录 引用计数 python内部的引用计数机制 循环引用 调试内存泄漏 总结 python 程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性 ...

  4. linux内存源码分析 - 内存回收(整体流程)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文 ...

  5. (转)linux内存源码分析 - 内存回收(整体流程)

    http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时 ...

  6. Windbg分析高内存占用问题

    1. 问题简介 最近产品发布大版本补丁更新,一商超客户升级后,反馈系统经常奔溃,导致超市的收银系统无法正常收银,现场排队付款的顾客更是抱怨声声.为了缓解现场的情况, 客户都是手动回收IIS应用程序池才 ...

  7. Egret在Chrome浏览器中的内存占用(内存泄露)

    参考: 怎样查看Chrome的内存占用情况 JS内存泄漏排查方法(Chrome Profiles) chrome内存泄露(一).内存泄漏分析工具 chrome内存泄露(二).内存泄漏实例 目录: 一 ...

  8. Linux使用free命令查看实际内存占用

    转自:http://www.cnblogs.com/pengdonglin137/p/3315124.html Linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free ...

  9. Sciter/HTMLayout内存占用评测

    先从最基础的Exe文件的执行说起: Exe文件要在系统中执行,首先要将Exe文件本身加载入内存中,并且通常在内存中加载完成的Exe所占空间大小会比实际所占的磁盘空间大一些,这是由内存的特殊设定所决定的 ...

随机推荐

  1. Route学习笔记之Area的Route注册

    前一段时间接触了MVC的Area可以将模型.控制器和视图分成各个独立的节点.分区之后,区域路由注册的需求就出来了. 默认的 在MVC项目上右键添加区域之后,在文件夹下会自动添加一个FolderName ...

  2. 多线程三:Task

    Task是.NET 3.0中推出的,是基于ThreadPool封装的,里面的线程都是来自于ThreadPool. 1.使用Run()方法启动线程 F12查看Run()方法的定义: 发现Run()方法的 ...

  3. Spring Cloud Config 配置中心 生产环境下相关问题

    参照以前写的博客进行搭建配置中心集群 1.如果要使用 服务器端自动刷新,所有客户端同步功能.要先安装RabbitMQ 2.如果要使用自动加解密功能,要先安装JAVA JCE扩展.

  4. C/C++-STL中lower_bound与upper_bound的用法以及cmp函数

    转载于:http://blog.csdn.net/tjpuacm/article/details/26389441 不加比较函数的情况: int a[]={0,1,2,2,3}; printf(&qu ...

  5. Graph-BFS-图的广度优先遍历

    #include <iostream> #include <queue> using namespace std; /* 5 5 1 2 1 3 1 5 2 4 3 5 1 2 ...

  6. druid的配置

    //----------------------------pom.xml-------------------------------- <!-- druid --> <depen ...

  7. 微信小程序——video使用总结

    关于小程序video的一些基本使用方法,可点击这里稍作了解. 需求: 1.默认显示封面: 2.一个视频播放的时候,其他视频停止播放,并显示封面. 解决问题思路: 1.通过wx:if判断当前视频是否是播 ...

  8. HBase Rowkey的散列与预分区设计

    转自:http://www.cnblogs.com/bdifn/p/3801737.html 问题导读:1.如何防止热点?2.如何预分区?扩展:为什么会产生热点存储? HBase中,表会被划分为1.. ...

  9. 小米3移动版 分区 调整/合并教程(16GB/64GB)

    (必读)版权声明:米3移动版TWRP Recovery为XueferH适配,分区脚本以及双数据置换脚本的知识产权,智力成果权归XueferH所有. 注:此教程仅适用于Xiaomi MI 3-移动版(1 ...

  10. FPGA静态时序分析——IO口时序(Input Delay /output Delay)(转载)

    转载地址:http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html 1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟 ...