Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用AspectJ在Java中查找未使用的代码_Java_Performance_Aspectj_Dead Code - Fatal编程技术网

使用AspectJ在Java中查找未使用的代码

使用AspectJ在Java中查找未使用的代码,java,performance,aspectj,dead-code,Java,Performance,Aspectj,Dead Code,我有一个在大型Java项目中查找未使用的(“死”)方法的想法,但我需要帮助派生一个实现 使用AspectJ向项目包中的所有方法添加“before”方面。方面将简单地记录(?)该方法已被执行 我编译了项目包中所有类/方法的列表(可能使用服务定位器/反射) 建议的代码将接受完全回归测试。理想的, 我也想把这个投入生产一段时间(如果合适的话) 可找到性能解决方案) 已执行方法(步骤1)和可用方法(步骤1)的列表 2) 进行比较,得出所有 从未调用过(即死代码) 由于第2步和第4步可以离线进行,所以我只

我有一个在大型Java项目中查找未使用的(“死”)方法的想法,但我需要帮助派生一个实现

  • 使用AspectJ向项目包中的所有方法添加“before”方面。方面将简单地记录(?)该方法已被执行
  • 我编译了项目包中所有类/方法的列表(可能使用服务定位器/反射)
  • 建议的代码将接受完全回归测试。理想的, 我也想把这个投入生产一段时间(如果合适的话) 可找到性能解决方案)
  • 已执行方法(步骤1)和可用方法(步骤1)的列表 2) 进行比较,得出所有 从未调用过(即死代码)
  • 由于第2步和第4步可以离线进行,所以我只想寻求第1步的帮助


    具体来说,我如何记录方法执行的时间?我想如果我尝试任何类型的内存存储,我很快就会遇到OutOfMemory错误。同样,如果我将数据存储在数据库/文件系统中,调用量可能会导致严重的性能问题。有人做过类似的事情吗?欢迎您的任何建议。

    尝试查看流行的测试覆盖率库,如或。它们完全按照您所说的做,然后是一些,尽管不使用AspectJ。至少,Cobertura似乎没有问题将调用信息存储到内存中的行中。

    尝试查看流行的测试覆盖率库,如或。它们完全按照您所说的做,然后是一些,尽管不使用AspectJ。至少,Cobertura似乎没有问题将调用信息存储到内存中的行中。

    您需要一个调用前建议。根据这个建议,您可能希望记录被调用的方法。可能您希望保留一组被调用的方法,这样就不会得到重复的方法。您可以从thisJointPoint获取当前方法。我可以为它提供AspectJ代码,但我认为它离题了

    我认为您最好只使用一个工具来解析二进制.class文件,使用or,从您知道的方法开始调用,并构建一个调用图。这类似于JVM执行垃圾收集的方式

    但是,你真的应该问问自己你是什么。是表演吗?因为影响应该是零。如果您想减少.class文件的大小,最好使用以下内容。这将解决这一问题和其他问题,以及已经取得的进展


    也就是说,我认为如果您真的想这样做,最好的方法是使用Cobertura对代码进行测试,并对应用程序进行运行,然后查看覆盖率报告。绘制90%的旧代码不需要很长时间。任何可以在不引起编译错误的情况下删除的未调用方法都是死代码。

    您需要调用前建议。根据这个建议,您可能希望记录被调用的方法。可能您希望保留一组被调用的方法,这样就不会得到重复的方法。您可以从thisJointPoint获取当前方法。我可以为它提供AspectJ代码,但我认为它离题了

    我认为您最好只使用一个工具来解析二进制.class文件,使用or,从您知道的方法开始调用,并构建一个调用图。这类似于JVM执行垃圾收集的方式

    但是,你真的应该问问自己你是什么。是表演吗?因为影响应该是零。如果您想减少.class文件的大小,最好使用以下内容。这将解决这一问题和其他问题,以及已经取得的进展


    也就是说,我认为如果您真的想这样做,最好的方法是使用Cobertura对代码进行测试,并对应用程序进行运行,然后查看覆盖率报告。绘制90%的旧代码不需要很长时间。任何可以删除而不会导致编译错误的未调用方法都是死代码。

    我考虑过Cobertura,但我担心记录逐行分析的插入指令的代码的性能影响。如你所见,我甚至不确定方法层面的分析是否可行。不过,如果有人有任何相反的证据,我很乐意听到。@hoipolloi:我只是想看看它,看看它在收集数据时是如何将收集到的数据存储在内存中的。考虑到它收集的数据量,它可能会让你知道你需要在哪里。@hoipolloi:另外,你是说在生产环境中长期运行这种分析,还是仅仅在测试环境中运行这种分析,比如测试覆盖率工具?啊,打得好-我来看看。我考虑的是长期(几个月),这样我们就可以确保应用程序的所有元素都被使用。@hoipolloi:如果你打算长期使用,那么你可以使用在cobertura/emma中找到的内容在内存中收集结果,然后定期(每小时、每天,无论什么)将收集到的结果刷新到数据库并从内存中清除它们。您必须小心并发性问题,因为在可能添加其他内容时,您将从内存中删除这些内容。除了使用调度程序来运行刷新之外,我不知道还有哪个库或框架能在这方面起到很大的作用。我考虑过Cobertura,但我担心记录逐行分析的插入指令的代码的性能受到影响。如你所见,我甚至不确定方法层面的分析是否可行。不过,如果有人有任何相反的证据,我很乐意听到。@hoipolloi:我只是想看看它,看看它在收集数据时是如何将收集到的数据存储在内存中的。考虑到它收集的数据量,它可能会让你知道你需要在哪里。@hoipolloi:另外,你是说在生产环境中长期运行此分析,还是仅仅在测试环境中运行此分析,如测试