b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Java是如何管理内存的二、什么是Java中的内存泄漏

电脑杂谈  发布时间:2021-03-01 21:03:24  来源:网络整理

一、 Java如何管理内存二、 Java中的内存泄漏是什么

如果存在满足以下两个条件的对象:

1)该对象可到达。也就是说,在有向图中,GC不会通过到达对象来回收对象。

2)对象的无用性。也就是说,程序将来将不再使用这些对象。

然后这些对象不存在,但是它们占用内存空间,并且不会被GC回收。这就是所谓的内存泄漏。

分类

1.频繁的内存泄漏。具有内存泄漏的代码将被多次执行,并且每次执行都会导致内存泄漏。

2.零星的内存泄漏。具有内存泄漏的代码只能在某些情况或操作下发生。频繁和零星是相对的。对于特定的环境,偶尔可能会变得很频繁。因此,测试环境和测试方法对于检测内存泄漏至关重要。

3.一次内存泄漏。具有内存泄漏的代码将仅执行一次,或者由于算法中的缺陷,将始终存在一个和一个内存泄漏。例如,内存是在类的构造函数中分配的,但内存并未在析构函数中释放,因此内存泄漏只会发生一次。

堆甚至更大,因为C ++没有垃圾收集机制,因此对于那些无法访问的对象,C ++将永远无法收集它们。但是,Java中无法访问的对象负责GC,因此程序员无需考虑对象的这一部分,从而在一定程度上降低了开发难度。</p><p><a href=内存溢出比较.png

对于程序员来说,GC基本上是透明的。虽然我们可以调用System.gc();为了通知垃圾回收机制进行回收,此功能不能保证JVM将执行GC。因为不同的JVM实现者可能使用不同的算法来管理GC。

内存泄漏的例子

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
    Object o=new Object();
    v.add(o);
    o=null; 
}

内存堆栈溢出_堆外内存 溢出_内存泄漏和溢出例子

在此示例中,我们循环申请对象o,然后将o放入容器中。尽管我们释放了o,但是容器仍然引用了该对象,因此GC仍不会回收它。我们需要释放要由GC回收的容器。

三、 Java中的内存不足

如果内存泄漏非常严重,最终将导致内存溢出。

分类

1、 OutOfMemoryError:PermGen空间

PermGen Space是指内存的永久存储区域。 JVM主要使用此内存来存储类和Mete信息。当该类由加载器加载时,它将被存储在内存区域中,并且存储类的实例的堆区域是不同的。 Java中的垃圾收集器GC不会在主程序运行时清理PermGen空间。

因此,如果程序启动时需要加载太多信息,并且超出了该空间的大小,则会发生溢出。

解决方案:增加空间分配-增加java虚拟机中XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久存储区域的大小,而XX:MaxPermSize是最大永久存储区。

堆外内存 溢出_内存泄漏和溢出例子_内存堆栈溢出

2、 OutOfMemoryError:Java堆空间

heap是Java内存中的堆区域,主要用于存储对象。如果有太多对象超出空间大小,并且GC太晚而无法释放,则会发生溢出错误。也就是说,当内存泄漏变得越来越严重时,可能会发生内存溢出。

解决方案:(1),检查程序,减少创建大量重复对象的无穷循环,并减少内存泄漏。

(2),增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。

3、 StackOverFlowError

Stack是Java内存中的堆栈空间。它主要用于存储临时数据,例如方法中的变量和参数。通常由于分配的空间太小或方法在太多的递归层中执行而发生溢出。堆栈帧过多,导致溢出。

解决方案:除了修改配置参数-Xss参数以增加线程堆栈大小之外,程序的优化尤其重要。

四、摘要

内存泄漏是指堆中存在无用但可以访问的对象,GC无法恢复这些对象。

内存溢出是空间不足的溢出,主要分为PermGen空间不足,堆不足和堆栈不足。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-362193-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...