microsoft / microsoft/vscode-java-dependency

Memory exception when using java.getPackageData and more

未关闭
#808 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
TypeScript
星标
199
派生
105
平均合并
1 天 22 小时
30 天内合并 PR
27

描述

Hello! I am developing a VS Code extension for the static analysis of Java code. My extension is based on your extension where I have found a couple of useful commands.
However, while working with them, I ran into a few issues. One of them is critical to me, so let me start there.

  1. When working with large projects, calling the java.GetPackageData command causes hangs and memory leaks.

This is how I use the command:
Since not all project source files are always located in the project root directory, I use the command to get a list of paths to all elements with kind = "PackageRoot" of the project. Then I recursively get all sources (.java) from them.
In the same way, I get paths to all dependencies (.jar) of the project. I use the command to traverse all elements with kind = "Container" and get the paths to the dependencies.

The issue:
When working with a large project —in my case, this one (https://github.com/elastic/elasticsearch/releases/tag/v8.11.2) — calling the command to get the "PackageRoot" list of a single project module leads to hangs and very high RAM consumption. This causes memory exception to be thrown or the VS Code to crash.

Here is the example of a command call that causes the issue:
vscode.commands.executeCommand("java.execute.workspaceCommand", "java.GetPackageData", {kind: 2, projectUri: "file:///d%3A/Java_projects/el2/elasticsearch-8.11.2/benchmarks/");

  1. The "java.project.getAll" and "java.project.list" commands sometimes return different numbers of elements. Although, the only difference between the two seems to be that "java.project.getAll" returns a list of "uri" projects, while "java.project.list" returns a list of INodeData objects.

The "java.project.getAll" command sometimes returns fewer elements than "java.project.list", even though it seems like it should return the uri of all projects in the directory.

I also noticed the following differences between these commands:

  • "java.project.getAll" identifies the uri of projects included via the settings.gradle file, while "java.project.list" does not. An example of including projects in the settings.gradle file:

include 'common', 'warnings'
project(':common').projectDir = new File("../../pvsjava/common")
project(':warnings').projectDir = new File("../../pvsjava/warnings")

  • The "java.GetPackageData" command does not work with modules that are defined by the "java.project.list" command, but are not defined by the "java.project.getAll" command.

I would appreciate it if you could help me with the first issue. However, if you could make the "java.project.getAll" command return uri of all projects in the opened directory, and at the same time make it possible to work with these projects using the "java.GetPackageData" command, that would be great!

It would also be nice to have
a command enabling you to identify projects that contain a particular source file (.java) or directory.

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

首先针对所引用的大型项目复现 java.GetPackageData 调用,然后阅读 java.GetPackageData、java.project.getAll 和 java.project.list 的实现或入口点。该 issue 涉及内存使用、项目发现和源文件查找;完成它需要就范围达成一致,并验证所选命令不再挂起或崩溃,且返回一致的项目信息。

由索引模型根据 Issue 内容生成。

评估

技术栈
java, typescript, vscode
领域
developer-experience, tooling
Issue 类型
缺陷
难度
5/5
预计耗时
一周以上
活跃度
停滞
描述清晰度
需要澄清
新手友好度
25/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。