精华内容
下载资源
问答
  • 最近发现我的网站内存告急,然后htop查看了下,发现php-fpm占用了很大的内存,然后我重启了php-fpm之后马上腾出了很多内存出来,后来一个星期后内存又告急了,这应该是进程一直占用内存不释放的原因了。在网上了搜了...

    最近发现我的网站内存告急,然后htop查看了下,发现php-fpm占用了很大的内存,然后我重启了php-fpm之后马上腾出了很多内存出来,后来一个星期后内存又告急了,这应该是进程一直占用内存不释放的原因了。

    在网上了搜了相关资料,确认是php-fpm占用不释放了,通过修改配置优化。

    1、解决php-fpm占用内存问题

    我的服务器是1GB内存的配置php-fpm,实际设置数值还得根据服务器本身的性能、PHP等综合考虑。

    vim /etc/php-fpm.d/www.conf pm = dynamic #dynamic和ondemand适合小内存。pm.max_children = 15 #static模式下生效,dynamic不生效。pm.start_servers = 8 #dynamic模式下开机的进程数量。pm.min_spare_servers = 6 #dynamic模式下最小php-fpm进程数量。pm.max_spare_servers = 15 #dynamic模式下最大php-fpm进程数量。

    2、解决php-fpm进程不释放内存

    上面通过减少php-fpm进程总数来达到减少php-fpm内存占用的问题,实际使用过程中发现php-fpm进程还存长期占用内存而不释放的问题。解决的方法就是减少pm.max_requests数。

    最大请求数max_requests,即当一个 PHP-CGI 进程处理的请求数累积到 max_requests 个后,自动重启该进程,这样达到了释放内存的目的了。以1GB内存的VPS主机设置为例(如果你设置的数值没有达到释放内存可以继续调低):

    pm.max_requests = 500 

    当php-fpm进程达到了pm.max_requests设定的数值后,就会重启该进程,从而释放内存。

    18740bdb9a797b9f93cd65fafd54dd9d.png
    展开全文
  • 1.代理声明应为weak,默认strong强引用会导致计数器加1,无法释放内存;应这样声明:@property (nonatomic, weak) SampleClass *sampleClass;2.NSTimer定时器未释放,会导致计数器加1,无法释放内存。 应这样先关闭...

    几种原因:
    1.代理声明应为weak,默认strong强引用会导致计数器加1,无法释放内存;应这样声明:

    @property (nonatomic, weak) SampleClass *sampleClass;

    2.NSTimer定时器未释放,会导致计数器加1,无法释放内存。
    应这样先关闭定时器:

    /**
     *  开起定时器加载
     */
    - (void)loadingStartAnimation {
    
        _loadTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(customAnimation) userInfo:nil repeats:YES];
        [_loadTimer fire];
    }
    
    
    // 关闭定时器
    - (void)invalidTimer {
    
        if (_loadTimer) {
            [_loadTimer invalidate];
            _loadTimer = nil;
        }
    }
    

    3.死循环:在getter方法里使用self.
    如下:

    #pragma mark getter
    - (UITableView *)meTableView {
    
        if (_meTableView == nil) {
            _meTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kMAIN_SCREEN_WIDTH, kMAIN_SCREEN_HEIGHT  - kTAB_BAR_HEIGHT) style:UITableViewStylePlain];
            _meTableView.delegate   = self;
            _meTableView.dataSource = self;
            self.meTableView.backgroundColor = Background_Color;  //本方法是getter方法,不能使用self!!!
        }
        return _meTableView;
    }

    4.block里面不能直接用self,需转为weak弱类型

    __weak typeof(self) weakSelf = self;//转为weak弱类型
        [self.network doRequestUsingCookieWithType:TLDRequestType_Get urlString:kGetRechargeRecordURL paramsDic:paramDic fromDelegate:self successBlock:^(AFHTTPRequestOperation *operation, id resultData) {
            [weakSelf requestRechargeRecordFinished:resultData];
        } failBlock:^(AFHTTPRequestOperation *operation, NSError *error) {
            [weakSelf.HUD showToastWithText:kRequestFailString];
        }];
    展开全文
  • pyclutter内存不释放解决记录

    千次阅读 2012-04-20 15:35:47
    开始时,一直怀疑是内存泄露的原因,但是前面的工作将内存泄露的原因也排除了. 我用c写的程序在pc上运行,没有明显的内存泄露. 后来,我将两个一模一样的程序,分别在两个平台上运行,得到的内存记录却完全不同,...

    由于程序最终是在一款嵌入式平台上运行.由 python+clutter 的程序在pc上运行内存可以非常理想的释放,而在嵌入式平台上却不能释放.

    开始时,一直怀疑是内存泄露的原因,但是前面的工作将内存泄露的原因也排除了.


    我用c写的程序在pc上运行,没有明显的内存泄露.


    后来,我将两个一模一样的程序,分别在两个平台上运行,得到的内存记录却完全不同,

    在pc上能良好释放,但是在嵌入式平台上,却还是不能释放.


    考虑到两种平台,有区别的地方可能就是opengl,在pc上用的是OpenGL,而在嵌入式平台上,用的却是OpenGL ES.

    所以我又写一个最简单的clutter程序,仅是产生图片,然后销毁掉,在两种平台上,查看区别.

    但是結果还是不同,所以怀疑是OpenGL不同导致的.怀疑是由于OpenGL的内存池不释放造成的. 但是,同事却告诉我说,OpenGL不存在内存池.


    今天,又想到,是不是因为内存分配没有对齐,导致很多内存碎片的问题呢.所以去查g_malloc函数,到Memory Allocation一节时,看到对这一节的描述:

    Description

    These functions provide support for allocating and freeing memory.

    Note

    If any call to allocate memory fails, the application is terminated. This also means that there is no need to check if the call succeeded.

    Note

    It's important to match g_malloc() with g_free(), plain malloc() with free(), and (if you're using C++) new with delete and new[] with delete[]. Otherwise bad things can happen, since these allocators may use different memory pools (and new/delete call constructors and destructors). See also g_mem_set_vtable().


    突然看到 memory pool ,原来glibc也有内存池机制啊.然后在网上看到glibc的内存池机制,以及相应的环境变量和参数.

    其实的malloc的实现并非简单调用brk/sbrk,为了考虑效率glibc有“三级”优化措施,即:

    1.       “小内存”分配通过 fastbin 链表实现;

    2.       一般的内存分配在堆上分配,该区域称为:memory arena;

    3.       比较大(比M_MMAP_THRESHOLD设定的值更大)的内存采用mmap分配,采用mmap的好处在于free后立即交还给系统,而不会被锁定而浪费内存;

    在程式调用free时,glibc并不会每次调用sbrk,相反glibc会把放到暂时的内存池中,以提供下一次malloc的操作使用,这样能够达到内存分配效率的优化。

    控制内存分配的函数是mallopt,其原型如下:

    int mallopt(int cmd, int __val);

    cmd的取值为:

    M_TRIM_THRESHOLD -1

    M_TOP_PAD -2

    M_MMAP_THRESHOLD -3

    M_MMAP_MAX -4

    M_CHECK_ACTION -5

    M_PERTURB -6

    其含义如下:

    M_TRIM_THRESHOLD

    当能够被释放的内存堆积到该值时进行正真的释放(sbrk)操作;

    M_TOP_PAD

    内存分配时头部的附加长度。假如程式调用malloc分配1024k内存,但glibc并不会仅仅分配1024k,还需分配更多的内存(一部分用来进行glibc自身的内存分配管理使用)。

    M_MMAP_THRESHOLD

    假如需要分配的内存超过该值,glibc将采用mmap分配内存。

    M_MMAP_MAX

    用来控制最多的mmap的数目;

    实例:mallopt-trim.c



    事实上以上参数能够通过相应的环境变量来设定而不必修改程式,比如:

    MALLOC_TRIM_THRESHOLD_=1024 ./program


    对相同的c程序,在pc和嵌入式平台上测试結果相同,确定在嵌入式平台上内存不释放就是这个原因.但是,我们的程序是python程序.

    看到可以mallopt函数来在代码中设置.

    在c程序中,可以添加在main函数内的开头,但是,我们在python中是调用c的库,并没有main函数.

    然后我觉得应该在控件创建开始的地方进行设置,但是测试結果却没有改善,看来设置并没有效果.

    后来想到,既然以命令行添加环境变量的方式在c可行,那么在python中也是一样的啊,我只要设置python的环境,那么glibc库的运行环境继承来自python程序的运行环境,肯定也可行.

    MALLOC_TRIM_THRESHOLD_=1024 MALLOC_MMAP_THRESHOLD_=1024  ./movie.py

    結果果然可以.

    当然参数值的設定应该是继续优化,网上有说最好一页大小为宜,即4k



    展开全文
  • 出现以下错误,后来把tomcat的内存增大到1024 严重: Exception initializing page context  java.lang.OutOfMemoryError: Java heap space     在tomcat\bin\catalina.batset CURRENT_DIR...

    公司CMS的tomcat又挂掉了,之前挂了一次.出现以下错误,后来把tomcat的内存增大到1024  

    严重: Exception initializing page context  
    java.lang.OutOfMemoryError: Java heap space  
       
      在tomcat\bin\catalina.bat的set CURRENT_DIR=%cd% 前面添加  
          set JAVA_OPTS =-Xms512m -Xmx1024m  
          意思:设置最小虚拟内存512,最大1024.  

      今天tomcat又挂了,一查之下,发现内存只升不降,久而久之,系统就挂死了.另外你可以用java的一个管理工具查看内存使用情况.在jdk1.6.0\bin\jconsole.exe.  
       
       总结下内存只升不降的几个原因:  
       1.在java中虽然有垃圾回收器,但是对rs等通过jdbc访问数据库的所产生的垃圾,它并不回收!  
        2.是否是循环套接层数太多导致资源得不到释放,或者存在死循环,后者的可能性恨大。  
        3.Tomcat 不支持EJB组件的开发,做j2ee项目时,最好还是用weblogic服务,而且在做基本的sql语句时,最好用连接池,不要多用jdbc,odbc桥,因为在建立连接时最耗时间  

         解决方法是让tomcat自己管理内存,在startup.bat的@echo off下面添加以下代码:  
    set JAVA_OPTS=%JAVA_OPTS% 

    -Dcom.sun.management.jmxremote.port=1090 

    -Dcom.sun.management.jmxremote.ssl=false 

    -Dcom.sun.management.jmxremote.authenticate=false 

    -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 

    -Djava.util.logging.config.file="%CATALINA_HOME%\conf\logging.properties"  

         然后再启动startup.bat,tomcat就会自己管理内存了.  
          
         另外事实上,这是一个优化。因为对于操作系统,请求内存的系统调用会占用大量的cpu时间,所以频繁的请求、释放内存将会导致性能的严重下降。所以对于 jvm,最好的方式就是尽量多占用内存作为heap,少释放甚至不释放空闲的heap给操作系统以减少消耗在内存请求、释放操作上的cpu时间。  
           PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。  

    改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m 

    -------------------------------------------------------------------------------------------------------------------------------------

    先试试这个:
    -Xms64m 
    -Xmx256m 
    -XX:PermSize=128M 
    -XX:MaxNewSize=256m 
    -XX:MaxPermSize=256m   

    下面是找了2篇文章

    答案1
    设置Tomcat启动的初始内存
    其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可
    进行设置
    三、实例,以下给出1G内存环境下java jvm 的参数设置参考:
    JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
    JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: 
    NewSize=192m -XX:MaxNewSize=384m"
    CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m 
    -XX:NewSize=192m -XX:MaxNewSize=384m"
    Linux:
    在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh
    添加:JAVA_OPTS='-Xms512m -Xmx1024m'
    要加“m”说明是MB,否则就是KB了,在启动tomcat时会 报内存不足。
    -Xms:初始值
    -Xmx:最大值
    -Xmn:最小值
    Windows
    在catalina.bat最前面加入
    set JAVA_OPTS=-Xms128m -Xmx350m 
    如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.
    但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,
    就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..
    windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.
    解决办法:
    修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
    原值为
    -Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
    -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
    -Xrs
    加入 -Xms300m -Xmx350m  
    重起tomcat服务,设置生效 

    展开全文
  • 某日,同事反馈数据库节点2无法连接,持续发出探测告警,报错信息如下:根据连接报错信息,可以看到提示Nospace left ...既然知道了原因,则清理清理相关日志信息问题将会得到解决。进入/oracle核实目录空间使用信息,...
  • 出现以下错误,后来把tomcat的内存增大到1024  严重: Exception initializing page context  java.lang.OutOfMemoryError: Java heap space     在tomcat\bin\catalina.batset CURRENT_DIR=%cd% ...
  • 在上文优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。...本篇将贴一个笔者实验脚本,用以说明Python确实存在这么一个不释放内存的现象,另外也提出一个解决方案,即:先del,再显式调...
  • zlog一直不释放内存

    2020-11-27 16:26:57
    就解决了内存一直不释放的问题,但是这样又会出现另外的问题:当zlog_fini、 zlog_init 、 zlog_reload和dzlog的函数在不同的线程的情况下,在打日志的时候会崩溃,原因是zlog_default_...
  • 当自己使用堆栈内存不多时,表现不出来错误;有时多加一个Format函数调用,里面调用SetString函数时,出现GetMem失败问题(一直死循环,或者抛出异常),是因为已经分配到结构被破坏内存链表。   ...
  • 原因:造成失败的原因是分配和释放内存不是由相同的堆管理程序完成的,例如动态链接库中的堆在默认情况下是由msvcrt.dll中的堆管理程序管理的(以动态链接的方式),而exe程序的堆在默认情况下是由程序自己的代码管理...
  • 随着手机使用频率增加,人们越来越离开它,如果某天...其实很可能是这些原因造成,如果你这么做话说不定能轻松释放内存原因一:后台运行软件过多手机内存一般可分为运行内存和非运行内存,一般运行内存...
  • 随着信息化的推进,系统的依赖性也...发现JVM的内存持续升高,知道内存溢出,一开始我以为是list太大的原因,我将list固定到1w,然后不断循环去数据库取数据,发现问题依旧存在,没有任何改变,所以说明问题的出处,
  • 指针的内存释放

    千次阅读 2016-09-18 16:15:59
     最近总是想明白,一个函数返回一个内存或者对象指针,那么这个指针指向对象(内存)到底由谁来释放?要知道,函数返回指针,通常是给外部临时使用,其指向的内存通常由函数或者成员函数所在对象自己来...
  • 出现以下错误,后来把tomcat的内存增大到1024  严重: Exception initializing page context  java.lang.OutOfMemoryError: Java heap space     在tomcat\bin\catalina.batset CURRENT_DIR=%cd% ...
  • c++程序崩溃后内存没有释放的问题

    千次阅读 2018-08-10 14:09:16
    如果程序没有通过delete、free语句现实释放内存的话,不论是崩溃(崩溃前为...这是一个致命bug:加入程序持续运行多次,则可能在后面某一此中因内存溢出而崩溃,而可能根本找原因(因为前几次都是正确)。...
  • Centos 内存释放

    2018-01-22 14:26:00
    原因:最近发现服务器老师提示内存不足警报,很多时候内存都占用百分之80以上,查看运行服务似乎并没有占用很大的内存,top查看运行服务,然后按shift+m排名第一才百分之1.x,看了别人博客说:google上...
  • 使用多线程遍历或操作集合对象时候,务必要注意内存的及时释放,否则一小心就触发内存峰值而闪退了。 最近新版本发布后,有较多用户反馈闪退;经过部分走访用户初步得出结论是内存闪退,而且和PHPLibrary相关...
  • 一、产生的原因shared_ptr的产生与unique_ptr类似,都是为了解决raw pointer的new和delete的成对使用,导致的野指针、内存泄漏、重复释放内存等。不过sha...
  • 内存泄露是指当不再使用的对象没有得到释放,还占有内存...原因一般产生内存泄露的原因主要有如下两种:第一种,没有释放需要的内存;第二种,内存对象明明已经需要,但还保留着这块内存和它的访问引用。在jav...
  • 如何释放内存

    2019-02-21 17:54:51
    很多情况下 ,因为内存的原因导致GTS过来。下面介绍下解决方法。   1:其实手机软件本身也会释放内存,即GC。GC后很多无用的对象释放后,应用的内存也会相应的降低。 2:但是有些时候在测试CTS的时候,获取...
  • 原因:重复Dim Web As New Webbrowser。感觉这是WebbrowserBug,重复创建释放调用Dispose也没用。 解决办法:定义为全局变量,只创建一次。
  • 在上篇博客中,提到了对一个脚本进行...本篇博客将贴一个笔者实验脚本,用以说明Python确实存在这么一个不释放内存的现象,另外也提出一个解决方案,即:先del,再显式调用gc.collect(). 脚本和具体效果见下。 实验
  • 这几天做LINUX实验时候,发觉自己删除了一个大文件后用 df -h 指令检测磁盘空间,发现空间并没有减少,后来仔细查询,总结出以下三种不释放内存的可能: 一、该文件已经建立硬链接 这个原因很简单,hardlink是指...
  • 希望各位老大帮忙分析一下准确的原因。 基于上面的推测和我们项目的需求,我把navmesh文件读取的方式改为内存映射的方式读取之后,Linux平台的内存占用已经正常了。</p><p>该提问来源于开源项目:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,764
精华内容 705
关键字:

内存不释放的原因