当前位置:首页 » 服务存储 » 存储器数据溢出
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

存储器数据溢出

发布时间: 2022-09-21 12:43:21

A. Java前提下, Mysql数据库,一次性存储大量数据导致内存溢出

内存溢出导致程序崩溃,也分是java层崩了,还是mysql崩了。
如果是java层崩了,注意不要一次性加载太多的数据到内存,并且不在使用的数据要彻底放弃引用关系。java虽然是自动回收,回收的原则就是一个对象不再被持有,即引用计数为零。如果数据太大,可考虑临时文件。
如果是mysql崩了,首先增加配置缓存。一般来说mysql是不容易崩的,特别是插入操作的时候。查询的时候如果查询结果记录集特别大,会导致一个查询需要使用很大的内存空间,这种是有问题的。而插入操作都是一条一条的执行,不会导致大内存的使用。

如果仅仅是数据移植,也尽量不要用ORM框架,比如hibernate,mybatis这些东西,因为他们都有自己的缓存,直接使用JDBC比较好。

B. 什么是溢出_溢出的原因分析

黑客可通过溢出变量,使这个返回地址指向攻击代码,得到你电脑具有管理员资格的控制权。那么你对溢出解多少呢?以下是由我整理关于什么是溢出的内容,希望大家喜欢!

什么是溢出

溢出是黑客利用 操作系统 的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了(别称肉鸡,也叫傀儡机)。

溢出是程序设计者设计时的不足所带来的错误。

溢出的分类

缓冲区溢出

缓冲区是用户为程序运行时在计算机中申请的一段连续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。更为严重的是,缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权!由于这类攻击使任何人都有可能取得主机的控制权,所以它代表了一类极其严重的安全威胁。

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root的shell。为了达到这个目的,攻击者必须达到如下的两个目标:在程序的地址空间里安排适当的代码;通过适当地初始化寄存器和存储器,让程序跳转到事先安排的地址空间执行。根据这两个目标,可以将缓冲区溢出攻击分为以下3类。

【缓冲区溢出分类】

控制程序转移到攻击代码

这种 方法 指在改变程序的执行流程,使之跳转到攻击代码。最基本方法的就是溢出一个没有边界检查或者其他弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用近乎暴力的方法改写相邻的程序空间而直接跳过了系统的检查。

1.2.1激活纪录(Activation Records)

每当一个函数调用发生时,调用者会在堆栈中留下一个激活纪录,它包含了函数结束时返回的地址。攻击者通过溢出这些自动变量,使这个返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为“stack smashing attack”,是目.前常用的缓冲区溢出攻击方式。

1.2.2函数指针(Function Pointers)

C语言中,“void (* foo)()”声明了一个返回值为void函数指针的变量foo。函数指针可以用来定位任何地址空间,所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了!它的一个攻击范例就是在Linux系统下的super probe程序。

1.2.3长跳转缓冲区(Longjmp buffers)

在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003,攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了!

最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码殖入和激活纪录。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出改变激活纪录的同时殖入了代码。这个是由Levy指出的攻击的模板。因为C语言在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例不在少数。

代码殖入和缓冲区溢出不一定要在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大的情况。

如果攻击者试图使用已经常驻的代码而不是从外部殖入代码,他们通常有必须把代码作为参数化。举例来说,在libc中的部分代码段会执行“exec(something)”,其中something就是参数。攻击者然后使用缓冲区溢出改变程序的参数,利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

内存溢出

内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,象在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业网络的“罪魁祸首”。

如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。

微软的软件是针对 台式机 开发的,内存溢出不会带来严重的问题。但现有台式机一般都连上了互联网,内存溢出就为黑客的入侵提供了便利条件。

数据溢出

在计算机中,当要表示的数据超出计算机所使用的数据的表示范围时,则产生数据的溢出。

分析溢出原因

现实状况

在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不是这样:C 和 C++ 语言。C 和 C++ 语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。更糟糕的是,用 C 和 C++ 编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。除了 C 和 C++ 使用得 非常广泛外,上述这些可能都是不相关的事实;例如,Red Hat Linux 7.1 中 86% 的代码行都是用 C 或 C ++ 编写的。因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码避免这个问题。

客观原因

在 C 和 C++ 语言本身中,这个问题是不容易解决的。该问题基于 C 语言的根本设计决定(特别是 C 语言中指针和数组的处理方式)。由于 C++ 是最兼容的 C 语言超集,它也具有相同的问题。存在一些能防止这个问题的 C/C++ 兼容版本,但是它们存在极其严重的性能问题。而且一旦改变 C 语言来防止这个问题,它就不再是 C 语言了。许多语言(比如 Java 和 C#)在语法上类似 C,但它们实际上是不同的语言,将现有 C 或 C++ 程序改为使用那些语言是一项艰巨的任务。

普遍因素

C. FIFO写满之后继续写数据,新数据会覆盖原来的数据吗,还是说新数据根本写不进去直接溢出

读不进去,新数据丢失。

手机的磁盘管理,逻辑关系跟随了电脑的硬盘管理模式。删除某个文件,只是删除了文件的路径,原来存储的数据还原样不动的。

如果是同步fifo深度设置成128,存100个以后再开始读,永远不可能出现空满。因为写入和读取的速度是一样的。两边时钟也一样,位宽也一样怎么可能出现空满。

(3)存储器数据溢出扩展阅读:

FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作,它主要有几方面的功能:

1、对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;

2、数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担;

3、允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。

D. 51单片机随机存储器溢出会怎么样

如果你的单片机的随机存储器的容量为128
当你写程序时,uchar table[130]={...};
那么编译器会提示你当前程序错误,当然要在编译器单片机选型也为你单片机的型号。

E. UG2.0存储管理器内存溢出怎么办

对于虚拟内存主要设置两点,即内存大小和存放位置,内存大小就是设置虚拟内存最小为多少和最大为多少;而存放位置则是设置虚拟内存应使用哪个分区中的硬盘空间。对于内存大小的设置,如何得到最小值和最大值呢?你可以通过下面的方法获得:选择“开始→程序→附件→系统工具→系统监视器”(如果系统工具中没有,可以通过“添加/删除程序”中的Windows安装程序进行安装)打开系统监视器,然后选择“编辑→添加项目”,在“类型”项中选择“内存管理程序”,在右侧的列表选择“交换文件大小”。这样随着你的操作,会显示出交换文件值的波动情况,你可以把经常要使用到的程序打开,然后对它们进行使用,这时查看一下系统监视器中的表现值,由于用户每次使用电脑时的情况都不尽相同,因此,最好能够通过较长时间对交换文件进行监视来找出最符合您的交换文件的数值,这样才能保证系统性能稳定以及保持在最佳的状态。一般来说,交换文件太大不会影响效率,但会占用额外的磁盘空间。交换文件太小有时会引起可以运行的程序数量变少。
找出最合适的范围值后,在设置虚拟内存时,用鼠标右键点击“我的电脑”,选择“属性”,弹出系统属性窗口,选择“性能”标签,点击下面“虚拟内存”按钮,弹出虚拟内存设置窗口,点击“用户自己指定虚拟内存设置”单选按钮,“硬盘”选较大剩余空间的分区,然后在“最小值”和“最大值”文本框中输入合适的范围值。如果您感觉使用系统监视器来获得最大和最小值有些麻烦的话,这里完全可以选择“让Windows管理虚拟内存设置”。
调整分页位置
Windows9x的虚拟内存分页位置,其实就是保存在C盘根目录下的一个虚拟内存文件(也称为交换文件)Win386.swp,它的存放位置可以是任何一个分区,如果系统盘C容量有限,我们可以把Win386.swp调到别的分区中,方法是在记事本中打开System.ini(C:Windows下)文件,在[386Enh]小节中,将“PagingDrive=C:WindowsWin386.swp”,改为其他分区的路径,如将交换文件放在D:中,则改为“PagingDrive=D:Win386.swp”,如没有上述语句可以直接键入即可。
而对于使用Windows2000和WindowsXP的,可以选择“控制面板→系统→高级→性能”中的“设置→高级→更改”,打开虚拟内存设置窗口,在驱动器[卷标]中默认选择的是系统所在的分区,如果想更改到其他分区中,首先要把原先的分区设置为无分页文件,然后再选择其他分区。
或者,WinXP一般要求物理内存在256M以上。如果你喜欢玩大型3D游戏,而内存(包括显存)又不够大,系统会经常提示说虚拟内存不够,系统会自动调整(虚拟内存设置为系统管理)。
如果你的硬盘空间够大,你也可以自己设置虚拟内存,具体步骤如下:右键单击“我的电脑”→属性→高级→性能设置→高级→虚拟内存更改→选择虚拟内存(页面文件)存放的分区→自定义大小→确定最大值和最小值→设置。一般来说,虚拟内存为物理内存的1.5倍,稍大一点也可以,如果你不想虚拟内存频繁改动,可以将最大值和最小值设置为一样。{另一种说法:调整时我们需要注意,不要将最大、最小页面文件设为等值。因为通常内存不会真正“塞满”,它会在内存储量到达一定程度时,自动将一部分暂时不用的数据放到硬盘中。最小页面文件越大,所占比例就低,执行的速度也就越慢。最大页面文件是极限值,有时打开很多程序,内存和最小页面文件都已“塞满”,就会自动溢出到最大页面文件。所以将两者设为等值是不合理的。一般情况下,最小页面文件设得小些,这样能在内存中尽可能存储更多数据,效率就越高。最大页面文件设得大些,以免出现“满员”的情况。
PS:①1.5倍虚拟内存设置,是网上技术文档通用说明的,个人认为可以根据常用软件的实际情况设定。推荐有经验的用户使用。
②现在有很多工具软件(例如WINDOWS优化大师、超级兔子),可以很好的更改这些设置,工具软件也会根据你的电脑的实际情况进行相应的推荐设置。

F. 如何防止缓冲区溢出

缓冲区溢出主要是一个 C/C++ 问题。尽管在通常情况下它很容易修补。但它们仍然是一种对安全代码的威胁。不管是用户也好,程序的攻击者也好,当提供的数据长度大于应用程序预期的长度时,便会发生缓冲区溢出,此时数据会溢出到内部存储器空间。有两种缓冲区溢出不明显且难以修复。一是开发人员没有预料到外部提供的数据会比内部缓冲区大。溢出导致了内存中其他数据结构的破坏,这种破坏通常会被攻击者利用,以运行恶意代码。二是数组索引错误也会造成缓冲区下溢和超限,但这种情况没那么普遍。请看以下 C++ 代码片段: void DoSomething(char *cBuffSrc, DWORD cbBuffSrc)
{
char cBuffDest[32];
memcpy(cBuffDest,cBuffSrc,cbBuffSrc);
}

问题在哪里呢?事实上,如果 cBuffSrc 和 cbBuffSrc 来自可信赖的源(例如不信任数据并因此而验证数据的有效性和大小的代码),则这段代码没有任何问题。然而,如果数据来自不可信赖的源,也未得到验证,那么攻击者(不可信赖源)很容易就可以使 cBuffSrc 比 cBuffDest 大,同时也将 cbBuffSrc 设定为比 cBuffDest 大。当 memcpy 将数据复制到 cBuffDest 中时,来自 DoSomething 的返回地址就会被更改,因为 cBuffDest 在函数的堆栈框架上与返回地址相邻,此时攻击者即可通过代码执行一些恶意操作。弥补的方法就是不要信任用户的输入,并且不信任 cBuffSrc 和 cbBuffSrc 中携带的任何数据:

void DoSomething(char *cBuffSrc, DWORD cbBuffSrc)
{
const DWORD cbBuffDest = 32;
char cBuffDest[cbBuffDest];

#ifdef _DEBUG
memset(cBuffDest, 0x33, cbBuffSrc);
#endif
memcpy(cBuffDest, cBuffSrc, min(cbBuffDest, cbBuffSrc));
}

此函数展示了一个能够减少缓冲区溢出的正确编写的函数的三个特性。首先,它要求调用者提供缓冲区的长度。当然,您不能盲目相信这个值!接下来,在一个调试版本中,代码将探测缓冲区是否真的足够大,以便能够存放源缓冲区。如果不能,则可能触发一个访问冲突并把代码载入调试器。在调试时,您会惊奇地发现竟有如此多的错误。最后也是最重要的是,对 memcpy 的调用是防御性的,它不会复制多于目标缓冲区存放能力的数据

G. stup7DB块一保存就储存器溢出怎么回事

保存之后,然后显示这一个溢出这种情况下,可能里面的那个内存出现了故障,所以会有这种情况,先e还好好查询一下。

H. 请教C#Dictionary存储千万数据内存溢出问题

1、编译成64位系统
2、你要让程序在运行中有动作,不然还会停止的,比如显示个时间都可以,或是加个序号,让它不断加,反正就是不能只执行这一个动作,不然会出现停止错误。
C#的代码很少有内存溢出的。你这里肯定是因为用了string的+造成的,string相加需要重新申请新的内存,然后再拷贝相加后的值到新的内存中。你用stringbuilder做string的相加操作就不会有内存溢出的问题了。
stringbuilder的使用如下:
StringBuilder sb=new StringBuilder();
sb.Append("a");
sb.Append("b");
然后得到
sb.ToString()="ab";

I. 检测到缓存溢出是何意思

一些Sasser代码(可以说是插件或木马之类)穿过未打补丁的防火墙,到达没有防护的服务器。当代码进入没有防护服务器的内存时,它马上执行缓存器溢出,将服务器系统级的控制权交给了远端的主机,实现在企业网内的远程控制。

卡巴六正是针对Web浏览器或者其他最终用户网络应用的的漏洞防御,并可以检测和防止受保护计算机上运行的任何应用遭受缓存溢出攻击,防治计算机收到伤害,你拒绝的时候没有“以后都这样操作”的提示吗?如果没有,建议不要浏览该网页了!

温馨提醒:上网的时候最好不要用IE上网,因为80%病毒都是针对IE的(也就是WINDOW),如果使用第三方面的浏览器,将会大大降低中毒的几率!