如何解决ORA-04031错误

诊断并解决ORA-04031错误

    当我们在共享池中试图分配大片的连续内存失败的时候,Oracle首先清除池中当前没使用的所有对象,使空闲内存块合并。如果仍然没有足够大单个的大块内存满足请求,就会产生ORA-04031错误。

当这个错误出现的时候你得到的错误解释信息类似如下:

 1 [oracle@yft ~]$ oerr ora 04031
 2 04031, 00000, "unable to allocate %s bytes of shared memory (\"%s\",\"%s\",\"%s\",\"%s\")"
 3 // *Cause:  More shared memory is needed than was allocated in the shared
 4 //          pool.
 5 // *Action: If the shared pool is out of memory, either use the
 6 //          DBMS_SHARED_POOL package to pin large packages,
 7 //          reduce your use of shared memory, or increase the amount of
 8 //          available shared memory by increasing the value of the
 9 //          initialization parameters SHARED_POOL_RESERVED_SIZE and 
10 //          SHARED_POOL_SIZE.
11 //          If the large pool is out of memory, increase the initialization
12 //          parameter LARGE_POOL_SIZE.  

1、共享池相关的实例参数

    在继续之前,有必要理解下面的实例参数:

        SHARED_POOL_SIZE

        这个参数指定了共享池的大小,单位是字节。可以接受数字值或者数字后面跟上后缀"K"或"M"。"K"代表千字节,"M"代表兆字节。

        SHARED_POOL_RESERVED_SIZE

        指定了为共享池内存保留的用于大的连续请求的共享池空间。当共享池碎片强制使Oracle查找并释放大块未使用的池来满足当前的请求的时候,这个参数和SHARED_POOL_RESERVED_MIN_ALLOC参数一起可以用来避免性能下降。

        这个参数理想的值应该大到足以满足任何对保留列表中内存的请求扫描而无需从共享池中刷新对象。既然操作系统内存可以限制共享池大小,一般来说,你应该设定这个参数为SHARED_POOL_SIZE参数的10%大小。

        SHARED_POOL_RESERVED_MIN_ALLOC这个参数的值控制保留内存的分配。如果一个足够尺寸的大块内存在共享池空闲列表中没能找到,内存就从保留列表中分配一块比这个值大的空间。默认的值对于大多数系统来说都足够了。如果你加大这个值,那么Oracle服务器将允许从这个保留列表中更少的分配并且将从共享池列表中请求更多的内存。这个参数在Oracle 8i和更高的版本中是隐藏的。提交如下的语句查找这个参数值:

SQL> col name for a20;
SQL> col value for a20;
SQL> select nam.ksppinm name,val.ksppstvl value2    from x$ksppi nam,x$ksppsv val3   where nam.indx = val.indx and nam.ksppinm like '%shared%'4  order by 1;

        10g注释:Oracle 10g的一个新特性叫做:"自动内存管理"允许DBA保留一个共享内存池来分shared pool,buffer cache,java pool和large pool。一般来说,当数据库需要分配一个大的对象到共享池中并且不能找到连续的可用空间,将自动使用其他SGA结构的空闲空间来增加共享池的大小。既然空间分配是Oracle自动管理的,ora-04031出错的可能性将大大降低。自动内存管理的初始化参数SGA_TARGET大于0的时候被激活。当前设定可以通过查询v$sga_dynamic_components视图获得。请参考10g管理手册以得到更多的内容。

 2.诊断ORA-04031错误

    注:大多数的常见的ORA-04031的产生和SHARED POOL SIZE有关,这篇文章中的诊断步骤大多都是关于共享池的。对于其它方面如large_pool或是java_pool,内存分配算法都是相似的,一般来说都是因为结构不够大造成。

    ORA-04031可能是因为SHARED POOL不够大,或是因为碎片问题导致数据库不能找到足够大的内存块。

    ORA-04031错误通常是因为库高速缓冲中或共享池保留空间中的碎片。在加大共享池大小的时候考虑调整应用,使用共享的SQL并且调整如下的参数:

        SHARED_POOL_SIZE,

        SHARED_POOL_RESERVED_SIZE,

        SHARED_POOL_RESERVED_MIN_ALLOC.

    首先判定是否ORA-04031错误是由共享池保留空间中的库高速缓冲的碎片产生的。提交下面的查询:

1 SQL> set linesize 200;
2 SQL> select free_space,avg_free_size,used_space,avg_used_size,request_failures,
3   2      last_failure_size
4   3  from v$shared_pool_reserved;
5 
6 FREE_SPACE AVG_FREE_SIZE USED_SPACE AVG_USED_SIZE REQUEST_FAILURES LAST_FAILURE_SIZE
7 ---------- ------------- ---------- ------------- ---------------- -----------------
8    4700660    167880.714   16333900    583353.571         0    

    如果:

            REQUEST_FIIURES > 0 并且LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC

    那么ORA-04031错误就是因为共享池保留空间缺少连续空间所致。要解决这个问题,可以考虑加大SHARED_POOL_RESERVED_MIN_ALLOC来降低缓冲进共享池保留空间的对象数目,并增加SHARED_POOL_RESERVED_SIZE和SHARED_POOL_SIZE来加大共享池保留空间的可用内存。

    如果:

        REQUEST_FAILURES > 0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

    或者

        REQUEST_FAILURES 等于0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

    那么是因为在库高速缓冲缺少连续空间导致ORA-04031错误。

    第一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC以放入更多的对象到共享池,保留空间中并且加大SHARED_POOL_SIZE。

3.解决ORA-04031错误

    ORACLE BUG

    Oracle推荐对你的系统打上最新的PatchSet。大多数的ORA-04031错误都和BUG相关,可以通过使用这些补丁来避免。

    下面表中总结和这个错误相关的最常见的BUG、可能的环境和修补这个问题的补丁。

     编译Java代码时出现的ORA-04031

     在你编译Java代码的时候如果内存溢出,你会看到错误:

1 A SQL exception occurred while compiling:
2 ORA-04031: unable to allocate bytes of shared memory
3 ("shared pool","unknown object","joxlod: init h","JOX: ioc_allocate_pal")

    解决办法是关闭数据库然后把参数JAVA_POOL_SIZE设定为一个较大的值。这里错误信息中提到的"shared pool"其实共享全局区(SGA)溢出的误导,并不表示你需要增加SHARED_POOL_SIZE,相反,你必须加大JAVA_POOL_SIZE参数的值,然后重启系统,再试一下。参考:<Bug:2736601>。

    小的共享池尺寸

    很多情况下,共享池过小能够导致ORA-04031错误。下面信息有助于你调整共享池大小:

        库高速缓冲命中率

        命中率有助于你衡量共享池的使用,有多少语句需要被解析而不是重用。下面的SQL语句有助于你计算库高速缓冲的命中率:

1 SQL> select sum(pins) "executions",
2   2            sum(reloads) "cache misses while executing"
3   3    from v$librarycache;
4 
5 executions cache misses while executing
6 ---------- ----------------------------
7      29634                131

        如果丢失超过1%,那么尝试通过加大共享池的大小来减少库高速缓冲丢失。

        共享池大小计算

        要计算最合适你工作负载的共享池大小,请参考:

        <Note:1012046.6>:HOW TO CALCULATE YOUR SHARED POOL SIZE.

        共享池碎片

        每一次,需要被执行的SQL或者PL/SQL语句的解析形式载入共享池中都需要一块特定的连续的空间。数据库要扫描的第一个资源就是共享池中的空闲可用内存。一旦空闲内存耗尽,数据库要查找一块已经分配但还没使用的内存准备重用。如果这样的确切尺寸的大块内存不可用,就继续按照如下标准寻找:

        大块(chunk)大小比请求的大小大;

        空间是连续的;

        大块内存是可用的(而不是正在使用的)。

    这样大块的内存被分开,剩余的添加到相应的空闲空间列表中。当数据库以这种方式操作一段时间之后,共享池结构就会出现碎片。

    当共享池存在碎片的问题,分配一片空闲的空间就会花费更多的时间,数据库性能也会下降(整个操作的过程中,"chunk allocation"被一个叫做"shared pool latch"的闩所控制)或者是出现ORA-04031错误errors(在数据库不能找到一个连续的空闲内存块的时候)。

        参考<Note:616223.1>:可以得到关于共享池碎片的详细讨论。

    如果SHARED_POOL_SIZE足够大,大多数的ORA-04031错误都是由共享池中的动态SQL碎片导致的。可能的原因如下:

        非共享的SQL;

        生产不必要的解析调用(软解析);

        没有使用绑定变量

    要减少碎片的产生你需要确定是前面描叙的几种可能的因素。可以采取如下的一些方法,当然不只局限于这几种:应用调整、数据库调整或者实例参数调整。

    请参考<Note:62143.1>,描述了所有的这些细节内容。这个注释还包括了共享池如何工作的细节。

    下面的视图有助于你标明共享池中非共享的SQL/PLSQL:

         V$SQLAREA视图

        这个视图保存了在数据库中执行的SQL语句和PL/SQL块的信息。下面的SQL语句可以显示给你带有literal的语句或者是带有绑定变量的语句:

1 SQL> col sql_text for a45;
2 SQL> select substr (sql_text,1,40) "SQL",count(*),
3   2     sum (executions) "TotExecs"
4   3    from v$sqlarea
5   4     where executions < 5
6   5  group by substr (sql_text,1,40)
7   6    having count(*) > 30
8   7  order by 2;

        注:Having后的数值"30"可以根据需要调整以得到更为详细的信息。

        X$KSMLRU视图

        这个固定表x$ksmlru跟踪共享池中导致其它对象换出(age out)的应用。这个固定表可以用来标记是什么导致了大的应用。

        如果很多对象在共享池中都被阶段性的刷新可能导致响应时间问题并且有可能在对象重载入共享池中的时候导致库高速缓冲闩竞争问题。

        关于这个x$ksmlru表的一个不寻常的地方就是如果有人从表中选取内容这个表的内容就会被擦除。这样这个固定表只存储曾经发生的最大的分配。这个值在选择后被重新设定这样接下来的大的分配可以被标记,即使它们不如先前的分配过的大。因为这样的重置,在查询提交后的结果不可以再次得到,从表中的输出的结果应该小心的保存。监视这个固定表运行如下操作:

1 SQL> select * from x$ksmlru where ksmlrsiz > 0;

        这个表只可以用SYS用户登录进行查询。

        X$KSMSP视图(类似堆Heapdump信息)

        使用这个视图能找出当前分配的空闲空间,有助于理解共享池碎片的程度。如我们在前面的描述,查找为游标分配的足够的大块内存的第一个地方是空闲列表(free list)。下面的语句显示了空闲列表中的大块内存:

SQL> SELECT   '0 (<140)' bucket, ksmchcls, 10 * TRUNC (ksmchsiz / 10) "From",COUNT (*) "Count", MAX (ksmchsiz) "Biggest",TRUNC (AVG (ksmchsiz)) "AvgSize", TRUNC (SUM (ksmchsiz)) "Total"FROM x$ksmspWHERE ksmchsiz < 140 AND ksmchcls = 'free'
GROUP BY ksmchcls, 10 * TRUNC (ksmchsiz / 10)
UNION ALL
SELECT   '1 (140-267)' bucket, ksmchcls, 20 * TRUNC (ksmchsiz / 20),COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",TRUNC (SUM (ksmchsiz)) "Total"FROM x$ksmspWHERE ksmchsiz BETWEEN 140 AND 267 AND ksmchcls = 'free'
GROUP BY ksmchcls, 20 * TRUNC (ksmchsiz / 20)
UNION ALL
SELECT   '2 (268-523)' bucket, ksmchcls, 50 * TRUNC (ksmchsiz / 50),COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",TRUNC (SUM (ksmchsiz)) "Total"FROM x$ksmspWHERE ksmchsiz BETWEEN 268 AND 523 AND ksmchcls = 'free'
GROUP BY ksmchcls, 50 * TRUNC (ksmchsiz / 50)
UNION ALL
SELECT   '3-5 (524-4107)' bucket, ksmchcls, 500 * TRUNC (ksmchsiz / 500),COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",TRUNC (SUM (ksmchsiz)) "Total"FROM x$ksmspWHERE ksmchsiz BETWEEN 524 AND 4107 AND ksmchcls = 'free'
GROUP BY ksmchcls, 500 * TRUNC (ksmchsiz / 500)
UNION ALL
SELECT   '6+ (4108+)' bucket, ksmchcls, 1000 * TRUNC (ksmchsiz / 1000),COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",TRUNC (SUM (ksmchsiz)) "Total"FROM x$ksmspWHERE ksmchsiz >= 4108 AND ksmchcls = 'free'GROUP BY ksmchcls, 1000 * TRUNC (ksmchsiz / 1000);BUCKET           KSMCHCLS       From    Count     Biggest    AvgSize     Total
-------------- -------- ---------- ---------- ---------- ---------- ----------
0 (<140)       free        20       36          28     24       884
0 (<140)       free        70       10          76     73       736
0 (<140)       free        40       13          48     46       604
0 (<140)       free           100        2         108    106       212
0 (<140)       free        80       20          88     85      1708
0 (<140)       free        50       15          56     52       792
0 (<140)       free        30       22          36     34       764
0 (<140)       free           120        7         120    120       840
0 (<140)       free        60       11          68     63       696
1 (140-267)    free           240        1         248    248       248
1 (140-267)    free           220        1         228    228       228BUCKET           KSMCHCLS       From    Count     Biggest    AvgSize     Total
-------------- -------- ---------- ---------- ---------- ---------- ----------
1 (140-267)    free           200        2         208    206       412
1 (140-267)    free           140        1         156    156       156
2 (268-523)    free           400        1         416    416       416
2 (268-523)    free           450        2         476    476       952
3-5 (524-4107) free          1000        2        1424       1224      2448
3-5 (524-4107) free           500        2         880    712      1424
3-5 (524-4107) free          1500        1        1532       1532      1532
6+ (4108+)     free       1646000        1     1646592    1646592    1646592
6+ (4108+)     free          9000        1        9432       9432      9432
6+ (4108+)     free       1915000        1     1915828    1915828    1915828
6+ (4108+)     free       3891000        1     3891140    3891140    389114022 rows selected.

4.ORA-04031错误与Large Pool
    大池是个可选的内存区,为以下的操作提供大内存分配:

        MTS会话内存和Oracle XA接口;

        Oracle备份与恢复操作和I/O服务器进行用的内存(缓冲);

        并行执行消息缓冲。

    大池没有LRU列表。这和共享池中的保留空间不同,保留空间和共享池中其他分配的内存使用同样的LRU列表。大块内存从不会换出大池中,内存必须是显式的被每个会话分配并释放。一个请求如果没有足够的内存,就会产生类似这样的一个ORA-04031错误:

1 ORA-04031:unable to allocate XXXX bytes of shared memory
2 ("large pool","unknown object","session heap","frame")

这个错误发生时候可以检查几件事情:
        1).使用如下语句检查v$sgastat,得知使用和空闲的内存:

1 SQL> select pool,name,bytes from v$sgastat where pool = 'large pool';
2 
3 POOL         NAME                 BYTES
4 ------------ -------------------------- ----------
5 large pool   PX msg pool            491520
6 large pool   free memory           3702784

        2).你还可以采用heapdump level 32来dump大池的堆并检查空闲的大块内存的大小
        从大池分配的内存如果是LARGE_POOL_MIN_ALLOC子节的整块数有助于避免碎片。任何请求分配小于LARGE_POOL_MIN_ALLOC大块尺寸都将分配LARGE_POOL_MIN_ALLOC的大小。一般来说,你会看到使用大池的时候相对共享池来说要用到更多的内存。通常要解决大池中的ORA-04031错误必须增加LARGE_POOL_SIZE的大小。

5.ORA-04031和共享池刷新

     有一些技巧提高游标的共享能力,从而共享池碎片和ORA-04031都会减少。最佳途径是调整应用使用绑定变量。另外在应用不能调整的时候考虑使用CURSOR_SHARING参数和FORCE不同的值来做到(要注意那会导致执行计划改变,所以建议先对应用进行测试)。当上述技巧都不可以用的时候,并且碎片问题在系统中比较严重,刷新共享池可能有助于减轻碎片问题。但是,必须加以如下考虑:

         刷新将导致所有没有被使用的游标从共享池删除。这样,在共享池刷新之后,大多数SQL和PL/SQL游标必须被硬解析。这将提供CPU的使用,也会加大Latch的活动。

         当应用程序没有使用绑定变量并被需要用户进行类似的操作的时候(如在OLTP系统中),刷新之后会很快还会出现碎片问题。所以共享池对设计糟糕的应用程序来说不是解决办法。

         对一个大的共享池刷新可能会导致系统挂起,尤其是实例繁忙的时候,推荐的非高峰的时候刷新

6.ORA-04031错误的高级分析

    如果前述的这些技术内容都不能解决ORA-04031错误,可能需要额外的跟踪信息来得到问题发生的共享池的快照。

    调整init.ora参数添加如下的事件得到该问题的跟踪信息:

event = "4031 trace name errorstack level 3"

event = "4031 trace name HEAPDUMP level 3"

    如果问题可重现,该事件可设定在会话层,在执行问题语句之前使用如下的语句:

SQL>alter session set events '4031 trace name errorstack level 3';

SQL>alter session set events '4031 trace name HEAPDUMP level 3';

    把这个跟踪文件发给Oracle支持人员进行排错。

 

转载于:https://www.cnblogs.com/Richardzhu/articles/2922249.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Idea新建modules后无法自动导入pom.xml

Idea新建modules后无法自动导入pom.xml打开设置&#xff0c;搜索Maven&#xff0c;打开Importing&#xff0c;将红色箭头部分勾选 打开Ignored Files&#xff0c;将红色箭头部分都取消勾选 点击右侧工具栏的maven选项&#xff0c;点击红色箭头部分的Reimport All Maven Proje…

宝剑锋从磨砺出——使用在线评测平台磨砺C#使用能力

学数学的时候&#xff0c;我们通常会通过大量的练习题来巩固所学知识&#xff1b;其实学习程序设计设计语言也不例外。那么如何通过练习去磨砺自己的C#使用能力呢&#xff1f;一个方法是参与到实际的软件项目开发中&#xff0c;而另一个更加直接的方法则是“做题”。 去哪里找练…

java多线程学习-java.util.concurrent详解(一) Latch/Barrier

2019独角兽企业重金招聘Python工程师标准>>> Java1.5提供了一个非常高效实用的多线程包&#xff1a;java.util.concurrent, 提供了大量高级工具&#xff0c;可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。从这篇blog起&#xff0c;我将跟大家一起共同…

Java Websocket实例

2019独角兽企业重金招聘Python工程师标准>>> 介绍 现很多网站为了实现即时通讯&#xff0c;所用的技术都是轮询(polling)。轮询是在特定的的时间间隔&#xff08;如每1秒&#xff09;&#xff0c;由浏览器对服务器发出HTTP request&#xff0c;然后由服务器返回最新…

Go学习笔记—并发高级

Go并发机制 ​ 协程&#xff1a;一个线程可以对应多个协程&#xff0c;协程串行运行在用户空间。协程运行在线程之上&#xff0c;当一个协程执行完成后&#xff0c;可以选择主动让出&#xff0c;让另一个协程运行在当前线程之上。协程并没有增加线程数量&#xff0c;只是在线程…

设计模式C++学习笔记之十三(Decorator装饰模式)

装饰模式&#xff0c;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;Decorator模式相比生成子类更为灵活。 13.1.解释 main()&#xff0c;老爸 ISchoolReport&#xff0c;成绩单接口 CFourthGradeSchoolReport&#xff0c;四年级成绩单 ReportDecorator&…

程序员编程艺术:第二章、字符串是否包含问题

程序员编程艺术&#xff1a;第二章、字符串是否包含及相关问题扩展 作者&#xff1a;July&#xff0c;yansha。时间&#xff1a;二零一一年四月二十三日。致谢&#xff1a;老梦&#xff0c;nossiac&#xff0c;Hession&#xff0c;Oliver&#xff0c;luuillu&#xff0c;雨翔&a…

Rapidmind计算库性能测试

rapidmind.net提供了免费的计算库下载&#xff0c;目的是使用C metaprogramming将计算与硬件平台隔离开来&#xff0c;它提供一套运行库做底层的优化工作。为了测试其真正的性能&#xff0c;以便于在未来的渲染器中使用&#xff0c;我做了一个简单的性能测试程序&#xff0c;将…

VMware 怎么进入BIOS

2019独角兽企业重金招聘Python工程师标准>>> 虚拟机(Vmware)引导Linux虚拟机时&#xff0c;需要设置成光盘启动来引导系统&#xff0c;但是vmware默认是硬盘启动&#xff0c;所以会启动不了或者别的问题存在。所以要进bios里面设置成开机的启动顺序&#xff0c;要将…

SVN钩子HOOK设置自动备份,服务本地可以看到所有更新内容。

可以实现SVN本机备份。或者其他备份。关键是可以保持有一份最新的SVN文件可以查看。 实现SVN与WEB同步,可以CO一个出来,也可以直接用自动更新web目录的方法&#xff0c;我们要在svn版本库中配置钩子来实现&#xff0c;就是创建一个post-commit的配置文件&#xff0c;对其进行简…

OSChina 周四乱弹 —— 熊孩子毁灭世界

2019独角兽企业重金招聘Python工程师标准>>> 小伙伴们赶快起床&#xff0c;开源中国要出大事啦~ 为方便大家搜索开源软件&#xff0c;开源中国决定整理 IT 公司开源软件。初步列表不一定完善&#xff0c;小伙伴们有什么意见可以向小小编或者红薯提出来~ 好啦好啦&am…

Redis主备安装

2019独角兽企业重金招聘Python工程师标准>>> 采用主备部署方式&#xff0c;Master不做数据持久化操作&#xff0c;仅Slave做数据持久化操作&#xff0c;Slave采用AOF二进制日志文件作为持久化方案&#xff0c;默认每秒持久化一次。 安装 1. 下载源代码文件redis-2…

数据库设计三大范式【转载】

数据库设计范式 什么是范式&#xff1a;简言之就是&#xff0c;数据库设计对数据的存储性能&#xff0c;还有开发人员对数据的操作都有莫大的关系。所以建立科学的&#xff0c;规范的的数据库是需要满足一些 规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为…

Visual C++2010的使用

Tools->Settings>Rest... 还原所有设置 运行程序&#xff1a;"D:\Program Files\VCExpress\Install\Microsoft Visual Studio 10.0\Common7\IDE\VCExpress.exe" 一、Visual C2010&#xff08;微软vc2010&#xff09;如何编写并运行C程序&#xff1f; 1、刚开始…

linux下时间同步的两种方法分享

为什么80%的码农都做不了架构师&#xff1f;>>> 方法1&#xff1a;与一个已知的时间服务器同步 ntpdate time.nist.gov 方法2&#xff1a;linux自动同步时间vi /etc/crontab 00 0 1 * * root rdate -s time.nist.gov 转载于:https://my.oschina.net/boltwu/blo…

.Net TCP/UDP 编程 【一】【原创】

命名空间&#xff1a; using System.Net;using System.Net.Sockets; 关键 &#xff1a; TCP /UDP连接 UDP UDP 与 tCP的主要区别在于 UDP 不一定提供可靠的数据传输。事实上&#xff0c;该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽…

maven配置_eclipse创建maven_maven插件配置

为什么80%的码农都做不了架构师&#xff1f;>>> 最近项目开发中需要使用maven。Maven这个东西是我2年前自学的。这2年之中基本没有使用过。现在项目需要&#xff0c;只有重新来一遍回锅肉。重新学习。经过一下午的斗争&#xff0c;一下午的各种问题各种解决&#x…

老生又长谈:HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期

IIS在接到一个新的http请求后&#xff0c;最终会调用asp.net_isapi.dll的ISAPI扩展(特指IIS6.0环境&#xff0c;iis7.0的应用程序池默认为集成方式&#xff0c;相对有所变化)&#xff0c;然后传递到httpRuntime Pipe(http运行时管道)&#xff0c;Asp.Net这时才开始运行(即HttpR…

ByteBuffer常用方法详解

缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储&#xff0c;这部分预留的内存空间就叫做缓冲区&#xff1a; 使用缓冲区有这么两个好处&#xff1a; 1、减少实际的物理读写次数 2、缓冲区在创建时就被分配内存&#xff0c;这块内存区域…

LeetCode—221. 最大正方形

221. 最大正方形 题目描述&#xff1a; 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 考察重点&#xff1a;动态规划 方法概括&#xff1a;二维矩阵中查询最大矩形 dp[i][j] Min(dp[i-1][j],dp[i][j-1]…