内存不释放???

afeideweixiao 2012-04-24 11:43:10
各位好!请教个问题,我不断地往oracle里插入数据,oracle会出现内存不断飙升,o只到电脑内存不足而挂掉。
系统为WINDOWS 2003,
刚开启时,ORACLE.EXE使用内存为200M左右,任务管理器下的显示内存使用为1020M/3428M;
运行几个小时后,ORACLE.EXE使用内存变为600M,而任务管理器下显示内存使用高达2987M/3428M。
请问是什么原因呢?谢谢了。。。

插入测试代码如下:

int main()
{
Environment * env = Environment::createEnvironment( " ZHS16GBK " , " UTF8 " );
char *szInsert = "某插入语句";

string mc;
{
Connection * conn = env->createConnection( " system " , " system " , " orcl_192.168.0.3 " );

try
{
while (1)
{
Statement * stmt = conn->createStatement(szInsert );
stmt->executeUpdate();
conn->terminateStatement(stmt);
conn->commit();
Sleep(10); //10毫秒
}
}
catch (SQLException e)
{
cout << e.what();
}
env -> terminateConnection(conn);
}
Environment::terminateEnvironment(env);
system( " pause " );
return 0 ;
}



最初我以为是createStatement操作造成内存没释放,后来我改为只创建一次,但是还是出现内存不断飙升不释放的问题。
         
try
{
Statement * stmt = conn->createStatement(szInsert );
while (1)
{
stmt->executeUpdate();
conn->commit();
Sleep(10); //10毫秒
}
conn->terminateStatement(stmt);
}
catch (SQLException e)
{
cout << e.what();
}



请问是什么原因呢?谢谢。。。。
...全文
700 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
大数据时代 2012-09-14
  • 打赏
  • 举报
回复
继续关注啊!我现在也是遇到这样的情况:运行环境:WINDOWS 2003,数据库:Cache;有两台服务器,一台是分析数据的服务器(A服务器),一台是提供数据的服务器(B服务器);A服务器连接到B服务器取数据,在A服务器上连接B服务器的进程内存会爆长,没有进行取数这个动作时,这个进程不释放内存,只有将A服务器重启,才能释放这个内存!!!代码以及这种运行方式在其他地方是没问题的!
afeideweixiao 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

这个问题跟OS刷新逻辑页到磁盘物理页的时间长短以及你大量更新数据,导致oracle产生大量的逻辑脏页有关。跟应用程序关系还不大。如果你sleep长一些时间,比如10秒,就应该不会看到内存暴涨。因为当逻辑页刷入到磁盘后,相关的内存会被释放掉。

如果LZ是处理大量数据的插入的问题,则建议采用数组插入的方式。OCI下没有玩过,PROC*C下是有的。在数组插入的方式下,Oracle采用块拷贝的方式……
[/Quote]

这段程序只是测试,我项目中插入数据肯定没有这么频繁,中间间隔基本都有大好几秒。
只是,我发觉,没插入几个数据,Oracle内存就增加一些,然后,继续插入,继续增加。。。。,根本没看见oracle内存有释放。最后,内存满了,机子挂了。。。。
wqkjj 2012-04-25
  • 打赏
  • 举报
回复
这个问题跟OS刷新逻辑页到磁盘物理页的时间长短以及你大量更新数据,导致oracle产生大量的逻辑脏页有关。跟应用程序关系还不大。如果你sleep长一些时间,比如10秒,就应该不会看到内存暴涨。因为当逻辑页刷入到磁盘后,相关的内存会被释放掉。

如果LZ是处理大量数据的插入的问题,则建议采用数组插入的方式。OCI下没有玩过,PROC*C下是有的。在数组插入的方式下,Oracle采用块拷贝的方式,日志会少很多,因此逻辑脏页也会少很多。还有一种解决方案是,将数据转换成sqlldr可以识别的格式,然后用sqlldr将数据装入。这些方法都会比单条记录插入的方式要快很多。
afeideweixiao 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

new的东西要关闭!这是写程序最基本的素质。lx继续。。。
[/Quote]

我不知道你指哪里的new,即便是,问题也不在这。
为了测试,我这个程序与oracle是放在两台机子上跑的,这个测试程序内存没什么问题,就直说oracle那台机子内存狂飙。
啊彪123 2012-04-24
  • 打赏
  • 举报
回复
new的东西要关闭!这是写程序最基本的素质。lx继续。。。
我心飞翔 2012-04-24
  • 打赏
  • 举报
回复
将commit放到循环这外。
我心飞翔 2012-04-24
  • 打赏
  • 举报
回复

while (1)
{
Statement * stmt = conn->createStatement(szInsert );
stmt->executeUpdate();
conn->terminateStatement(stmt);
conn->commit();
Sleep(10); //10毫秒
}

感觉没有退出循环的语句啊,将上述代码改成只执行一次,即去掉循环,看看还飙升不?
如果不是,那就应该是循环的问题。

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧