有时,当我运行我的应用程序时,它会给我一个错误,如下所示:
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命令行中省略-Xmxn选项,则使用默认值.根据Java文档 "默认值是在运行时根据系统配置选择的".
哪些系统配置设置会影响默认值?
本着Java的问题:为什么MaxPermSize存在?,我想问一下为什么Sun JVM对其内存分配池的大小使用固定的上限.
默认值是物理RAM的1/4(上限和下限); 因此,如果您有一个需要内存的应用程序,您必须手动更改限制(参数-Xmx),否则您的应用程序将表现不佳,甚至可能会因OutOfMemoryError崩溃.
为什么这个固定限制甚至存在?为什么JVM不会根据需要分配内存,就像本机程序在大多数操作系统上一样?
这将解决Java软件的一大类常见问题(只需谷歌通过设置-Xmx来查看解决问题的网上有多少提示).
编辑:
一些答案指出,这将保护系统的其余部分免受Java程序的影响而导致内存泄漏; 没有限制,这会耗尽整个系统耗尽所有内存.这是事实,但对于任何其他程序同样如此,现代操作系统已经允许您限制程序的最大内存(Linux ulimit,Windows"作业对象").所以这并没有真正回答这个问题,即"为什么JVM与大多数其他程序/运行时环境不同?".
我有一个在16G的机器上使用大约15G的Java应用程序.我不知道是否应该设置最大堆大小.
如果设置将jvm吃掉所有ram达到极限然后开始垃圾收集并停止一切,而它通过15G的堆对象搅拌?
如果没有,jvm会因为没有使用机器上所有可用的ram而损害性能.
我的具体vm是:Java HotSpot(TM)64位服务器VM(版本1.6.0_03-b05,混合模式).
谢谢
如果堆已满,JVM会抛出一个
OutOfMemoryError.但是它确保在抛出这样的异常之前总是发生(完全)垃圾收集吗?
这意味着当抛出异常时,内存只有强引用对象(或GC Roots可达)才能满.
编辑:假设Sun JVM - HotSpot正在讨论中.
我们正在运行一个有时"冻结"的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 OutOfMemoryError或stackoverflow生产时识别问题.由于这个原因它即将到来或为什么服务器停机.
例如,我正在开发一个生活在生产和UAT上的应用程序.即时生产java OutOfMemoryError或stackoverflow.
那么我们如何才能跟踪这个问题呢?是否有任何技术可以告诉我这是发生了哪些代码流?
请解释一下.我多次遇到过这个问题.
有人可能认为这BufferedImage是用Java处理图像的最佳选择.虽然很方便,但在阅读巨大的图像时,它往往最终会出现:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
增加VM大小不是解决方案,因为在我的情况下,某些输入文件非常庞大.
所以我正在寻找如何从流中逐步读取图像的方式.
我怀疑ImageIO.createImageInputStream()从ImageIO可能适合该法案,但我不知道如何使用它逐步读取块.此外,JDK上有类PNGMetadata和PNGImageReader可用的类rt.jar似乎很有用,但我没有找到它们的用法的简单示例.
这是要走的路,还是有更好的选择?
我有一个.sql大小为的文件1047399KB,我试图在 Windows104.00GB上运行它,在 DBeaver 程序上使用RAM,我收到java.lang.OutOfMemoryError: Java heap space错误
我尝试了很多解决方案,但对我不起作用。
file.sql -Xms128m -Xmx512m, file.sql -vmargs -Xmx1024M,file.sql -Xmx800m -Xms500m都对我不起作用。
我正在尝试使用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?
我正在寻找将文件输入流转换为大文件(文件大小为 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) 我遇到了一个非常奇怪的问题.我正在编写以下代码的一部分.
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) 运行此代码时出现此错误
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 ×13
jvm ×3
memory ×3
heap ×2
database ×1
dbeaver ×1
debugging ×1
exception ×1
heap-memory ×1
image ×1
performance ×1
png ×1
stack-trace ×1
stream ×1