java.lang.OutOfMemoryError:java堆空间

java.lang.OutOfMemoryError:java堆空间,java,multithreading,out-of-memory,heap-memory,Java,Multithreading,Out Of Memory,Heap Memory,我在执行多线程程序时遇到以下错误 java.lang.OutOfMemoryError: Java heap space 上述错误发生在其中一个线程中 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在创建对象时为实例变量分配了空间,因此在正常运行一段时间后会发生此错误 有没有办法增加堆空间 我应该对我的程序做哪些更改,以使它占用更少的堆空间 要增加堆大小,可以在启动Java时使用-Xmx参数;e、 g -Xmx256M 不,我想你是在考虑堆栈空间。堆空间被对象占用。增加堆空间的

我在执行多线程程序时遇到以下错误

java.lang.OutOfMemoryError: Java heap space
上述错误发生在其中一个线程中

  • 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在创建对象时为实例变量分配了空间,因此在正常运行一段时间后会发生此错误

  • 有没有办法增加堆空间

  • 我应该对我的程序做哪些更改,以使它占用更少的堆空间


  • 要增加堆大小,可以在启动Java时使用-Xmx参数;e、 g

    -Xmx256M
    

    不,我想你是在考虑堆栈空间。堆空间被对象占用。增加堆空间的方法是-Xmx256m,将256替换为命令行上所需的数量。

    如果要增加堆空间,可以在命令行上使用
    java-Xms-Xmx
    。默认情况下,这些值基于JRE版本和系统配置。你会发现的


    但是,我建议您分析应用程序,以了解堆大小被占用的原因。NetBeans附带了一个。我相信它使用了引擎盖下的。使用探查器,您可以尝试查找创建许多对象的位置、对象被垃圾回收的时间等等。

    1。-是的,但它几乎涉及程序使用的整个内存

    2.-是,请参见Java虚拟机选项

    -Xms<size>        set initial Java heap size
    -Xmx<size>        set maximum Java heap size
    
    -Xms设置初始Java堆大小
    -Xmx设置最大Java堆大小
    

    java-Xmx2g
    为应用程序分配最大2G的ram

    但是你应该先看看你是否没有内存泄漏

    3.-这取决于计划。尝试查找内存泄漏。这个问题很难回答。最近,您可以使用JConsole进行评测,试图找出内存的去向

  • 局部变量位于堆栈上。堆空间被对象占用

  • 您可以使用
    -Xmx
    选项

  • 基本上,每次使用
    new
    分配新对象时,堆空间都会被用完,并且在对象不再被引用后释放一段时间。因此,请确保不要保留对不再需要的对象的引用


  • 您可能希望查看此站点以了解有关JVM中内存的更多信息:

    我发现用它来观察内存模型的不同部分是如何填满的,以确定要更改什么是有用的

    很难确定内存的哪个部分被填满了,因此visualgc,因为您可能只想更改有问题的部分,而不是说

    很好!我将向JVM提供1G的RAM

    试着更精确地描述你在做什么,从长远来看,你可能会发现这个程序更适合你

    要确定内存泄漏的位置,您可以使用单元测试,通过测试测试之前和之后的内存,如果有太大的更改,您可能需要检查它,但是,您需要在测试仍在运行时进行检查

  • 在大多数情况下,代码没有得到优化。释放那些你认为不再需要的东西。避免每次在循环中创建对象。尝试使用缓存。我不知道你的申请进展如何。但在编程中,正常生活的一条规则也适用

    预防胜于治疗。“不要创建不必要的对象”


  • 您可以通过下面的程序获得堆内存大小

    public class GetHeapSize {
        public static void main(String[] args) {
            long heapsize = Runtime.getRuntime().totalMemory();
            System.out.println("heapsize is :: " + heapsize);
        }
    } 
    
    因此,您还可以使用以下方法增加堆大小: java-Xmx2g

  • 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在创建对象时为实例变量分配了空间,因此在正常运行一段时间后会发生此错误
  • 这意味着您将在一段时间内连续在应用程序中创建更多对象。新对象将存储在堆内存中,这就是堆内存增长的原因

    堆不仅包含实例变量。它将存储所有非基本数据类型(对象)。这些对象的生命周期可能短(方法块)或长(直到在应用程序中引用该对象)

  • 有没有办法增加堆空间
  • 对。有关更多详细信息,请查看此oracle

    设置堆大小有两个参数:

    -Xms:,用于设置初始堆大小和最小堆大小

    -Xmx:,用于设置最大堆大小

  • 我应该对我的程序做哪些更改,以使它占用更少的堆空间
  • 这取决于你的申请

  • 根据应用程序要求设置最大堆内存

  • 不要在应用程序中导致内存泄漏

  • 如果在应用程序中发现内存泄漏,请借助分析工具(如、等)查找根本原因。一旦找到根本原因,请修复泄漏

  • 甲骨文的重要注释

    原因:Java堆空间的详细信息表明无法在Java堆中分配对象。此错误不一定意味着内存泄漏

    可能的原因:

  • 配置不正确(未分配足够的内存)
  • 应用程序无意中保留了对对象的引用,这会防止对象被垃圾收集
  • 过度使用终结器的应用程序。如果类具有finalize方法,则该类型的对象在垃圾收集时不会回收其空间。如果终结器线程无法跟上终结队列,那么Java堆可能会填满,并且会抛出这种类型的OutOfMemoryError异常 另一方面,使用更好的垃圾收集算法(CMS或G1GC)

    看一看,了解一下
    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)