有没有default XSS sizes人为各种版本的Sun/Oracle JVM以及不同的操作系统找到了单个JVM文档列表?
我已经能够在jrockit jdk 5.0 docs中找到这个表,但这对那些使用"普通"Sun/Oracle JVM的人没有帮助.
我确实感谢XSS每个操作系统(和JVM版本)的值会有所不同,所以可能没有一个文档列出了所有最近的组合.但是,如果这里的任何读者都知道任何单个文档至少列出每个 JVM版本(或至少1.6和1.5)的默认XSS值,或者即使仅针对某些操作系统,那将是一个很好的开始.
我要补充一点,这是有价值的原因是我们经常看到人们推荐(错误的,我认为)有人可以通过改变XSS价值来解决问题.但是如果你不知道自己的默认值,那么就无法知道你是否通过某人推荐的改变来提高或降低价值.他们通常不会指出他们所使用的版本/操作系统,因此他们的建议是否会"帮助"你是一个废话.
甚至比某些文档更好,如果有人知道查询JVM以获取当前值的方法,无论是从命令行还是通过API调用,这将更有价值.谢谢.
为了估计最大调用深度,递归方法可以用给定量的存储器实现,在堆栈溢出错误可能发生之前计算所用存储器的(近似)公式是什么?
许多人回答"它依赖",这是合理的,所以让我们通过使用一个微不足道但具体的例子来删除一些变量:
public static int sumOneToN(int n) {
return n < 2 ? 1 : n + sumOneToN(n - 1);
}
Run Code Online (Sandbox Code Playgroud)
很容易证明,在我的Eclipse IDE中运行它会爆炸n不到1000(对我来说非常低).这个调用深度限制是否可以在不执行的情况下估算?
编辑:我不禁认为Eclipse有一个固定的最大调用深度1000,因为我得到了998,但是有一个用于main,一个用于初始调用方法,1000总而言之.这是一个"太圆"的数字恕我直言,是一个巧合.我会进一步调查.我只是Dux开销-Xss vm参数; 它是最大的堆栈大小,所以Eclipse运行器必须-Xss1000设置在某处
从文档中,-Xss用于设置JVM的堆栈大小.但我对此声明感到非常困惑.
在Java中,每个线程都有自己的堆栈.是否由-Xss指定了数字:
所有线程可以用作堆栈的总内存?例如,如果-Xss设置为256K,则所有线程将在此256K内存中创建自己的堆栈.
每个线程堆栈的大小.例如,如果-Xss设置为256K,则每个线程将具有256K大的堆栈.因此10个线程将共使用2560K.
非常感谢你.
编辑:
谢谢你的回答.它看起来像是上面的(2)senario.-Xss指定特定线程的最大堆栈大小.
然后我有一个跟进问题:这些内存将分配在哪里?
我们可以使用-Xmx和-Xms指定保留的堆内存.是否使用这些保留的内存分配堆栈?或者直接从本机内存分配?
据Oracle称,StackOverflowError是:
在发生堆栈溢出时抛出,因为应用程序过于严重.
我知道递归是什么,通常递归函数,如果没有正确终止,会导致StackOverflowError.为了检查StackOverflowError抛出之前发生的递归调用的数量,我写了这段代码:
package ErrorCases;
public class StackOverFlowError {
static int i=0;
void a()
{
//System.out.println("called "+(++i));
try{
++i;
a();
}catch(Error e)
{
System.out.println(e.getClass());
System.out.println(i);
}
}
public static void main(String[] args) {
new StackOverFlowError().a();
}
}
Run Code Online (Sandbox Code Playgroud)
在JVM抛出StackOverflowError之前,i给出递归调用计数的值a().每次运行
的价值i都不同,如:
output 1: class java.lang.StackOverflowError
10466
Output 2: class java.lang.StackOverflowError
10470
Run Code Online (Sandbox Code Playgroud)
我的疑问是?
在JVM抛出之前递归有多深
StackOverflowError?
一旦StackOverflowError投掷,我们可以恢复吗?
我在sun solaris 中托管的weblogic server 10g 中的 xml 转换中收到以下 java stackoverflow 错误。这仅发生在特定的 xml 转换中,其余所有 xml 转换都可以正常工作。使用的 xsl 文件也不是很大。
我正在使用 rt.jar 中提供的 Transformation api,但是从com.sun.org.apache.xalan.internal.xsltc.dom.SimpleResultTreeImpl我没有打包到我的应用程序中的xalan apache package( )得到这个错误。
另一个有趣的事情是,当我在 Windows 机器上托管的 weblogic 10g 服务器中运行应用程序时,我没有得到这个异常,我只在 sun solaris 中得到这个。
任何人都可以让我知道为什么我会收到此错误。
你能告诉我是哪个 jar 文件导致了异常吗?weblogic 会有 xalan.jar 吗?如果是这样,我可以尝试升级 jar 文件,看看它是否有效?
Caused by: java.lang.StackOverflowError
at com.sun.org.apache.xalan.internal.xsltc.dom.SimpleResultTreeImpl.characters(SimpleResultTreeImpl.java)
at com.sun.org.apache.xalan.internal.xsltc.dom.SimpleResultTreeImpl.copy(SimpleResultTreeImpl.java:438)
at com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary.copy(BasisLibrary.java:1317)
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace()
at GregorSamsa.replace() …Run Code Online (Sandbox Code Playgroud) 我已经使用ssh连接到基于linux的服务器.最近,我使用以下命令安装了JDK:
sudo yum install java-1.6.0-openjdk-devel
并且jdk安装成功,但每当我运行命令java或javac我得到以下错误:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Run Code Online (Sandbox Code Playgroud)
甚至,运行命令java -version,都会带来错误.当我尝试给java使用更多空间时java -Xmx512m -Xms256m -version,我会得到以下错误:
*** glibc detected *** java: double free or corruption (!prev): 0x00007fc84400e270 ***
*** glibc detected *** java: double free or corruption (fasttop): 0x00007fc8440089f0 ***
#
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
提前致谢
我见过JVM选项-Xss - 它究竟做了什么?这个链接,但我的问题是这个选项是如何有用的.
因为,如果我们为-Xss值设置了一个非常小的限制,那么线程可能无法正常工作,因为它可能会在大多数情况下抛出stackOverflow错误.
为什么这个值至少有64k的限制?
我是如何得到这个64k限制的,当我试图在IntelliJ iDE上配置运行时vm选项时,我试图给出一些像10k这样的东西,它弹出这个错误,说它需要至少64k的线程堆栈大小.
另一个问题是,如何从java程序中找到我的嵌入式设备中运行的jvm的默认线程堆栈大小?
谢谢,
森
import java.math.BigInteger;
import java.util.HashMap;
/**
*
* @author cypronmaya
*/
public class test {
static HashMap<Integer, BigInteger> cache = new HashMap<Integer, BigInteger>();
public static void main(String[] args) {
System.out.println(factorial(20000));
}
public static BigInteger factorial(int n) {
BigInteger ret;
if (n == 0) {
return BigInteger.ONE;
}
if (null != (ret = cache.get(n))) {
return ret;
}
ret = BigInteger.valueOf(n).multiply(factorial(n - 1));
cache.put(n, ret);
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
java.util.HashMap.get中的线程"main"java.lang.StackOverflowError中的异常(未知来源)
嗨,为什么我得到这个程序的stackoverflow异常?
我知道stackoverflow通常意味着你有一个无限循环,但是当我使用10000或其他一些较小的数字时,这种方法可以正常工作,而大数字突然变得无限大?
我目前正在使用Specs2库为Scala Play应用程序编写一组测试.
我在编译过程中遇到了一些堆栈溢出错误,因为测试字符串太长,所以我将它拆分成几个类.
问题是测试是使用多线程进程同时运行的.我需要指定那些测试的顺序.有没有办法做到这一点?问候.