java 栈 大小_java – JVM堆栈大小规范

本文讨论了Java默认线程堆栈大小为1MB如何影响递归算法,尤其是序列化过程中的writeObject操作。内容指出,递归算法可能导致多个堆栈帧,每个帧的大小取决于方法参数和局部变量。建议通过测量而非理论预测来确定所需堆栈空间。同时,提出了减少递归深度、展平数据结构或使用不同序列化机制的解决方案。
摘要由CSDN通过智能技术生成

Question, what does 1 MB stack size states in JVM as I have no idea what size a stack frame of?

1 MB默认线程堆栈大小意味着每个线程默认具有1MB(1048576字节)的堆栈空间.例外情况是,如果您的代码使用其中一个Thread构造函数创建一个线程,您可以在其中提供堆栈大小参数.

堆栈帧的大小取决于被调用的方法.它需要保存方法的参数和局部变量,因此帧大小取决于它们的大小.每个帧还需要(我认为)两个额外的单词来保存已保存的帧指针和保存的返回地址.

请注意,在递归算法中,您可以为一个“递归级别”拥有多个堆栈帧.对于writeObject(在Java 8中),使用的算法是递归的,并且每个级别的数据结构通常有4个帧被序列化:

writeObject0

writeOrdinaryObject

writeSerialData

defaultWriteFields

writeObject0

etcetera

由于编译器的差异以及ObjectInputStream / ObjectOutputStream的实现的变化,实际的帧大小将取决于平台.您最好尝试(粗略地)测量所需的堆栈空间,而不是尝试从第一原则预测帧大小.

One more question, does every thread has 3000k stack size if I put a JVM option of -Xss3000k ?

是的……除了我上面描述的例外.

解决您的困境的一个可能的解决方案是创建一个特殊的线程,其中包含一个用于序列化的巨大堆栈.反序列化将需要具有大堆栈的类似线程.对于其余的线程,默认的堆栈大小应该没问题.

其他可能的方案:

>实现writeReplace和readResolve方法,将epc对象的父结构展平为一个数组,这样就不会得到深度递归. (显然,需要非递归地完成展平/不展平.)

>在调用writeObject等之前,请执行相同的展平操作.

>使用不同的序列化机制,或者可能是自定义机制.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值