java基础—内存溢出是怎么回事?请举一个例子?

对于Java,内存溢出分三种情况。


1、OutOfMemoryError: PermGen space


Permanent Generation space 这个区域主要用来保存加来的Class的一些信息,在程序运行期间属于永久占用的,Java的GC不会对他进行释放,所以如果启动的程序加载的信息比较大,超出了这个空间的大小,就会发生溢出错误;


解决的办法无非就是增加空间分配了——增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。


2、OutOfMemoryError:Java heap space


heap 是Java内存中的堆区,主要用来存放对象,当对象太多超出了空间大小,GC又来不及释放的时候,就会发生溢出错误。


Java中对象的创建是可控的,但是对象的回收是由GC自动的,一般来说,当已存在对象没有引用(即不可达)的时候,GC就会定时的来回收对象,释放空间。但是因为程序的设计问题,导致对象可达但是又没有用(即前文提到的内存泄露),当这种情况越来越多的时候,问题就来了。


针对这个问题,我们需要做一下两点:
1、检查程序,减少大量重复创建对象的死循环,减少内存泄露。
2、增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。


3、StackOverFlowError


stack是Java内存中的栈空间,主要用来存放方法中的变量,参数等临时性的数据的,发生溢出一般是因为分配空间太小,或是执行的方法递归层数太多创建了占用了太多栈帧导致溢出。


针对这个问题,除了修改配置参数-Xss参数增加线程栈大小之外,优化程序是尤其重要。


科普一丢丢小知识:
	内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,象在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业网络的“罪魁祸首”。 如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。
	需要注意内存溢出和缓冲区溢出的区别
	内存溢出是指系统内存全部被占用,没有可用内存分配给新启动的任务的情况,通常不会导致系统崩溃。
	缓冲区溢出是指程序的缓冲区无限制的使用导致数据超出范围覆盖了其他程序的代码、数据等内容,如果被覆盖的内容是系统数据或代码就会导致系统崩溃
posted @ 2022-01-27 18:36  zhangdaopin  阅读(257)  评论(0编辑  收藏  举报