相关疑难解决方法(0)

什么是堆栈跟踪,如何使用它来调试应用程序错误?

有时,当我运行我的应用程序时,它会给我一个错误,如下所示:

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Run Code Online (Sandbox Code Playgroud)

人们将此称为"堆栈跟踪".什么是堆栈跟踪?有什么能告诉我程序中发生的错误?


关于这个问题 - 我经常看到一个问题,一个新手程序员"得到一个错误",他们只是粘贴他们的堆栈跟踪和一些随机的代码块,而不了解堆栈跟踪是什么或如何使用它.这个问题旨在作为新手程序员的参考,他们可能需要帮助来理解堆栈跟踪的价值.

java debugging stack-trace

622
推荐指数
7
解决办法
38万
查看次数

如何确定默认的Java堆大小?

如果我从Java命令行中省略-Xmxn选项,则使用默认值.根据Java文档 "默认值是在运行时根据系统配置选择的".

哪些系统配置设置会影响默认值?

java heap heap-memory

397
推荐指数
10
解决办法
31万
查看次数

为什么(Sun)JVM具有固定的内存使用上限(-Xmx)?

本着Java的问题:为什么MaxPermSize存在?,我想问一下为什么Sun JVM对其内存分配池的大小使用固定的上限.

默认值是物理RAM的1/4(上限和下限); 因此,如果您有一个需要内存的应用程序,您必须手动更改限制(参数-Xmx),否则您的应用程序将表现不佳,甚至可能会因OutOfMemoryError崩溃.

为什么这个固定限制甚至存在?为什么JVM不会根据需要分配内存,就像本机程序在大多数操作系统上一样?

这将解决Java软件的一大类常见问题(只需谷歌通过设置-Xmx来查看解决问题的网上有多少提示).

编辑:

一些答案指出,这将保护系统的其余部分免受Java程序的影响而导致内存泄漏; 没有限制,这会耗尽整个系统耗尽所有内存.这是事实,但对于任何其他程序同样如此,现代操作系统已经允许您限制程序的最大内存(Linux ulimit,Windows"作业对象").所以这并没有真正回答这个问题,即"为什么JVM与大多数其他程序/运行时环境不同?".

java memory jvm

45
推荐指数
3
解决办法
9914
查看次数

使用大量内存的Java应用程序.使用-Xmx?

我有一个在16G的机器上使用大约15G的Java应用程序.我不知道是否应该设置最大堆大小.

如果设置将jvm吃掉所有ram达到极限然后开始垃圾收集并停止一切,而它通过15G的堆对象搅拌?

如果没有,jvm会因为没有使用机器上所有可用的ram而损害性能.

我的具体vm是:Java HotSpot(TM)64位服务器VM(版本1.6.0_03-b05,混合模式).

谢谢

java performance jvm memory-management

22
推荐指数
2
解决办法
4万
查看次数

垃圾收集器是否保证在Out of Memory Error之前运行?

如果堆已满,JVM会抛出一个 OutOfMemoryError.但是它确保在抛出这样的异常之前总是发生(完全)垃圾收集吗?

这意味着当抛出异常时,内存只有强引用对象(或GC Roots可达)才能满.

编辑:假设Sun JVM - HotSpot正在讨论中.

java memory garbage-collection jvm out-of-memory

18
推荐指数
3
解决办法
5853
查看次数

什么时候JVM抛出OutOfMemoryError

我们正在运行一个有时"冻结"的Java应用程序,因为某些线程几乎使用了所有堆.尽管JVM执行Full GC持续时间超过60秒,但应用程序永远不会因OutOfMemoryError而死亡.

我从Java文档中读到:

如果花费太多时间进行垃圾收集,吞吐量收集器将抛出内存不足的异常.例如,如果JVM花费超过总时间的98%进行垃圾收集并且正在恢复少于2%的堆,则会导致内存不足.

我想了解更多关于98%的时间意味着什么(时间框架是什么?)的信息,以及是否可以降低此值,即如果应用程序在GC中花费90%的时间而无法释放OOME超过10%的堆.

目标是确保应用程序将在OOME中死亡(而不是仅运行GC),因此我们可以在OOME上生成转储.

以下是我们使用的内存和GC设置(操作系统是Solaris):

-Xms2048m -Xmx2048m \
-Xmn512m \
-XX:PermSize=256m 
-XX:MaxPermSize=256m \
-XX:+UseParNewGC 
-XX:ParallelGCThreads=16 \
-XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled \
-XX:+DisableExplicitGC \
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps \
-XX:+PrintClassHistogram \
-Xloggc:/gcmonitor.log \
-XX:+HandlePromotionFailure \
-XX:SurvivorRatio=4 
-XX:TargetSurvivorRatio=90 
-XX:MaxTenuringThreshold=10 \
-XX:+UseTLAB 
-XX:TLABSize=32k 
-XX:+ResizeTLAB \
-XX:+UseMPSS \
Run Code Online (Sandbox Code Playgroud)

java garbage-collection out-of-memory

16
推荐指数
1
解决办法
1342
查看次数

Java OutOfMemoryError时如何识别问题?

如何在java OutOfMemoryErrorstackoverflow生产时识别问题.由于这个原因它即将到来或为什么服务器停机.

例如,我正在开发一个生活在生产和UAT上的应用程序.即时生产java OutOfMemoryErrorstackoverflow.

那么我们如何才能跟踪这个问题呢?是否有任何技术可以告诉我这是发生了哪些代码流?

请解释一下.我多次遇到过这个问题.

java out-of-memory

16
推荐指数
2
解决办法
9880
查看次数

如何从流中读取图像?

有人可能认为这BufferedImage是用Java处理图像的最佳选择.虽然很方便,但在阅读巨大的图像时,它往往最终会出现:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)

增加VM大小不是解决方案,因为在我的情况下,某些输入文件非常庞大.

所以我正在寻找如何从流中逐步读取图像的方式.

我怀疑ImageIO.createImageInputStream()ImageIO可能适合该法案,但我不知道如何使用它逐步读取.此外,JDK上有类PNGMetadataPNGImageReader可用的类rt.jar似乎很有用,但我没有找到它们的用法的简单示例.

这是要走的路,还是有更好的选择?

java png image stream

7
推荐指数
2
解决办法
3876
查看次数

java.lang.OutOfMemoryError:DBeaver 中的 Java 堆空间

我有一个.sql大小为的文件1047399KB,我试图在 Windows104.00GB上运行它,在 DBeaver 程序上使用RAM,我收到java.lang.OutOfMemoryError: Java heap space错误

我尝试了很多解决方案,但对我不起作用。 file.sql -Xms128m -Xmx512m, file.sql -vmargs -Xmx1024M,file.sql -Xmx800m -Xms500m都对我不起作用。

java database memory memory-management dbeaver

7
推荐指数
1
解决办法
1万
查看次数

使用BufferedOutputStream编写大文件

我正在尝试使用BufferedInputStream &读取和写入大文件(大于100 MB)BufferedOutputStream.我收到了内存问题和OOM异常.
代码如下:

BufferedInputStream buffIn = new BufferedInputStream(iStream);
/** iStream is the InputStream object  **/

BufferedOutputStream buffOut=new BufferedOutputStream(new FileOutputStream(file));
byte []arr = new byte [1024 * 1024];
int available  = -1;
while((available = buffIn.read(arr)) > 0) {   
    buffOut.write(arr, 0, available); 
}      
buffOut.flush();
buffOut.close();        
Run Code Online (Sandbox Code Playgroud)

我的问题是当我们使用BufferedOutputStreeam它是否持有内存直到写出完整的文件?
使用大写文件的最佳方法是什么BufferedOutputStream

java bufferedoutputstream

5
推荐指数
1
解决办法
3万
查看次数

有没有办法处理Java堆空间异常

我正在寻找将文件输入流转换为大文件(文件大小为 100MB)并且它正在抛出和 java.lang.OutOfMemoryError : Java Heap space

import java.io.FileInputStream; import java.io.IOException;

import org.apache.commons.io.IOUtils;

public class TestClass {
    public static void main(String args[]) throws IOException
    {
        //Open the input and out files for the streams
        FileInputStream fileInputStream = new FileInputStream("file.pdf");
        IOUtils.toByteArray(fileInputStream);
    } 
}
Run Code Online (Sandbox Code Playgroud)

实际的堆栈跟踪是

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at org.apache.commons.io.output.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:322)
    at org.apache.commons.io.IOUtils.toByteArray(IOUtils.java:463)
    at TestClass.main(TestClass.java:12)
Run Code Online (Sandbox Code Playgroud)

我确实尝试使用以下方法处理它

public static byte[] toByteArray(InputStream is) {
        if (is == null) {
            throw new NullPointerException("The InputStream parameter is null.");
        }

        ByteArrayOutputStream baos = …
Run Code Online (Sandbox Code Playgroud)

java heap exception

5
推荐指数
1
解决办法
5317
查看次数

ByteArrayOutputStream在java声音录制时出现内存不足错误

我遇到了一个非常奇怪的问题.我正在编写以下代码的一部分.

try {
    while (!stopCapture) {
        // Read data from the internal buffer of the data line.
        int cnt = this.recLine.read(tempBuffer, 0, tempBuffer.length);
        if (cnt > 0) {
            // Save data in output stream object.
            byteArrayOutputStream.write(tempBuffer, 0, cnt);
            // System.out.println(" bytes " + tempBuffer[0]);
        }// end if
    }// ends while

    // AudioSystem.write(myAIS, targetType, outputFile);
    byteToWave(byteArrayOutputStream);
    byteArrayOutputStream.close();
} catch (IOException e) {
    // TODO provide runtime exception to reach it to presentation layer
    e.printStackTrace();
} catch (Exception ex) {
    ex.printStackTrace();
} …
Run Code Online (Sandbox Code Playgroud)

java

3
推荐指数
1
解决办法
9996
查看次数

如何解决OutOfMemoryError:Java堆空间

运行此代码时出现此错误

private static List<Integer> array(int num) {
       List<Integer> value = new ArrayList<>();

        while (num != 1) {
            if(num % 2 == 0) {
             value.add(num + 2);
             }else {
              value.add(num * 3 + 1);
             }
        }
       System.out.println(value);
        return value;
    }
Run Code Online (Sandbox Code Playgroud)

我能得到什么错的解释吗?

java

1
推荐指数
1
解决办法
59
查看次数