Method Size Limit in Java
发布日期:2021-06-29 12:51:48 浏览次数:2 分类:技术文章

本文共 1246 字,大约阅读时间需要 4 分钟。

Posted by Prashant Deva on June 12, 2011

大多数人不知道这个吧,但是你不能在java类无限制的编写你的方法。在Java中一个方法只有限制在64k。

1、如果我遇到这个限制?

如果你遇到了这个极限,Java编译器将会抱怨说“Code too large to compile”。

如果你已经有一个大的方法,你也可以在运行时遇到这个极限。如果没有64 k限制可以使用一些工具或者库用来插装字节码,增加方法的大小,从而使其超越64 k的极限。在这种情况下你会得到一个运行时异常,java.lang.VerifyError

当我们使用这个库recoder的时候遇到了这个问题,大多数大型项目会至少会有几个大方法,并添加仪器会导致他们超过了64 k的限制,从而导致程序运行时错误,在我们研究如何去解决使用这个问题之前,让我们看看在什么情况下人们写这么大的方法。

这些大型的方法是从哪里来的?
1. 代码生成器
事实证明,事实上大多数人不写这样巨大的方法。我们发现,这些方法大多是一些代码生成器的结果,比如ANTLR解析器生成器生成一些非常大的方法。
2. 初始化方法
初始化方法,特别是gui的初始化方法,所有的布局和附加listeners等。在一些每个组件一大块代码是一种常见的实践,结果产生在一个大的方法。
3. Array初始化
如果你有一个大数组初始化代码,如:
static final byte largeArray[]= { 10,20,30、40、50、60、70、80…};
这是由编译器翻译成一个方法使用数组初始化load/store指令。因此数组太大也会导致这个错误,这可能看起来非常神秘的对那些不知道这个限制。
4. 长的jsp页面
因为大多数JSP编译器把所有的JSP代码放在一个方法,大型JSP页面也可以让你遇到这些错误。

当然,这些只是一些常见的情况下,可能有很多其他的原因导致你的方法尺寸太大。

2、我们如何解决这个问题?

如果你得到这个错误在编译时,它通常是把的代码分割成多个方法。它可能有点毛茸茸的方法达到极限。由于一些自动代码生成比如ANTLR或jsp,但通常这些工具有规定允许您将代码分割成块,例如:jsp:include 。可以侵害不在多个jsp中。

事情变得复杂是第二种情况我之前讲过,这是当字节码插装引起的大小超过64 k的方法限制,从而导致一个运行时错误。当然你仍然可以看引起问题的方法,回去分割它。然而,如果是在一个第三方库的方法,这种方法可能是行不通。

因此,至少在使用Chronon来recoder的时候,我们固定仪器方法,然后检查方法测量后的尺寸。如果高于64 k大小限制,我们回去“deinstrument”方法,因此基本上这个方法不使用record。

也就是说,方法超过64 k这个情况出现得机率太小,而且在64位的机器上根本不需要。我将呼吁每个人都阅读去投票,这个问题可以在未来版本的JVM得到解决。

转载地址:https://carlzone.blog.csdn.net/article/details/51755169 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:程序员编程的 7 + 1 条小贴士
下一篇:20条数据库设计最佳实践

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月30日 14时54分14秒