精华内容
下载资源
问答
  • 有的时候,我们需要一次查询很多的数据,或者是说每次查询的数据量都很大,都有可能早晨内存溢出情况,所以我们今天分别针对三个数据库来探讨如何避免这一问题。
  • php内存溢出情况

    千次阅读 2019-04-18 14:14:07
    1.上传excel文件时,出现内存溢出情况 在文件中分配大点的内存设置内存治标不治本,而且服务器的php.ini有时候是很难改的。所以在文件中设置。但是只有php.ini中的安全模式safe_mode开启时才可以设置 ini_set('...

    报错情况:PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
    1.上传excel文件时,出现内存溢出的情况
    在文件中分配大点的内存设置内存治标不治本,而且服务器的php.ini(memory_limit =
    128M)有时候是很难改的。所以在文件中设置。但是只有php.ini中的安全模式safe_mode开启时才可以设置

    ini_set('memory_limit', '521M');
    

    解决方法:

    protected/extensions/ExcelHelper.php 中         945行 $PHPReader->setReadDataOnly(true);  //在拿到数据后进行设置只读
        public static function importFromExcel($filePath, $blankRowDel = false)
        {
            set_time_limit(90);
            Yii::import('application.extensions.phpexcel.PHPExcel');
            $PHPExcel = new PHPExcel();
            //默认用excel2007读取excel,若格式不对,则用之前的版本进行读取
            $PHPReader = new PHPExcel_Reader_Excel2007();
            if (!$PHPReader->canRead($filePath)) {
                $PHPReader = new PHPExcel_Reader_Excel5();
                if (!$PHPReader->canRead($filePath)) {
                    throw new Exception('can not read the excel file');
                }
            }
            $PHPReader->setReadDataOnly(true);
    
            $PHPExcel      = $PHPReader->load($filePath);
            $allSheetCount = $PHPExcel->getSheetCount();
            $excelData     = array();
            for ($currentSheetNum = 0; $currentSheetNum < $allSheetCount; $currentSheetNum++) {
                //读取excel文件中的第一个工作表
                $currentSheet = $PHPExcel->getSheet($currentSheetNum);
                //取得当前表名
                $currentSheetTitle = $currentSheet->getTitle();
                //取得最大的列号
                $allColumn = $currentSheet->getHighestColumn();
                //取得一共有多少行
                $allRow = $currentSheet->getHighestRow();
                // 从第一行获取列名
                $currentRow = 1;
                // 从第A列开始输出
                $colunmNameArray = array();
                $max_column_num  = PHPExcel_Cell::columnIndexFromString($allColumn);
                for ($current_column_num = 0; $current_column_num <= $max_column_num; $current_column_num++) {
                    $currentColumn = PHPExcel_Cell::stringFromColumnIndex($current_column_num);
                    $val           = $currentSheet->getCellByColumnAndRow($current_column_num, $currentRow)->getValue();
                    if (empty($val)) {
                        continue;
                    }
                    if (is_object($val)) {
                        $colunmNameArray[$currentColumn] = '';
                        foreach ($val->getRichTextElements() as $cell) {
                            $colunmNameArray[$currentColumn] .= $cell->getText();
                        }
                    } else {
                        $colunmNameArray[$currentColumn] = $val;
                    }
                }
    
                //从第二行开始输出,因为excel表中第一行为列名
                $sheetData = array();
                for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
                    //从第A列开始输出 */
                    $rowData   = array();
                    $blankCell = 0;
                    for ($current_column_num = 0; $current_column_num <= $max_column_num; $current_column_num++) {
                        $currentColumn = PHPExcel_Cell::stringFromColumnIndex($current_column_num);
                        $val           = $currentSheet->getCellByColumnAndRow($current_column_num, $currentRow)->getValue();
                        if (!isset($colunmNameArray[$currentColumn])) {
                            continue;
                        }
                        //如果输出汉字有乱码,则需将输出内容用iconv函数进行编码转换,如下将gb2312编码转为utf-8编码输出
                        if (is_object($val)) {
                            $rowData[$currentColumn] = '';
                            foreach ($val->getRichTextElements() as $cell) {
                                $rowData[$currentColumn] .= $cell->getText();
                            }
                        } else {
                            $rowData[$currentColumn] = $val;
                        }
    
                        if (empty($rowData[$currentColumn])) {
                            $blankCell++;
                        }
                    }
    
                    if (!$blankRowDel || chr($blankCell + 64) != $allColumn) {
                        $sheetData[] = $rowData;
                    }
                }
    
                $excelData[$currentSheetTitle] = array(
                    'header'  => $colunmNameArray,
                    'content' => $sheetData,
                );
            }
            return $excelData;
        }
    

    2.使用sql查询数据,查出来很多,导致内存溢出
    sql语句在mysql中可以查询,但是使用php程序查询就报php内存溢出
    (1)这个问题在php的官方网站叫缓冲查询和非缓冲查询。php的查询缺省模式是缓冲模式。也就是,查询数据结果一次全部提取到内存里供php程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序对数据集反复进行二次查询和过滤操作。但这种缓冲查询模式的缺陷是消耗内存,也就是用空间换速度。
    (2)另外一种查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果是php程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待php来取数据,一直到数据全部取完。
    1.首先查询数据库需要进行limit进行分页查询
    2.如果不使用limit,使用非缓冲查询

    1.mysql:
    $conn = mysql_connect("localhost", "user", "pass");
    $db   = mysql_select_db("world");
    $uresult = mysql_unbuffered_query("SELECT Name FROM City");    //非缓冲查询
    if ($uresult) {
       while ($row = mysql_fetch_assoc($uresult)) {
           echo $row['Name'] . PHP_EOL;
       }
    }
    
    2.pdo_mysql:
    $pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
    $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);    //设置这个属性,就为非缓冲查询
    $uresult = $pdo->query("SELECT Name FROM City");
    if ($uresult) {
       while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
           echo $row['Name'] . PHP_EOL;
       }
    }
    
    3.mysqli:
    $mysqli  = new mysqli("localhost", "user", "password", "world");
    $uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
    if ($uresult) {
       while ($row = $uresult->fetch_assoc()) {
           echo $row['Name'] . PHP_EOL;
       }
    }
    $uresult->close();
    
    

    3.处理数组时出现内存溢出
    (1)使用迭代生成器,可以通过继承Iterator接口实现
    (2)使用关键词yield

    function xrange($start, $end, $step = 1) {
        for ($i = $start; $i <= $end; $i += $step) {
            yield $i;
        }
    }
     
    foreach (xrange(1, 1000000) as $num) {
        echo $num, "\n";
    }
    

    https://segmentfault.com/q/1010000004590578

    展开全文
  • 主要介绍了编写Java代码制造一个内存溢出的情况,或许这种有意制造能够更好地帮助理解Java中的内存溢出情况XD 需要的朋友可以参考下
  • Android 内存溢出和内存泄漏的问题 在面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。 内存溢出 (OOM)是指程序在申请内存时,没有足够的内存空间...
  • Tomcat内存溢出三种情况及解决办法,不同的异常采用不同的方式解决,不能盲目的增加内存就可以了。
  • 主要介绍了解决golang内存溢出的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 在进行代码调试的时候,经常需要模拟内存溢出情况,这个时候就需要修改程序运行时堆内存的大小,从而在不影响当前主机的情况下,模拟简单的模拟出内存溢出情况。下面介绍一下,在idea中怎么修改程序运行时堆内存...

    在进行代码调试的时候,经常需要模拟内存溢出的情况,这个时候就需要修改程序运行时堆内存的大小,从而在不影响当前主机的情况下,模拟简单的模拟出内存溢出的情况。下面介绍一下,在idea中怎么修改程序运行时堆内存的大小。

    1. 在修改之前,先运行程序,使得当前的类出现的如图的位置

    2. 点击图中的Edit Configurations

    3. 在VM options中输入如下的参数(注意区分大小写),然后点击OK

      在这里插入图片描述

      内容为

      -Xms60m
      -Xmx60m
      -XX:+HeapDumpOnOutOfMemoryError
      -XX:HeapDumpPath=C:\Users\Administrator\Desktop\error_logs
      
    4. 再点击Save

      在这里插入图片描述

    5. 再次运行程序的时候,就会模拟出内存溢出的情况,并且能获取到相关的日志

      在这里插入图片描述

    6. 日志文件为

      在这里插入图片描述

    展开全文
  • 主要介绍了angular 内存溢出的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 内存溢出情况分析

    万次阅读 2020-08-10 09:35:58
    此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然...

    简介

    内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免。

    溢出原因

    内存溢出就是内存不够,引起内存溢出的原因有很多种,常见的有以下几种:
    1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

    2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

    3、代码中存在死循环或循环产生过多重复的对象实体;

    4、使用的第三方软件中的BUG;

    5、启动参数内存值设定的过小;
    当然实际情况中内存溢出的原因就太多了。下面我们就对这些原因分类一下:
    在这里插入图片描述
    以上的图是基于java7来叙述的,从上面这张图我们能够得到如下信息:java虚拟机把内存分为5个模块。
    (1)程序计数器:程序计数器是线程私有的,主要的作用是通过改变这个计数器的值来选取下一条需要执行的字节码指令。既然每个线程都有一个,那么这些线程的计数器是互不影响的。也不会抛出任何异常。

    (2)虚拟机栈和本地方法栈:虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。本地方法栈与虚拟机栈的区别是,虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机提供native方法服务。

    在单线程的操作中,无论是由于栈帧太大,还是虚拟机栈空间太小,当栈空间无法分配时,虚拟机抛出的都是StackOverflowError异常,而不会得到OutOfMemoryError异常。而在多线程环境下,则会抛出OutOfMemoryError异常。

    (3)java堆和方法区:java堆区主要存放对象实例和数组等,方法区保存类信息、常量、静态变量等等。运行时常量池也是方法区的一部分。这两块区域是线程共享的区域,只会抛出OutOfMemoryError。

    内存溢出实例

    1、堆溢出
    既然堆是存放实例对象的,那我们就无限创建实例对象。这样堆区迟早会满。
    在这里插入图片描述
    因为我提前设置了堆区内存,所以无限创建就会抛出异常。
    2、虚拟机栈和本地方法栈溢出
    Java虚拟机规范中描述了两种异常:

    如果线程请求的栈深度大于虚拟机锁允许的最大深度,将抛出StackOverflowError异常。
    如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。
    

    第一种我们只需要使用方法递归调用即可模拟:
    在这里插入图片描述
    第二种也可以递归调用模拟,,但是使用的是类直接调用。
    在这里插入图片描述
    3、方法区和运行时常量池溢出
    在这里插入图片描述
    4、本机直接内存溢出
    DirectMemory容量可通过-XX: MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值 (-Xmx指定)一样。
    在这里插入图片描述
    5、定时任务导致溢出
    报错定位:com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback
    分析:有时候我们需要一次性处理大量的数据几万甚至上百万,如果一次性加载到内存很可能导致OOM。如果使用Ibatis作为ORM映射工具,我们会用到RowHandler这个接口来处理。Ibatis中大致的实现思路是通过RowHandlerCallback封装一个RowHander对象从而在迭代都去每条记录时回调handleRow方法从而避免一次性全部加载到内存。不过需要注意的一点是:如果你的handleRow方法处理逻辑比较耗时这种方式处理的数据量很大的话可能大幅增加jdbc连接占用的时间,可能导致连接池吃紧的状况出现。
    原因:有一个定时任务会在特定的时间大批量更新表数据(平均每天一万条需要执行20分钟以上的更新操作最长一次1小时55分钟)的同时前端对同一张表频繁查询导致了数据库压力大,查询结果堆积直到内存被撑爆。

    内存溢出排查

    排查其实最主要的就是检查代码,而且内存溢出往往都是代码的问题。当然一下几点都是需要注意的:

    (1)内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

    (2)集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

    (3)代码中存在死循环或循环产生过多重复的对象实体;

    (4)使用的第三方软件中的BUG;

    (5)启动参数内存值设定的过小;

    最后就是解决了。

    第一步,修改JVM启动参数,直接增加内存。

    第二步,检查错误日志

    第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

    一般情况下代码出错的概率会比较大一些,当然了不同的场景不同错误总是复杂多样的。

    展开全文
  • 在进行多页面开发的时候,项目刚开始阶段,因为文件较少,所以代码编译速度还行,但是随着项目逐渐增大,webpack编译的速度越来越慢,并且经常出现内存溢出情况。 下面就是几种尝试的方法,加快编译的速度 增加...
  • 主要介绍了Python内存泄漏和内存溢出的解决方案,帮助大家维护后台进程,感兴趣的朋友可以了解下
  • 主要介绍了Android内存溢出及内存泄漏原因进行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 如上图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 第...

    解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

    如上图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决

    第一步:  全局安装  increase-memory-limit

    npm install -g increase-memory-limit

    第二步:  进入工程目录,执行:

    increase-memory-limit

    第三步:  重启项目即可(切记!!!)

    npm run dev

    第四步:  完美解决!!!

    可以的话点赞吧!!!

     

    转载于:https://www.cnblogs.com/maqingyuan/p/10636920.html

    展开全文
  • WAS 内存溢出分析

    2018-12-04 20:43:16
    Websphere Application Server WAS 内存溢出分析,帮助分析内存问题
  • jscript 5.7 发布修复了不少ie javascript内存泄露的问题。但是leak依然存在。当我们频繁使用 setInterval 和 setTimeout 时就会每几秒钟出现32k leak...
  • 下面小编就为大家带来一篇完美解决java读取大文件内存溢出的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 问题排查 可以通过 $ cat /sys/fs/cgroup/memory/kubepods/burstable/pod//memory.kmem.slabinfo 来查看是否存在bug,如果返回 cat: memory.kmem.slabinfo: Input/output error 则不存在bug 问题解决 ...
  • 转载自:...1、堆内存溢出情况一】:   Java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环;
  • 今天小编就为大家分享一篇解决Java导入excel大量数据出现内存溢出的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 下面小编就为大家带来一篇linux解决Tomcat内存溢出的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 易语言防止文件内存溢出源码,防止文件内存溢出,读入子程序
  • 如图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 全局安装increase-memory-limit npm install -g increase-memory-limit 进入工程目录,执行: increase-memory-limit ...
  • 我们经常会使用phpExcel导入或导入xls文件,但是如果一次导出数据比较大就会出现内存溢出错误,下面我来总结解决办法
  • 本篇文章主要分析了JAVA程序内存溢出问题原因,较为详细的说明了java导致程序内存溢出的原因与解决方法,感兴趣的小伙伴们可以参考一下。
  • 内存溢出xssfworkbook

    2019-04-28 17:01:07
    File test = new File("D:\\test.xlsx"); try { XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(test)); SXSSFWorkbook workbook = new SXSSFWorkbook(wb); Sheet sheet = workbook.getSheetAt...
  • 完美解决java读取excel内存溢出问题,希望可以帮到大家
  • 主要介绍了MySQL OOM(内存溢出)的解决思路,文中讲解非常细致,帮助大家在学习工作中解决内存溢出的问题,感兴趣的朋友可以了解下
  • 超实用内存溢出解决方法,包括各种tomcat配置方法。以及注册服务前后的配置的区别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 331,536
精华内容 132,614
关键字:

内存溢出的情况