本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!