服务器内存溢出怎么解决

服务器内存溢出怎么解决,第1张

1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出

JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。

可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young GenerationTenured Generaion之和。

在JVM中如果98%的时间是用于GC,且可用的Heap size不足2%的时候将抛出此异常信息。

解决方法:手动设置JVM Heap(堆)的大小。  

 

2. java.lang.OutOfMemoryError: PermGen space  ---- PermGen space溢出。 

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。

为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,sun的 GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。

解决方法: 手动设置MaxPermSize大小

3. java.lang.StackOverflowError   ---- 栈溢出

栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。

调用构造函数的 “层”太多了,以致于把栈区溢出了。

通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。

通常递归也不要递归的层次过多,很容易溢出。

解决方法:修改程序。

在频频恶意攻击用户、系统漏洞层出不穷的今天,作为网络治理员、系统治理员虽然在服务器的安全上都下了不少功夫,诸如及时打上系统安全补丁、进行一些常规的安全配置,但有时仍不安全。因此必须恶意用户入侵之前,通过一些系列安全设置,来将入侵者们挡在“安全门”之外,下面就将最简单、最有效的防(Overflow)溢出、本地提供权限攻击类的解决办法给大家分享。

一、如何防止溢出类攻击

1、尽最大的可能性将系统的漏洞补丁都打完,最好是比如Microsoft Windows Server系列的系统可以将自动更新服务打开,然后让服务器在您指定的某个时间段内自动连接到Microsoft Update网站进行补丁的更新。假如您的服务器为了安全起见 禁止了对公网外部的连接的话,可以用Microsoft WSUS服务在内网进行升级。

2、停掉一切不需要的系统服务以及应用程序,最大限能的降底服务器的被攻击系数。比如前阵子的MSDTC溢出,就导致很多服务器挂掉了。其实假如WEB类服务器根本没有用到MSDTC服务时,您大可以把MSDTC服务停掉,这样MSDTC溢出就对您的服务器不构成任何威胁了。

3、启动TCP/IP端口的过滤,仅打开常用的TCP如21、80、25、110、3389等端口假如安全要求级别高一点可以将UDP端口关闭,当然假如这样之后缺陷就是如在服务器上连外部就不方便连接了,这里建议大家用IPSec来封UDP。在协议筛选中"只答应"TCP协议(协议号为:6)、UDP协议(协议号为:17)以及RDP协议(协议号为:27)等必需用协议即可其它无用均不开放。

4、启用IPSec策略:为服务器的连接进行安全认证,给服务器加上双保险。如③所说,可以在这里封掉一些危险的端品诸如:135 145 139 445 以及UDP对外连接之类、以及对通读进行加密与只与有信任关系的IP或者网络进行通讯等等。(注:其实防反弹类木马用IPSec简单的禁止UDP或者不常用TCP端口的对外访问就成了,关于IPSec的如何应用这里就不再敖续,可以到服安讨论Search "IPSec",就 会有N多关于IPSec的应用资料..)

5、删除、移动、更名或者用访问控制表列Access Control Lists (ACLs)控制要害系统文件、命令及文件夹:

(1).黑客通常在溢出得到shell后,来用诸如net.exe net1.exe ipconfig.exe user.exe query.exe regedit.exe regsvr32.exe 来达到进一步控制服务器的目的如:加账号了,克隆治理员了等等这里可以将这些命令程序删除或者改名。(注重:在删除与改名时先停掉文件复制服务(FRS)或者先将 %windir%\system32\dllcache\下的对应文件删除或改名。)

(2).也或者将这些.exe文件移动到指定的文件夹,这样也方便以后治理员自己使用。

(3).访问控制表列ACLS控制:找到%windir%\system32下找到cmd.exe、cmd32.exe net.exe net1.exe ipconfig.exe tftp.exe ftp.exe user.exe reg.exe regedit.exe regedt32.exe regsvr32.exe 这些黑客常用的文件,在“属性”→“安全”中对他们进行访问的ACLs用户进 行定义,诸如只给administrator有权访问,假如需要防范一些溢出攻击、以及溢出成功后对这些文件的非法利用,那么只需要将system用户在ACLs中进行拒绝访问即可。

(4).假如觉得在GUI下面太麻烦的话,也可以用系统命令的CACLS.EXE来对这些.exe文件的Acls进行编辑与修改,或者说将他写成一个.bat批处理 文件来执行以及对这些命令进行修改。(具体用户自己参见cacls /? 帮助进行,由于这里的命令太多就不一一列举写成批处理代码给各位了!!)

(5).对磁盘如C/D/E/F等进行安全的ACLS设置从整体安全上考虑的话也是很有必要的,另外非凡是win2k,对Winnt、Winnt\System、Document and Setting等文件夹。

6、进行注册表的修改禁用命令解释器: (假如您觉得用⑤的方法太烦琐的话,那么您不防试试下面一劳永逸的办法来禁止CMD的运行,通过修改注册表,可以禁止用户使用命令解释器(CMD.exe)和运行批处理文件(.bat文件)。具体方法:新建一个双字节(REG_DWord)执行 HKEY_CURRENT_USER\Software\PolicIEs\ Microsoft\Windows\System\DisableCMD,修改其值为1,命令解释器和批处理文件都不能被运行。修改其值为2,则只是禁止命令解释器的运行,反之将值改为0,则是打开CMS命令解释器。假如您赚手动太麻烦的话,请将下面的代码保存为*.reg文件,然后导入。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System]

"DisableCMD"=dword:00000001

7、对一些以System权限运行的系统服务进行降级处理。(诸如:将Serv-U、Imail、IIS、Php、Mssql、Mysql等一系列以System权限运行的服务或者应用程序换成其它administrators成员甚至users权限运行,这样就会安全得多了...但前提是需要对这些基本运行状态、调用API等相关情况较为了解. )

其实,关于防止如Overflow溢出类攻击的办法除了用上述的几点以外,还有N多种办法:诸如用组策略进行限制,写防护过滤程序用DLL方式加载windows到相关的SHell以及动态链接程序之中这类。当然自己写代码来进行验证加密就需要有相关深厚的Win32编程基础了,以及对Shellcode较有研究由于此文仅仅是讨论简单的解决办法,因此其它办法就不在这里详述了。

Linux服务器上tomcat如果内存溢出,tomcat就有可能挂掉,直接就结束运行了,不会对服务器本身有影响(不过如果是Web服务器,那就无法继续提供服务了)。Linux程序如果内存溢出程序就直接异常退出了,如果是编程概念中的内存泄露才会对服务器内存有影响,内存泄露会逐渐耗尽服务器的内存,最终服务器会卡、当机。不过内存溢出也有一个影响到服务器的危害,那就是有很少一部分内存溢出是安全漏洞,可以被入侵者利用进而控制服务器,溢出漏洞是危害最大的一类安全漏洞,往往都是属于高危漏洞。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/102050.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-09
下一篇2023-03-09

发表评论

登录后才能评论

评论列表(0条)

    保存