OutOfMemoryError(内存不足):如果虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够的内存时,将抛出
OutOfMemoryError异常。
StackOverflowError(堆栈溢出):如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
单线程中,通过两个方法不断的相互调用,栈的深度到达了虚拟机的最大深度。
结果:抛出StackOverflowError异常,
public class JVMStackOverflow {
static void dfs(){
a();
}
private static void a() {
dfs();
}
public static void main(String[] args) throws Throwable {
dfs();
}
}

·使用单线程,定义了大量的本地变量,增大此方法帧中本地变量表的长度。
结果:抛出StackOverflowError异常,异常出现时输出的堆栈深度相应缩小。
public class JavaVMStackSOF {
private static int stackLength = 0;
public static void test() {
long unused1, unused2, unused3, unused4, unused5,
unused6, unused7, unused8, unused9, unused10,
unused11, unused12, unused13, unused14, unused15,
unused16, unused17, unused18, unused19, unused20,
unused21, unused22, unused23, unused24, unused25,
unused26, unused27, unused28, unused29, unused30,
unused31, unused32, unused33, unused34, unused35,
unused36, unused37, unused38, unused39, unused40,
unused41, unused42, unused43, unused44, unused45,
unused46, unused47, unused48, unused49, unused50,
unused51, unused52, unused53, unused54, unused55,
unused56, unused57, unused58, unused59, unused60,
unused61, unused62, unused63, unused64, unused65,
unused66, unused67, unused68, unused69, unused70,
unused71, unused72, unused73, unused74, unused75,
unused76, unused77, unused78, unused79, unused80,
unused81, unused82, unused83, unused84, unused85,
unused86, unused87, unused88, unused89, unused90,
unused91, unused92, unused93, unused94, unused95,
unused96, unused97, unused98, unused99, unused100;
stackLength ++;
test();
unused1 = unused2 = unused3 = unused4 = unused5 =
unused6 = unused7 = unused8 = unused9 = unused10 =
unused11 = unused12 = unused13 = unused14 = unused15 =
unused16 = unused17 = unused18 = unused19 = unused20 =
unused21 = unused22 = unused23 = unused24 = unused25 =
unused26 = unused27 = unused28 = unused29 = unused30 =
unused31 = unused32 = unused33 = unused34 = unused35 =
unused36 = unused37 = unused38 = unused39 = unused40 =
unused41 = unused42 = unused43 = unused44 = unused45 =
unused46 = unused47 = unused48 = unused49 = unused50 =
unused51 = unused52 = unused53 = unused54 = unused55 =
unused56 = unused57 = unused58 = unused59 = unused60 =
unused61 = unused62 = unused63 = unused64 = unused65 =
unused66 = unused67 = unused68 = unused69 = unused70 =
unused71 = unused72 = unused73 = unused74 = unused75 =
unused76 = unused77 = unused78 = unused79 = unused80 =
unused81 = unused82 = unused83 = unused84 = unused85 =
unused86 = unused87 = unused88 = unused89 = unused90 =
unused91 = unused92 = unused93 = unused94 = unused95 =
unused96 = unused97 = unused98 = unused99 = unused100 = 0;
}
public static void main(String[] args) {
try {
test();
}catch (Error e){
System.out.println("stack length:" + stackLength);
throw e;
}
}
}

可见无论是由于栈帧太大还是虚拟机栈容量太小,当新的栈帧内存无法分配的时候,HotSpot虚拟机抛出的都是StackOverflowError异常。可是如果在允许动态扩展栈容量大小的虚拟机上,相同代码则会导致不一样的情况。譬如远古时代的Classic虚拟机,这款虚拟机可以支持动态扩展
栈内存的容量,它运行方法二就会产生OutOfMemoryError异常。
什么情况下可以产生OutOfMemoryError异常呢?
通过不断建立线程的方式,在HotSpot上也是可以产生内存溢出异常
的。但是这样产生的内存溢出异常和栈空间是否足够并不存在任何直接的关系,主要取决于操作系统本身的内存使用状态。甚至可以说,在这种情况下,给每个线程的栈分配的内存越大,反而越容易产生内存溢出异常。
public class JVMStackOOM {
private void dontStop() {
while (true) {
}
}
public void stackLeakByThread() {
while (true) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
dontStop();
}
});
thread.start();
}
}
public static void main(String[] args) throws Throwable {
JVMStackOOM oom = new JVMStackOOM();
oom.stackLeakByThread();
}
}
为Android开发字典应用程序。XML文件中有一个数据库。用DOM解析器解析它非常大(72MB)。尝试使用JDOM解析器解析它:Listlist=null;try{Filedb=newFile(UnZip.DATABASE_PATH);InputStreamstream=newFileInputStream(db);SAXBuilderbuilder=newSAXBuilder();//HERECODEISGETTINGSTUCKDocumentdocument=(Document)builder.build(stream);org.jdom2.ElementrootNode=doc
我正在尝试用Java解析最大500MB的XML文件。我尝试使用SAX,但它给了我这个错误java.lang.OutOfMemoryError:Java堆空间在com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(未知来源)你能帮助我吗?多谢。附言较小的XML文件工作得很好 最佳答案 很可能您没有正确使用SAX,或者您的应用程序不适合流处理。SAX的全部要点是避免将整个XML结构保存在内存中,但这只有在您可以在不保留太多上下文的情况下以小块处理XML并且处理结果远
我想使用Clojure从WiktionaryXML转储中提取标题。我使用head-n10000>out-10000.xml创建了原始怪物文件的较小版本。然后我用一个文本编辑器修整以使其成为有效的XML。我根据里面的行数重命名了文件(wc-l):(defdata-9764"data/wiktionary-en-9764.xml");354K(defdata-99224"data/wiktionary-en-99224.xml");4.1M(defdata-995066"data/wiktionary-en-995066.xml");34M(defdata-7999931"data/wik
我想使用XSLT2在具有很多级别的巨大目录中转换XML文件。有超过100万个文件,每个文件为4到10kB。一段时间后,我总是收到java.lang.OutOfMemoryError:Java堆空间。我的命令是:java-Xmx3072M-XX:+UseConcMarkSweepGC-XX:+CMSClassUnloadingEna放血-XX:MaxPermSize=512M...向-Xmx添加更多内存不是一个好的解决方案。这是我的代码:for(Filefile:dir.listFiles()){if(file.isDirectory()){pushDocuments(file);}el
我有一个J2EE应用程序在Windows操作系统上的IBMWebsphereApplicationServer上运行。偶尔我会在javacore文件中看到一个OutOfMemoryError异常,其中包含以下信息。1TISIGINFODumpEvent"systhrow"(00040000)Detail"java/lang/OutOfMemoryError":"Failedtocreateathread:retVal-1073741830,errno12"receivedJava使用以下配置运行:-Xms512m-Xmx1350m-Xscmx50M分析javacore文件,线程数只有1
我正在编写一个数独解决程序,但我遇到了以下错误:Exceptioninthread"AWT-EventQueue-0"java.lang.StackOverflowErroratjava.util.HashMap.hash(UnknownSource)atjava.util.HashMap.getEntry(UnknownSource)atjava.util.HashMap.get(UnknownSource)atsun.awt.AppContext.get(UnknownSource)atsun.awt.SunToolkit.flushPendingEvents(UnknownSou
按照Xamarin网站上的步骤进行BindingaJavaLibrary时为ArcGISforAndroid10.2.2创建绑定(bind)项目我能够编译项目。但是,当我尝试部署和运行该项目时,出现以下错误:COMPILETODALVIK:UNEXPECTEDTOP-LEVELerror:java.lang.OutOfMemoryError:Javaheapspaceatjava.util.Arrays.copyOf(Arrays.java:2760)atjava.util.Arrays.copyOf(Arrays.java:2734)atjava.util.ArrayList.ens
这是我的第一篇Stackoverflow帖子,如果不是很好,请见谅。反馈肯定会有帮助!我目前在使用TwitterStreamingAPI的项目中遇到了java.lang.OutOfMemoryError:JavaHeapspace问题。在传输大约500-1000条推文后出现错误,我无法查明是什么原因导致的。在StatusListener的onStatus方法中,我有以下代码:publicvoidonStatus(Statusstatus){tweetCount++;System.out.println("Tweet#"+tweetCount);StringstatusInfo=stat
当我打开我的项目并且Eclipse尝试构建它时,我收到此错误:“构建工作区”期间发生内部错误。java.lang.StackOverflowError.它仍然完成构建(我认为),我可以继续。但是我收到一个“内部错误”弹出窗口,说发生了堆栈溢出,建议我退出工作台。我只是忽略弹出窗口。这是我的.log输出:!SESSION2014-11-1309:22:21.634-----------------------------------------------eclipse.buildId=4.4.0.I20140606-1215java.version=1.7.0_51java.vendo
我有一个从服务器发送到客户端的类图对象,其中包含具有adjacencyLists的nodes。我有类似的东西:Clearingc1=newClearing(1,134,151);Clearingc6=newClearing(6,250,88);c1.adjacentByPath.add(newPath(1,c6));c6.adjacentByPath.add(newPath(1,c1));每次我发送包含这些清算的对象时,我都会收到以下错误:Exceptioninthread"Server"java.lang.StackOverflowErroratcom.esotericsoftwar