插件初始化
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
/.gradle/
|
||||
/build/
|
||||
/.idea/
|
||||
*.iml
|
||||
out/
|
||||
@@ -0,0 +1,210 @@
|
||||
# Idea-Plugin(IntelliJ IDEA 插件)
|
||||
|
||||
在 IDEA 内提供:**Proto → Java 命令类**、**MySQL → JPA 实体**、**Java 类 ↔ JSON**、**按项目保存的备忘录**、**提交前本机时间校验**。
|
||||
|
||||
---
|
||||
|
||||
## 功能一览
|
||||
|
||||
| 功能 | 主要入口 | 说明 |
|
||||
|------|----------|------|
|
||||
| Proto 转 Java | 右键 `.proto`、项目树、**Tools** | 从 proto 生成 `@Cmd` 命令类 |
|
||||
| mysql 转 Jpa | 右键**文件夹**、**Tools** | 连接 MySQL,多表生成 JPA 实体 |
|
||||
| Java → JSON | 类名上 **Alt+Enter**、编辑器右键 | 按字段类型生成带默认值的 JSON |
|
||||
| Json 转 java | 右键**文件夹**、**Tools** | 从 JSON 生成 Java Bean 源文件 |
|
||||
| 我的自定义备忘录 | **Tools**、工具窗口 | 按项目保存备忘录 |
|
||||
| 提交前时间校验 | 提交 / 提交并推送 | 本机时间与网络时间偏差过大时警告 |
|
||||
|
||||
---
|
||||
|
||||
## 1. Proto 转 Java
|
||||
|
||||
**做什么**:从 `cmd_rpc.proto`(及同目录可选的 `pb_service.proto`)解析 `ServiceNService` 与 `rpc`,在指定目录生成与 **comm-framework** 风格一致的 `@Cmd` + `AbstractTypedPbCommand` Java 类。
|
||||
|
||||
**怎么用**
|
||||
|
||||
1. 打开符合约定的 `.proto`(可与 `pb_service.proto` 同目录)。
|
||||
2. **Proto转Java**(编辑器或项目树右键选中 `.proto`,或 **Tools** 菜单)。
|
||||
3. 在对话框中勾选 RPC、选择输出目录(如 `.../src/main/java/.../cmd/cmds`)。
|
||||
4. 确认生成;已存在的同名 `.java` 会**跳过**。
|
||||
|
||||
**实现要点**
|
||||
|
||||
- 入口:`ProtoCmdGeneratorAction`;对话框 `GenerateCmdDialog`;生成逻辑 `ProtoFileParser`、`JavaCommandGenerator` 等。
|
||||
- 输出:通过 `PsiFileFactory` + `WriteCommandAction` 在目标目录创建 `.java` 文件。
|
||||
|
||||
**约定**(Proto)
|
||||
|
||||
- **Service 命名**:`Service1Service`、`Service2Service`、…
|
||||
- **Method 枚举**:同文件内 `ServiceN_Method`,去掉 `Default*` 后按枚举值从小到大与同一 service 内 **rpc 声明顺序** 对应。
|
||||
- **PbService**:同目录 `pb_service.proto` 的 `enum PbService` 中 `= N` 的项名;缺失时回退为 `Service_N`。
|
||||
|
||||
---
|
||||
|
||||
## 2. mysql 转 Jpa
|
||||
|
||||
**做什么**:连接 MySQL,列出库表(支持搜索与多选),按表结构生成带 **`jakarta.persistence`** 注解的实体类(`@Entity`、`@Table`、`@Id`、`@Column` 等;复合主键生成 `@IdClass`)。
|
||||
|
||||
**怎么用**
|
||||
|
||||
1. 在 **Java 源码目录**(如 `.../src/main/java/你的包路径`)上**右键文件夹**打开对话框,或从 **Tools** 打开(需在对话框中理解输出目录与包名推断规则)。
|
||||
2. 填写 JDBC(**必须含库名**,例如 `host:3306/your_db` 或完整 `jdbc:mysql://.../your_db?...`)、用户名、密码。
|
||||
3. **查询表** → 搜索 / 多选表 → **生成 Java 实体**。
|
||||
|
||||
**实现要点**
|
||||
|
||||
- 入口:`MysqlEntityFromFolderAction`;对话框与写文件:`mysql` 包下 `MysqlEntityDialog`、实体生成器等。
|
||||
- JDBC:插件依赖 `mysql-connector-j`;URL 须包含库名。
|
||||
- 包名:优先根据所选目录相对 `src/main/java` 的路径推断(`PackageInference`)。
|
||||
- 若目标工程仍为 Spring Boot 2 / `javax.persistence`,生成代码中的包名需自行替换或改生成器。
|
||||
|
||||
---
|
||||
|
||||
## 3. Java 类 → JSON(默认值)
|
||||
|
||||
**做什么**:根据当前 Java 类的**非 static 实例字段**(含继承字段)生成一段 **JSON**,各类型使用约定**默认值**(数字 0、布尔 false、字符串 `""`、集合 `[]`、Map `{}`、嵌套类型递归为对象;循环引用处为 `null` 等)。
|
||||
|
||||
**怎么用**
|
||||
|
||||
1. **推荐**:光标放在**类声明上的类名**(例如 `public class Foo` 中的 `Foo`),按 **Alt+Enter**,选择 **「是否生成 JSON(默认值)…」**。
|
||||
2. 在确认对话框中选 **是**。
|
||||
3. 在结果弹窗中查看 JSON,可点击 **「复制到剪贴板」**。
|
||||
|
||||
**备选**:光标在类体内任意位置时,编辑器 **右键** → **「生成类JSON(默认值)」**,流程相同(先确认再弹窗)。
|
||||
|
||||
**实现要点**
|
||||
|
||||
- 意图:`ClassToJsonIntention`(注册于 `plugin.xml` 的 `intentionAction`,说明见 `intentionDescriptions/ClassToJsonIntention/`)。
|
||||
- 编辑器菜单:`GenerateClassJsonEditorAction`。
|
||||
- 构建 JSON:`JavaClassToJsonBuilder`(PSI 字段与类型 + Gson 格式化);展示:`ShowJsonResultDialog`。
|
||||
|
||||
---
|
||||
|
||||
## 4. Json 转 java
|
||||
|
||||
**做什么**:根据输入的 **JSON 对象**(根节点必须是 `{}`)和 **Java 类名**,在选定目录生成一个 **Java Bean** 源文件:`private` 字段 + getter/setter;嵌套对象生成 **静态内部类**;数组字段推断为 `List<…>`(元素类型主要依据**数组第一个元素**)。
|
||||
|
||||
**怎么用**
|
||||
|
||||
1. 在项目树中**右键目标文件夹**(一般为 `src/main/java/...` 下某包目录),或使用 **Tools** → **Json转java**(须已能确定输出目录;若未选文件夹会提示)。
|
||||
2. 填写 **类名**(不含 `.java`)、**包名**(默认按目录用 `PackageInference` 推断)。
|
||||
3. 粘贴 **JSON**(根为对象)。
|
||||
4. 确定后生成 `类名.java`;若文件已存在则**不覆盖**并提示。
|
||||
|
||||
**实现要点**
|
||||
|
||||
- 入口:`JsonToJavaAction`;对话框:`JsonToJavaDialog`;解析与代码生成:`JsonToJavaGenerator`(Gson 解析);字段名规则复用 `mysql/JavaNames`。
|
||||
- 依赖:Gson(`build.gradle.kts`)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 我的自定义备忘录
|
||||
|
||||
**做什么**:右侧工具窗口,对当前 **项目** 做备忘录的增删改(新建、编辑后保存、删除)。
|
||||
|
||||
**怎么用**
|
||||
|
||||
1. **Tools** → **我的自定义备忘录**;或在 **View → Tool Windows** 中找到同名窗口。
|
||||
2. **新建** → 填写标题与正文 → **保存**;选中条目可 **删除**。
|
||||
3. 切换列表项前请先 **保存** 当前编辑,避免未写入的修改被覆盖。
|
||||
|
||||
**实现要点**
|
||||
|
||||
- 工具窗口:`memo/MemoToolWindowFactory` 等;持久化:`MemoProjectService` + `.idea/protoPluginMemos.xml`。
|
||||
- 工具窗口 ID:`MyCustomMemo`(与 `plugin.xml` 中一致)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 提交前时间校验(Commit / Commit & Push)
|
||||
|
||||
**做什么**:在 **提交** 或 **提交并推送** 前,用 HTTP 响应头里的 `Date` 作为参考时间,与 **本机系统时间** 比较;偏差超过 **1 分钟** 时弹出警告,用户可选择继续或取消本次提交。
|
||||
|
||||
**怎么用**
|
||||
|
||||
- 正常走 IDE 的 **Commit** / **Commit and Push** 即可;无单独菜单。若本机时间与网络时间相差过大,会看到警告对话框。
|
||||
|
||||
**实现要点**
|
||||
|
||||
- `CommitTimeCheckinHandlerFactory` 注册 `CheckinHandler`;实际校验在 Kotlin `TimeSkewCommitCheckHandler`(`CommitCheck`,**`ExecutionOrder.EARLY`**)。
|
||||
- 使用 EARLY 是为避免默认 LATE 检查在部分场景下触发 **ABORTED → Cancelled**,表现为提交界面异常或文件被回退。
|
||||
- 无法访问外网、拿不到参考时间时:**不拦截**。Shelf、Create Patch 等本地提交执行器通常不跑该校验。
|
||||
|
||||
---
|
||||
|
||||
## 环境
|
||||
|
||||
- JDK **17**
|
||||
- IntelliJ IDEA **2023.3.x Ultimate**(与 `sinceBuild` 233 等对齐);`gradle.properties` 可配置 `ideaLocalPath` 指向本机安装目录,`runIde` 沙盒使用该 IDEA。若路径不同请修改;未配置时 Gradle 会尝试在线解析 `2023.3` + `IU`。
|
||||
- **运行沙箱**:若仓库含 Gradle Wrapper,可用 `./gradlew runIde`;若无 wrapper,可用本机已安装的 Gradle 执行相同任务(见下节)。
|
||||
|
||||
### 国内镜像(已配置)
|
||||
|
||||
- **Gradle Wrapper**:若存在 `gradle/wrapper/gradle-wrapper.properties`,可使用腾讯云等镜像与合适发行版(如 `gradle-8.5-all.zip` 或 `bin.zip`)。
|
||||
- **Maven / 插件仓库**:`settings.gradle.kts` 与 `build.gradle.kts` 已优先阿里云等公共仓库。
|
||||
- **IntelliJ Platform SDK**:国内常因 CloudFront 导致 `UnknownHostException`;**推荐配置 `ideaLocalPath` 或 `IDEA_LOCAL_PATH`**,避免下载 `ideaIU`。
|
||||
|
||||
### `ideaLocalPath` 在 Program Files 时:拒绝访问
|
||||
|
||||
`gradle-intellij-plugin` 使用本机 IDE 时可能在安装目录写入 Ivy/builtin 元数据;`C:\Program Files\…` 可能不可写。
|
||||
|
||||
**处理**:将 IDEA 装到用户目录(Toolbox)、或复制到可写盘,再把 `ideaLocalPath` 指到该根目录(含 `lib`、`plugins`)。
|
||||
|
||||
### Gradle JVM
|
||||
|
||||
`gradle-intellij-plugin` 1.17.x 需 **JDK 11+**;本项目源码为 **17**。IDEA 中 **Settings → Gradle → Gradle JVM** 请选择 17。
|
||||
|
||||
### runIde 启动日志里的告警/异常(多与本插件代码无关)
|
||||
|
||||
| 现象 | 常见原因 | 建议处理 |
|
||||
|------|----------|----------|
|
||||
| `VFS wasn't safely shut down`、`Content storage... broken`、`LocalHistory is lost` | 上次沙箱里的 IDEA **未正常退出**,虚拟文件系统缓存损坏 | 清沙箱后重跑(见下) |
|
||||
| `GradleJvmSupportMatrix` + `IllegalArgumentException: 25`(`JavaVersion.parse`) | 沙箱内 **Gradle 插件** 持久化配置损坏,或与 2023.3 内置解析逻辑冲突 | 清沙箱后重跑 |
|
||||
| `LoadingState` / `Should be called at least in the state COMPONENTS_LOADED`(`Registry`) | **平台**在极早启动阶段被 VFS 刷新等并发触发,属 IDE 内部时序问题 | 一般可忽略;清沙箱可减轻连带问题 |
|
||||
| `Watch roots should be absolute: src/main/java` | **当前打开的业务工程**里模块源根被记成相对路径,`.iml`/导入异常 | 在**该工程**中 **Gradle/Maven Reload** 或重新导入 |
|
||||
| `Project ... not trusted enough` | 沙箱安全策略未信任项目 | 在沙箱 IDEA 里对该工程点 **Trust Project** |
|
||||
|
||||
**清沙箱(推荐):**
|
||||
|
||||
```bash
|
||||
./gradlew cleanIdeaSandbox runIde
|
||||
```
|
||||
|
||||
或先删目录再运行:`build/idea-sandbox`(Windows 下路径为 `build\idea-sandbox`)。
|
||||
|
||||
**每次 runIde 前自动清沙箱(可选,会丢掉沙箱里的设置与最近打开的工程记录):**
|
||||
|
||||
```bash
|
||||
./gradlew runIde -PfreshSandbox
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 构建插件 ZIP
|
||||
|
||||
```bash
|
||||
./gradlew buildPlugin
|
||||
```
|
||||
|
||||
若无 `gradlew`,使用本机 Gradle:
|
||||
|
||||
```bash
|
||||
gradle buildPlugin
|
||||
```
|
||||
|
||||
产物在 **`build/distributions/`**(一般为 `Idea-Plugin-<version>.zip`),在 IDEA **Settings → Plugins → Install Plugin from Disk** 安装。
|
||||
|
||||
若 **`build` / `buildPlugin` 在 `:buildSearchableOptions` 阶段报错**(如 `sun.font.Font2D.getTypographicFamilyName` / `NoSuchMethodError`),多半是 **跑该任务的 Java 与 IDEA 自带 JBR 版本不一致**。本仓库在 `build.gradle.kts` 的 `tasks { named("buildSearchableOptions") { enabled = false } }` 中禁用了该任务;一般插件不需要生成该项。若你必须开启,请删除上述配置并让 **Gradle JVM** 使用安装目录下的 **`jbr`** 再试。
|
||||
|
||||
---
|
||||
|
||||
## 项目结构(主要源码)
|
||||
|
||||
| 路径 | 说明 |
|
||||
|------|------|
|
||||
| `ProtoCmdGeneratorAction` / `GenerateCmdDialog` / `JavaCommandGenerator` | Proto → Cmd 生成 |
|
||||
| `MysqlEntityFromFolderAction` / `mysql/*` | MySQL 元数据与 JPA 源码生成 |
|
||||
| `json/*` | Java→JSON(PSI + Gson)、JSON→Java(对话框 + 生成器)、意图与编辑器 Action |
|
||||
| `PackageInference` | 由目录路径推断 Java 包名 |
|
||||
| `memo/*` | 备忘录状态与工具窗口 UI |
|
||||
| `vcs/*` | 提交前时间校验(`CheckinHandlerFactory` + Kotlin `CommitCheck` EARLY) |
|
||||
| `META-INF/plugin.xml` | 插件描述、Action、Tool Window、Intention、Project Service |
|
||||
@@ -0,0 +1,100 @@
|
||||
import org.jetbrains.intellij.tasks.RunIdeTask
|
||||
|
||||
plugins {
|
||||
java
|
||||
kotlin("jvm") version "1.9.24"
|
||||
id("org.jetbrains.intellij") version "1.17.4"
|
||||
}
|
||||
|
||||
group = "com.huangzj"
|
||||
version = "0.1.0"
|
||||
|
||||
repositories {
|
||||
// 国内镜像,失败再走中央仓库
|
||||
maven { url = uri("https://maven.aliyun.com/repository/public") }
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("com.google.code.gson:gson:2.10.1")
|
||||
implementation("com.mysql:mysql-connector-j:8.3.0")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
}
|
||||
|
||||
// 国内网络下 JetBrains 依赖经 cache-redirector 会跳到 CloudFront,常出现 UnknownHostException。
|
||||
// 优先使用本机已安装的 IDEA(与开发/沙箱一致,且无需下载 ideaIU)。
|
||||
val ideaLocalPath: String? =
|
||||
(project.findProperty("ideaLocalPath") as String?)?.trim()?.takeIf { it.isNotEmpty() }
|
||||
?: System.getenv("IDEA_LOCAL_PATH")?.trim()?.takeIf { it.isNotEmpty() }
|
||||
|
||||
intellij {
|
||||
if (ideaLocalPath != null) {
|
||||
localPath.set(file(ideaLocalPath).absolutePath)
|
||||
} else {
|
||||
// 未配置 ideaLocalPath 时仍尝试在线解析(需能访问 JetBrains CDN)
|
||||
version.set("2023.3")
|
||||
type.set("IU")
|
||||
}
|
||||
plugins.set(listOf("com.intellij.java"))
|
||||
// instrumentCode 会从 Maven 拉取插桩编译器类路径;离线/代理异常时出现 Connection refused。
|
||||
// 关闭后跳过 :instrumentCode(无 GUI Designer .form、一般插件可接受;若需插桩再改为 true 并保证网络可达)
|
||||
instrumentCode.set(false)
|
||||
}
|
||||
|
||||
tasks {
|
||||
// 避免 :buildSearchableOptions 拉起 IDE 时 JDK/JBR 不一致触发 Font2D 等错误(intellij {} 无此属性,须禁用 Task)
|
||||
named("buildSearchableOptions") {
|
||||
enabled = false
|
||||
}
|
||||
|
||||
/** 删除 runIde 沙箱。非正常退出易导致 VFS/option 损坏,进而出现 GradleJvmSupportMatrix、JavaVersion.parse 等启动异常。 */
|
||||
register<Delete>("cleanIdeaSandbox") {
|
||||
group = "intellij"
|
||||
description =
|
||||
"删除 build/idea-sandbox。出现 VFS 警告、GradleJvmSupportMatrix / IllegalArgumentException: 25 等可先执行本任务再 runIde"
|
||||
delete(layout.buildDirectory.dir("idea-sandbox"))
|
||||
}
|
||||
|
||||
patchPluginXml {
|
||||
sinceBuild.set("233")
|
||||
untilBuild.set("243.*")
|
||||
}
|
||||
|
||||
withType<JavaCompile> {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
|
||||
kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
}
|
||||
|
||||
// RunIdeBase 用 projectExecutable 启动进程,设置 JavaExec.executable 无效;无 jbr 时会退回 Gradle JDK(如 ms-17)。
|
||||
// 勿再加 -XX:+UseParallelGC:与 idea.vmoptions 里的 G1 叠加会报 Multiple garbage collectors selected。
|
||||
named<RunIdeTask>("runIde") {
|
||||
if (project.hasProperty("freshSandbox")) {
|
||||
dependsOn("cleanIdeaSandbox")
|
||||
}
|
||||
val jbrJava = ideaLocalPath?.let { root ->
|
||||
val base = file(root)
|
||||
sequenceOf(
|
||||
base.resolve("jbr/bin/java.exe"),
|
||||
base.resolve("jbr/bin/java"),
|
||||
).firstOrNull { it.isFile }
|
||||
}
|
||||
if (jbrJava != null) {
|
||||
projectExecutable.set(jbrJava.absolutePath)
|
||||
}
|
||||
val maxHeap = (project.findProperty("runIdeMaxHeap") as String?)?.trim()?.takeIf { it.isNotEmpty() } ?: "2048m"
|
||||
maxHeapSize = maxHeap
|
||||
minHeapSize = "256m"
|
||||
jvmArgs("-XX:ReservedCodeCacheSize=256m")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
org.gradle.jvmargs=-Xmx1024m -Dfile.encoding=UTF-8
|
||||
org.gradle.parallel=true
|
||||
|
||||
# 减少 IDE 为 Gradle 发行版额外下载 gradle-*-src.zip(与 wrapper 使用 -all 配合更佳)
|
||||
systemProp.idea.gradle.download.sources=false
|
||||
|
||||
# 若命令行 JDK 不对,取消下一行注释并改为本机 JDK 17,例如:
|
||||
# org.gradle.java.home=C:/Program Files/Java/jdk-17
|
||||
|
||||
# --- IntelliJ Platform SDK(IU-233.15619.7 / 2023.3.8)---
|
||||
# ideaLocalPath 填 IDEA 安装根目录(与 bin、lib、plugins 同级),不要填到 bin 目录。
|
||||
#
|
||||
# 注意:若路径在 C:\Program Files\JetBrains\...,gradle-intellij-plugin 会在该目录写入
|
||||
# ideaLocal-*.xml 和 plugins/builtinRegistry-*.xml,普通用户无写权限时会拒绝访问。
|
||||
# 建议:复制一份 IDEA 到可写盘(如 G:\JetBrains\...)、Toolbox、或安装到非 Program Files。
|
||||
#
|
||||
ideaLocalPath=G:/JetBrains/IntelliJ IDEA 2023.3.8
|
||||
# 也可设置环境变量 IDEA_LOCAL_PATH(本文件里若已配置 ideaLocalPath 则优先生效)。
|
||||
# runIde 沙盒堆上限(可选),例:runIdeMaxHeap=1536m。机器内存紧张时不要设太大,否则 Windows 可能报 1455 / mmap 失败。
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
# 使用 -all(含 Gradle 自身源码与文档),IDE 通常不再单独拉 gradle-*-src.zip;体积比 -bin 大,首次解压略久。
|
||||
# 若仍要最小包:改为 gradle-8.5-bin.zip;官方地址示例:https\://services.gradle.org/distributions/gradle-8.5-all.zip
|
||||
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-all.zip
|
||||
networkTimeout=60000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -0,0 +1,850 @@
|
||||
#
|
||||
# There is insufficient memory for the Java Runtime Environment to continue.
|
||||
# Native memory allocation (malloc) failed to allocate 1716496 bytes. Error detail: Chunk::new
|
||||
# Possible reasons:
|
||||
# The system is out of physical RAM or swap space
|
||||
# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
|
||||
# Possible solutions:
|
||||
# Reduce memory load on the system
|
||||
# Increase physical memory or swap space
|
||||
# Check if swap backing store is full
|
||||
# Decrease Java heap size (-Xmx/-Xms)
|
||||
# Decrease number of Java threads
|
||||
# Decrease Java thread stack sizes (-Xss)
|
||||
# Set larger code cache with -XX:ReservedCodeCacheSize=
|
||||
# JVM is running with Unscaled Compressed Oops mode in which the Java heap is
|
||||
# placed in the first 4GB address space. The Java Heap base address is the
|
||||
# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
|
||||
# to set the Java Heap base and to place the Java Heap above 4GB virtual address.
|
||||
# This output file may be truncated or incomplete.
|
||||
#
|
||||
# Out of Memory Error (arena.cpp:191), pid=23892, tid=31260
|
||||
#
|
||||
# JRE version: OpenJDK Runtime Environment Microsoft-13106358 (17.0.18+8) (build 17.0.18+8-LTS)
|
||||
# Java VM: OpenJDK 64-Bit Server VM Microsoft-13106358 (17.0.18+8-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
|
||||
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
|
||||
#
|
||||
|
||||
--------------- S U M M A R Y ------------
|
||||
|
||||
Command Line: --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=CN -Duser.language=zh -Duser.variant -javaagent:F:\gradle\wrapper\dists\gradle-8.5-all\dckgjkhjnjukymoblh8u3ms10\gradle-8.5\lib\agents\gradle-instrumentation-agent-8.5.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.5
|
||||
|
||||
Host: AMD Ryzen 7 4800H with Radeon Graphics , 16 cores, 15G, Windows 10 , 64 bit Build 19041 (10.0.19041.5915)
|
||||
Time: Thu May 7 17:49:48 2026 Windows 10 , 64 bit Build 19041 (10.0.19041.5915) elapsed time: 4.152962 seconds (0d 0h 0m 4s)
|
||||
|
||||
--------------- T H R E A D ---------------
|
||||
|
||||
Current thread (0x000002db65b27a50): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=31260, stack(0x000000f418b00000,0x000000f418c00000)]
|
||||
|
||||
|
||||
Current CompileTask:
|
||||
C2:4153 2578 4 java.net.URLClassLoader$1::run (5 bytes)
|
||||
|
||||
Stack: [0x000000f418b00000,0x000000f418c00000]
|
||||
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
|
||||
V [jvm.dll+0x68c879] (no source info available)
|
||||
V [jvm.dll+0x845979] (no source info available)
|
||||
V [jvm.dll+0x8476e8] (no source info available)
|
||||
V [jvm.dll+0x847d73] (no source info available)
|
||||
V [jvm.dll+0x24cf6f] (no source info available)
|
||||
V [jvm.dll+0xaecb6] (no source info available)
|
||||
V [jvm.dll+0xaf35c] (no source info available)
|
||||
V [jvm.dll+0x3716ff] (no source info available)
|
||||
V [jvm.dll+0x33b985] (no source info available)
|
||||
V [jvm.dll+0x33adea] (no source info available)
|
||||
V [jvm.dll+0x21df29] (no source info available)
|
||||
V [jvm.dll+0x21d36d] (no source info available)
|
||||
V [jvm.dll+0x1a8ce6] (no source info available)
|
||||
V [jvm.dll+0x22db1b] (no source info available)
|
||||
V [jvm.dll+0x22bca6] (no source info available)
|
||||
V [jvm.dll+0x7fbabb] (no source info available)
|
||||
V [jvm.dll+0x7f5ebc] (no source info available)
|
||||
V [jvm.dll+0x68de17] (no source info available)
|
||||
C [ucrtbase.dll+0x21bb2] (no source info available)
|
||||
C [KERNEL32.DLL+0x17374] (no source info available)
|
||||
C [ntdll.dll+0x4cc91] (no source info available)
|
||||
|
||||
|
||||
--------------- P R O C E S S ---------------
|
||||
|
||||
Threads class SMR info:
|
||||
_java_thread_list=0x000002db6bf3f610, length=30, elements={
|
||||
0x000002db49158430, 0x000002db65b03bb0, 0x000002db65b04940, 0x000002db65b1f6a0,
|
||||
0x000002db65b254a0, 0x000002db65b25d70, 0x000002db65b26640, 0x000002db65b27a50,
|
||||
0x000002db65b38090, 0x000002db65b416f0, 0x000002db65aedb80, 0x000002db65c4c180,
|
||||
0x000002db65c4c6d0, 0x000002db65c4b190, 0x000002db65d1a600, 0x000002db6baaf8a0,
|
||||
0x000002db6bb79060, 0x000002db6b6cee60, 0x000002db6b49f870, 0x000002db6bc69840,
|
||||
0x000002db6bc27b60, 0x000002db6b99b4a0, 0x000002db6b99b9b0, 0x000002db6b99cdf0,
|
||||
0x000002db6b99c8e0, 0x000002db6b999640, 0x000002db6b99c3d0, 0x000002db6b99a060,
|
||||
0x000002db6b99af90, 0x000002db6b99bec0
|
||||
}
|
||||
|
||||
Java Threads: ( => current thread )
|
||||
0x000002db49158430 JavaThread "main" [_thread_blocked, id=31196, stack(0x000000f417e00000,0x000000f417f00000)]
|
||||
0x000002db65b03bb0 JavaThread "Reference Handler" daemon [_thread_blocked, id=21592, stack(0x000000f418500000,0x000000f418600000)]
|
||||
0x000002db65b04940 JavaThread "Finalizer" daemon [_thread_blocked, id=30132, stack(0x000000f418600000,0x000000f418700000)]
|
||||
0x000002db65b1f6a0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=22672, stack(0x000000f418700000,0x000000f418800000)]
|
||||
0x000002db65b254a0 JavaThread "Attach Listener" daemon [_thread_blocked, id=21876, stack(0x000000f418800000,0x000000f418900000)]
|
||||
0x000002db65b25d70 JavaThread "Service Thread" daemon [_thread_blocked, id=7256, stack(0x000000f418900000,0x000000f418a00000)]
|
||||
0x000002db65b26640 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=26488, stack(0x000000f418a00000,0x000000f418b00000)]
|
||||
=>0x000002db65b27a50 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=31260, stack(0x000000f418b00000,0x000000f418c00000)]
|
||||
0x000002db65b38090 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=29984, stack(0x000000f418c00000,0x000000f418d00000)]
|
||||
0x000002db65b416f0 JavaThread "Sweeper thread" daemon [_thread_blocked, id=22024, stack(0x000000f418d00000,0x000000f418e00000)]
|
||||
0x000002db65aedb80 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=23896, stack(0x000000f418e00000,0x000000f418f00000)]
|
||||
0x000002db65c4c180 JavaThread "C1 CompilerThread1" daemon [_thread_blocked, id=31096, stack(0x000000f418f00000,0x000000f419000000)]
|
||||
0x000002db65c4c6d0 JavaThread "C1 CompilerThread2" daemon [_thread_blocked, id=23640, stack(0x000000f419000000,0x000000f419100000)]
|
||||
0x000002db65c4b190 JavaThread "C1 CompilerThread3" daemon [_thread_blocked, id=27256, stack(0x000000f419100000,0x000000f419200000)]
|
||||
0x000002db65d1a600 JavaThread "Notification Thread" daemon [_thread_blocked, id=31212, stack(0x000000f419200000,0x000000f419300000)]
|
||||
0x000002db6baaf8a0 JavaThread "Daemon health stats" [_thread_blocked, id=11888, stack(0x000000f419900000,0x000000f419a00000)]
|
||||
0x000002db6bb79060 JavaThread "Incoming local TCP Connector on port 1113" [_thread_in_native, id=26112, stack(0x000000f419a00000,0x000000f419b00000)]
|
||||
0x000002db6b6cee60 JavaThread "Daemon periodic checks" [_thread_blocked, id=3504, stack(0x000000f419b00000,0x000000f419c00000)]
|
||||
0x000002db6b49f870 JavaThread "Daemon" [_thread_blocked, id=26096, stack(0x000000f419c00000,0x000000f419d00000)]
|
||||
0x000002db6bc69840 JavaThread "Handler for socket connection from /127.0.0.1:1113 to /127.0.0.1:1114" [_thread_in_native, id=2756, stack(0x000000f419d00000,0x000000f419e00000)]
|
||||
0x000002db6bc27b60 JavaThread "Cancel handler" [_thread_blocked, id=28700, stack(0x000000f419e00000,0x000000f419f00000)]
|
||||
0x000002db6b99b4a0 JavaThread "Daemon worker" [_thread_in_native, id=29332, stack(0x000000f419f00000,0x000000f41a000000)]
|
||||
0x000002db6b99b9b0 JavaThread "Asynchronous log dispatcher for DefaultDaemonConnection: socket connection from /127.0.0.1:1113 to /127.0.0.1:1114" [_thread_blocked, id=30508, stack(0x000000f41a000000,0x000000f41a100000)]
|
||||
0x000002db6b99cdf0 JavaThread "Stdin handler" [_thread_blocked, id=9880, stack(0x000000f41a100000,0x000000f41a200000)]
|
||||
0x000002db6b99c8e0 JavaThread "Daemon client event forwarder" [_thread_blocked, id=3412, stack(0x000000f41a200000,0x000000f41a300000)]
|
||||
0x000002db6b999640 JavaThread "Cache worker for journal cache (F:\gradle\caches\journal-1)" [_thread_blocked, id=23088, stack(0x000000f419400000,0x000000f419500000)]
|
||||
0x000002db6b99c3d0 JavaThread "File lock request listener" [_thread_in_native, id=31128, stack(0x000000f41a300000,0x000000f41a400000)]
|
||||
0x000002db6b99a060 JavaThread "Cache worker for file hash cache (F:\gradle\caches\8.5\fileHashes)" [_thread_blocked, id=26228, stack(0x000000f41a400000,0x000000f41a500000)]
|
||||
0x000002db6b99af90 JavaThread "File watcher server" daemon [_thread_in_native, id=28160, stack(0x000000f41ad00000,0x000000f41ae00000)]
|
||||
0x000002db6b99bec0 JavaThread "File watcher consumer" daemon [_thread_blocked, id=11128, stack(0x000000f41ae00000,0x000000f41af00000)]
|
||||
|
||||
Other Threads:
|
||||
0x000002db65aff5f0 VMThread "VM Thread" [stack: 0x000000f418400000,0x000000f418500000] [id=3752]
|
||||
0x000002db49159300 WatcherThread [stack: 0x000000f419300000,0x000000f419400000] [id=12732]
|
||||
0x000002db46fda820 GCTaskThread "GC Thread#0" [stack: 0x000000f417f00000,0x000000f418000000] [id=9948]
|
||||
0x000002db6aaedfb0 GCTaskThread "GC Thread#1" [stack: 0x000000f419500000,0x000000f419600000] [id=28384]
|
||||
0x000002db6aaedce0 GCTaskThread "GC Thread#2" [stack: 0x000000f419600000,0x000000f419700000] [id=27904]
|
||||
0x000002db6aaeda10 GCTaskThread "GC Thread#3" [stack: 0x000000f419700000,0x000000f419800000] [id=28536]
|
||||
0x000002db6aaee820 GCTaskThread "GC Thread#4" [stack: 0x000000f419800000,0x000000f419900000] [id=27984]
|
||||
0x000002db6aaeeaf0 GCTaskThread "GC Thread#5" [stack: 0x000000f41a500000,0x000000f41a600000] [id=25044]
|
||||
0x000002db6aaed1a0 GCTaskThread "GC Thread#6" [stack: 0x000000f41a600000,0x000000f41a700000] [id=29692]
|
||||
0x000002db6aaed740 GCTaskThread "GC Thread#7" [stack: 0x000000f41a700000,0x000000f41a800000] [id=15816]
|
||||
0x000002db6cbcc9b0 GCTaskThread "GC Thread#8" [stack: 0x000000f41a800000,0x000000f41a900000] [id=14728]
|
||||
0x000002db6cbca7f0 GCTaskThread "GC Thread#9" [stack: 0x000000f41a900000,0x000000f41aa00000] [id=6608]
|
||||
0x000002db6cbcad90 GCTaskThread "GC Thread#10" [stack: 0x000000f41aa00000,0x000000f41ab00000] [id=26932]
|
||||
0x000002db6cbccf50 GCTaskThread "GC Thread#11" [stack: 0x000000f41ab00000,0x000000f41ac00000] [id=15488]
|
||||
0x000002db6cbcbba0 GCTaskThread "GC Thread#12" [stack: 0x000000f41ac00000,0x000000f41ad00000] [id=30736]
|
||||
0x000002db46fdd430 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000f418000000,0x000000f418100000] [id=30340]
|
||||
0x000002db46fddd60 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000f418100000,0x000000f418200000] [id=22244]
|
||||
0x000002db4920e440 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000f418200000,0x000000f418300000] [id=4936]
|
||||
0x000002db659c21f0 ConcurrentGCThread "G1 Service" [stack: 0x000000f418300000,0x000000f418400000] [id=25908]
|
||||
|
||||
Threads with active compile tasks:
|
||||
C2 CompilerThread0 4186 2578 4 java.net.URLClassLoader$1::run (5 bytes)
|
||||
|
||||
VM state: not at safepoint (normal execution)
|
||||
|
||||
VM Mutex/Monitor currently owned by a thread: None
|
||||
|
||||
Heap address: 0x00000000c0000000, size: 1024 MB, Compressed Oops mode: 32-bit
|
||||
|
||||
CDS archive(s) mapped at: [0x000002db00000000-0x000002db00bb0000-0x000002db00bb0000), size 12255232, SharedBaseAddress: 0x000002db00000000, ArchiveRelocationMode: 1.
|
||||
Compressed class space mapped at: 0x000002db01000000-0x000002db41000000, reserved size: 1073741824
|
||||
Narrow klass base: 0x000002db00000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
|
||||
|
||||
GC Precious Log:
|
||||
CPUs: 16 total, 16 available
|
||||
Memory: 15741M
|
||||
Large Page Support: Disabled
|
||||
NUMA Support: Disabled
|
||||
Compressed Oops: Enabled (32-bit)
|
||||
Heap Region Size: 1M
|
||||
Heap Min Capacity: 8M
|
||||
Heap Initial Capacity: 246M
|
||||
Heap Max Capacity: 1G
|
||||
Pre-touch: Disabled
|
||||
Parallel Workers: 13
|
||||
Concurrent Workers: 3
|
||||
Concurrent Refinement Workers: 13
|
||||
Periodic GC: Disabled
|
||||
|
||||
Heap:
|
||||
garbage-first heap total 251904K, used 35867K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 26 young (26624K), 11 survivors (11264K)
|
||||
Metaspace used 20727K, committed 21056K, reserved 1114112K
|
||||
class space used 3043K, committed 3200K, reserved 1048576K
|
||||
|
||||
Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next)
|
||||
| 0|0x00000000c0000000, 0x00000000c0100000, 0x00000000c0100000|100%|HS| |TAMS 0x00000000c0000000, 0x00000000c0000000| Complete
|
||||
| 1|0x00000000c0100000, 0x00000000c0200000, 0x00000000c0200000|100%|HC| |TAMS 0x00000000c0100000, 0x00000000c0100000| Complete
|
||||
| 2|0x00000000c0200000, 0x00000000c0300000, 0x00000000c0300000|100%|HC| |TAMS 0x00000000c0200000, 0x00000000c0200000| Complete
|
||||
| 3|0x00000000c0300000, 0x00000000c0400000, 0x00000000c0400000|100%|HC| |TAMS 0x00000000c0300000, 0x00000000c0300000| Complete
|
||||
| 4|0x00000000c0400000, 0x00000000c0500000, 0x00000000c0500000|100%| O| |TAMS 0x00000000c0400000, 0x00000000c0400000| Untracked
|
||||
| 5|0x00000000c0500000, 0x00000000c0600000, 0x00000000c0600000|100%| O| |TAMS 0x00000000c0500000, 0x00000000c0500000| Untracked
|
||||
| 6|0x00000000c0600000, 0x00000000c0700000, 0x00000000c0700000|100%| O| |TAMS 0x00000000c0600000, 0x00000000c0600000| Untracked
|
||||
| 7|0x00000000c0700000, 0x00000000c0800000, 0x00000000c0800000|100%| O| |TAMS 0x00000000c0700000, 0x00000000c0700000| Untracked
|
||||
| 8|0x00000000c0800000, 0x00000000c0900000, 0x00000000c0900000|100%| O| |TAMS 0x00000000c0800000, 0x00000000c0800000| Untracked
|
||||
| 9|0x00000000c0900000, 0x00000000c0a00000, 0x00000000c0a00000|100%| O| |TAMS 0x00000000c0900000, 0x00000000c0900000| Untracked
|
||||
| 10|0x00000000c0a00000, 0x00000000c0a44800, 0x00000000c0b00000| 26%| O| |TAMS 0x00000000c0a00000, 0x00000000c0a00000| Untracked
|
||||
| 11|0x00000000c0b00000, 0x00000000c0b00000, 0x00000000c0c00000| 0%| F| |TAMS 0x00000000c0b00000, 0x00000000c0b00000| Untracked
|
||||
| 12|0x00000000c0c00000, 0x00000000c0c00000, 0x00000000c0d00000| 0%| F| |TAMS 0x00000000c0c00000, 0x00000000c0c00000| Untracked
|
||||
| 13|0x00000000c0d00000, 0x00000000c0d00000, 0x00000000c0e00000| 0%| F| |TAMS 0x00000000c0d00000, 0x00000000c0d00000| Untracked
|
||||
| 14|0x00000000c0e00000, 0x00000000c0e00000, 0x00000000c0f00000| 0%| F| |TAMS 0x00000000c0e00000, 0x00000000c0e00000| Untracked
|
||||
| 15|0x00000000c0f00000, 0x00000000c0f00000, 0x00000000c1000000| 0%| F| |TAMS 0x00000000c0f00000, 0x00000000c0f00000| Untracked
|
||||
| 16|0x00000000c1000000, 0x00000000c1000000, 0x00000000c1100000| 0%| F| |TAMS 0x00000000c1000000, 0x00000000c1000000| Untracked
|
||||
| 17|0x00000000c1100000, 0x00000000c1100000, 0x00000000c1200000| 0%| F| |TAMS 0x00000000c1100000, 0x00000000c1100000| Untracked
|
||||
| 18|0x00000000c1200000, 0x00000000c1200000, 0x00000000c1300000| 0%| F| |TAMS 0x00000000c1200000, 0x00000000c1200000| Untracked
|
||||
| 19|0x00000000c1300000, 0x00000000c1300000, 0x00000000c1400000| 0%| F| |TAMS 0x00000000c1300000, 0x00000000c1300000| Untracked
|
||||
| 20|0x00000000c1400000, 0x00000000c1400000, 0x00000000c1500000| 0%| F| |TAMS 0x00000000c1400000, 0x00000000c1400000| Untracked
|
||||
| 21|0x00000000c1500000, 0x00000000c1500000, 0x00000000c1600000| 0%| F| |TAMS 0x00000000c1500000, 0x00000000c1500000| Untracked
|
||||
| 22|0x00000000c1600000, 0x00000000c1600000, 0x00000000c1700000| 0%| F| |TAMS 0x00000000c1600000, 0x00000000c1600000| Untracked
|
||||
| 23|0x00000000c1700000, 0x00000000c1700000, 0x00000000c1800000| 0%| F| |TAMS 0x00000000c1700000, 0x00000000c1700000| Untracked
|
||||
| 24|0x00000000c1800000, 0x00000000c1800000, 0x00000000c1900000| 0%| F| |TAMS 0x00000000c1800000, 0x00000000c1800000| Untracked
|
||||
| 25|0x00000000c1900000, 0x00000000c1900000, 0x00000000c1a00000| 0%| F| |TAMS 0x00000000c1900000, 0x00000000c1900000| Untracked
|
||||
| 26|0x00000000c1a00000, 0x00000000c1a00000, 0x00000000c1b00000| 0%| F| |TAMS 0x00000000c1a00000, 0x00000000c1a00000| Untracked
|
||||
| 27|0x00000000c1b00000, 0x00000000c1b00000, 0x00000000c1c00000| 0%| F| |TAMS 0x00000000c1b00000, 0x00000000c1b00000| Untracked
|
||||
| 28|0x00000000c1c00000, 0x00000000c1c00000, 0x00000000c1d00000| 0%| F| |TAMS 0x00000000c1c00000, 0x00000000c1c00000| Untracked
|
||||
| 29|0x00000000c1d00000, 0x00000000c1d00000, 0x00000000c1e00000| 0%| F| |TAMS 0x00000000c1d00000, 0x00000000c1d00000| Untracked
|
||||
| 30|0x00000000c1e00000, 0x00000000c1e00000, 0x00000000c1f00000| 0%| F| |TAMS 0x00000000c1e00000, 0x00000000c1e00000| Untracked
|
||||
| 31|0x00000000c1f00000, 0x00000000c1f00000, 0x00000000c2000000| 0%| F| |TAMS 0x00000000c1f00000, 0x00000000c1f00000| Untracked
|
||||
| 32|0x00000000c2000000, 0x00000000c2000000, 0x00000000c2100000| 0%| F| |TAMS 0x00000000c2000000, 0x00000000c2000000| Untracked
|
||||
| 33|0x00000000c2100000, 0x00000000c2100000, 0x00000000c2200000| 0%| F| |TAMS 0x00000000c2100000, 0x00000000c2100000| Untracked
|
||||
| 34|0x00000000c2200000, 0x00000000c2200000, 0x00000000c2300000| 0%| F| |TAMS 0x00000000c2200000, 0x00000000c2200000| Untracked
|
||||
| 35|0x00000000c2300000, 0x00000000c2300000, 0x00000000c2400000| 0%| F| |TAMS 0x00000000c2300000, 0x00000000c2300000| Untracked
|
||||
| 36|0x00000000c2400000, 0x00000000c2400000, 0x00000000c2500000| 0%| F| |TAMS 0x00000000c2400000, 0x00000000c2400000| Untracked
|
||||
| 37|0x00000000c2500000, 0x00000000c2500000, 0x00000000c2600000| 0%| F| |TAMS 0x00000000c2500000, 0x00000000c2500000| Untracked
|
||||
| 38|0x00000000c2600000, 0x00000000c2600000, 0x00000000c2700000| 0%| F| |TAMS 0x00000000c2600000, 0x00000000c2600000| Untracked
|
||||
| 39|0x00000000c2700000, 0x00000000c2700000, 0x00000000c2800000| 0%| F| |TAMS 0x00000000c2700000, 0x00000000c2700000| Untracked
|
||||
| 40|0x00000000c2800000, 0x00000000c2800000, 0x00000000c2900000| 0%| F| |TAMS 0x00000000c2800000, 0x00000000c2800000| Untracked
|
||||
| 41|0x00000000c2900000, 0x00000000c2900000, 0x00000000c2a00000| 0%| F| |TAMS 0x00000000c2900000, 0x00000000c2900000| Untracked
|
||||
| 42|0x00000000c2a00000, 0x00000000c2a00000, 0x00000000c2b00000| 0%| F| |TAMS 0x00000000c2a00000, 0x00000000c2a00000| Untracked
|
||||
| 43|0x00000000c2b00000, 0x00000000c2b00000, 0x00000000c2c00000| 0%| F| |TAMS 0x00000000c2b00000, 0x00000000c2b00000| Untracked
|
||||
| 44|0x00000000c2c00000, 0x00000000c2c00000, 0x00000000c2d00000| 0%| F| |TAMS 0x00000000c2c00000, 0x00000000c2c00000| Untracked
|
||||
| 45|0x00000000c2d00000, 0x00000000c2d00000, 0x00000000c2e00000| 0%| F| |TAMS 0x00000000c2d00000, 0x00000000c2d00000| Untracked
|
||||
| 46|0x00000000c2e00000, 0x00000000c2e00000, 0x00000000c2f00000| 0%| F| |TAMS 0x00000000c2e00000, 0x00000000c2e00000| Untracked
|
||||
| 47|0x00000000c2f00000, 0x00000000c2f00000, 0x00000000c3000000| 0%| F| |TAMS 0x00000000c2f00000, 0x00000000c2f00000| Untracked
|
||||
| 48|0x00000000c3000000, 0x00000000c3000000, 0x00000000c3100000| 0%| F| |TAMS 0x00000000c3000000, 0x00000000c3000000| Untracked
|
||||
| 49|0x00000000c3100000, 0x00000000c3100000, 0x00000000c3200000| 0%| F| |TAMS 0x00000000c3100000, 0x00000000c3100000| Untracked
|
||||
| 50|0x00000000c3200000, 0x00000000c3200000, 0x00000000c3300000| 0%| F| |TAMS 0x00000000c3200000, 0x00000000c3200000| Untracked
|
||||
| 51|0x00000000c3300000, 0x00000000c3300000, 0x00000000c3400000| 0%| F| |TAMS 0x00000000c3300000, 0x00000000c3300000| Untracked
|
||||
| 52|0x00000000c3400000, 0x00000000c3400000, 0x00000000c3500000| 0%| F| |TAMS 0x00000000c3400000, 0x00000000c3400000| Untracked
|
||||
| 53|0x00000000c3500000, 0x00000000c3500000, 0x00000000c3600000| 0%| F| |TAMS 0x00000000c3500000, 0x00000000c3500000| Untracked
|
||||
| 54|0x00000000c3600000, 0x00000000c3600000, 0x00000000c3700000| 0%| F| |TAMS 0x00000000c3600000, 0x00000000c3600000| Untracked
|
||||
| 55|0x00000000c3700000, 0x00000000c3700000, 0x00000000c3800000| 0%| F| |TAMS 0x00000000c3700000, 0x00000000c3700000| Untracked
|
||||
| 56|0x00000000c3800000, 0x00000000c3800000, 0x00000000c3900000| 0%| F| |TAMS 0x00000000c3800000, 0x00000000c3800000| Untracked
|
||||
| 57|0x00000000c3900000, 0x00000000c3900000, 0x00000000c3a00000| 0%| F| |TAMS 0x00000000c3900000, 0x00000000c3900000| Untracked
|
||||
| 58|0x00000000c3a00000, 0x00000000c3a00000, 0x00000000c3b00000| 0%| F| |TAMS 0x00000000c3a00000, 0x00000000c3a00000| Untracked
|
||||
| 59|0x00000000c3b00000, 0x00000000c3b00000, 0x00000000c3c00000| 0%| F| |TAMS 0x00000000c3b00000, 0x00000000c3b00000| Untracked
|
||||
| 60|0x00000000c3c00000, 0x00000000c3c00000, 0x00000000c3d00000| 0%| F| |TAMS 0x00000000c3c00000, 0x00000000c3c00000| Untracked
|
||||
| 61|0x00000000c3d00000, 0x00000000c3d00000, 0x00000000c3e00000| 0%| F| |TAMS 0x00000000c3d00000, 0x00000000c3d00000| Untracked
|
||||
| 62|0x00000000c3e00000, 0x00000000c3e00000, 0x00000000c3f00000| 0%| F| |TAMS 0x00000000c3e00000, 0x00000000c3e00000| Untracked
|
||||
| 63|0x00000000c3f00000, 0x00000000c3f00000, 0x00000000c4000000| 0%| F| |TAMS 0x00000000c3f00000, 0x00000000c3f00000| Untracked
|
||||
| 64|0x00000000c4000000, 0x00000000c4000000, 0x00000000c4100000| 0%| F| |TAMS 0x00000000c4000000, 0x00000000c4000000| Untracked
|
||||
| 65|0x00000000c4100000, 0x00000000c4100000, 0x00000000c4200000| 0%| F| |TAMS 0x00000000c4100000, 0x00000000c4100000| Untracked
|
||||
| 66|0x00000000c4200000, 0x00000000c4200000, 0x00000000c4300000| 0%| F| |TAMS 0x00000000c4200000, 0x00000000c4200000| Untracked
|
||||
| 67|0x00000000c4300000, 0x00000000c4300000, 0x00000000c4400000| 0%| F| |TAMS 0x00000000c4300000, 0x00000000c4300000| Untracked
|
||||
| 68|0x00000000c4400000, 0x00000000c4400000, 0x00000000c4500000| 0%| F| |TAMS 0x00000000c4400000, 0x00000000c4400000| Untracked
|
||||
| 69|0x00000000c4500000, 0x00000000c4500000, 0x00000000c4600000| 0%| F| |TAMS 0x00000000c4500000, 0x00000000c4500000| Untracked
|
||||
| 70|0x00000000c4600000, 0x00000000c4600000, 0x00000000c4700000| 0%| F| |TAMS 0x00000000c4600000, 0x00000000c4600000| Untracked
|
||||
| 71|0x00000000c4700000, 0x00000000c4700000, 0x00000000c4800000| 0%| F| |TAMS 0x00000000c4700000, 0x00000000c4700000| Untracked
|
||||
| 72|0x00000000c4800000, 0x00000000c4800000, 0x00000000c4900000| 0%| F| |TAMS 0x00000000c4800000, 0x00000000c4800000| Untracked
|
||||
| 73|0x00000000c4900000, 0x00000000c4900000, 0x00000000c4a00000| 0%| F| |TAMS 0x00000000c4900000, 0x00000000c4900000| Untracked
|
||||
| 74|0x00000000c4a00000, 0x00000000c4a00000, 0x00000000c4b00000| 0%| F| |TAMS 0x00000000c4a00000, 0x00000000c4a00000| Untracked
|
||||
| 75|0x00000000c4b00000, 0x00000000c4b00000, 0x00000000c4c00000| 0%| F| |TAMS 0x00000000c4b00000, 0x00000000c4b00000| Untracked
|
||||
| 76|0x00000000c4c00000, 0x00000000c4c00000, 0x00000000c4d00000| 0%| F| |TAMS 0x00000000c4c00000, 0x00000000c4c00000| Untracked
|
||||
| 77|0x00000000c4d00000, 0x00000000c4d00000, 0x00000000c4e00000| 0%| F| |TAMS 0x00000000c4d00000, 0x00000000c4d00000| Untracked
|
||||
| 78|0x00000000c4e00000, 0x00000000c4e00000, 0x00000000c4f00000| 0%| F| |TAMS 0x00000000c4e00000, 0x00000000c4e00000| Untracked
|
||||
| 79|0x00000000c4f00000, 0x00000000c4f00000, 0x00000000c5000000| 0%| F| |TAMS 0x00000000c4f00000, 0x00000000c4f00000| Untracked
|
||||
| 80|0x00000000c5000000, 0x00000000c5000000, 0x00000000c5100000| 0%| F| |TAMS 0x00000000c5000000, 0x00000000c5000000| Untracked
|
||||
| 81|0x00000000c5100000, 0x00000000c5100000, 0x00000000c5200000| 0%| F| |TAMS 0x00000000c5100000, 0x00000000c5100000| Untracked
|
||||
| 82|0x00000000c5200000, 0x00000000c5200000, 0x00000000c5300000| 0%| F| |TAMS 0x00000000c5200000, 0x00000000c5200000| Untracked
|
||||
| 83|0x00000000c5300000, 0x00000000c5300000, 0x00000000c5400000| 0%| F| |TAMS 0x00000000c5300000, 0x00000000c5300000| Untracked
|
||||
| 84|0x00000000c5400000, 0x00000000c5400000, 0x00000000c5500000| 0%| F| |TAMS 0x00000000c5400000, 0x00000000c5400000| Untracked
|
||||
| 85|0x00000000c5500000, 0x00000000c5500000, 0x00000000c5600000| 0%| F| |TAMS 0x00000000c5500000, 0x00000000c5500000| Untracked
|
||||
| 86|0x00000000c5600000, 0x00000000c5600000, 0x00000000c5700000| 0%| F| |TAMS 0x00000000c5600000, 0x00000000c5600000| Untracked
|
||||
| 87|0x00000000c5700000, 0x00000000c5700000, 0x00000000c5800000| 0%| F| |TAMS 0x00000000c5700000, 0x00000000c5700000| Untracked
|
||||
| 88|0x00000000c5800000, 0x00000000c5800000, 0x00000000c5900000| 0%| F| |TAMS 0x00000000c5800000, 0x00000000c5800000| Untracked
|
||||
| 89|0x00000000c5900000, 0x00000000c5900000, 0x00000000c5a00000| 0%| F| |TAMS 0x00000000c5900000, 0x00000000c5900000| Untracked
|
||||
| 90|0x00000000c5a00000, 0x00000000c5a00000, 0x00000000c5b00000| 0%| F| |TAMS 0x00000000c5a00000, 0x00000000c5a00000| Untracked
|
||||
| 91|0x00000000c5b00000, 0x00000000c5b00000, 0x00000000c5c00000| 0%| F| |TAMS 0x00000000c5b00000, 0x00000000c5b00000| Untracked
|
||||
| 92|0x00000000c5c00000, 0x00000000c5c00000, 0x00000000c5d00000| 0%| F| |TAMS 0x00000000c5c00000, 0x00000000c5c00000| Untracked
|
||||
| 93|0x00000000c5d00000, 0x00000000c5d00000, 0x00000000c5e00000| 0%| F| |TAMS 0x00000000c5d00000, 0x00000000c5d00000| Untracked
|
||||
| 94|0x00000000c5e00000, 0x00000000c5e00000, 0x00000000c5f00000| 0%| F| |TAMS 0x00000000c5e00000, 0x00000000c5e00000| Untracked
|
||||
| 95|0x00000000c5f00000, 0x00000000c5f00000, 0x00000000c6000000| 0%| F| |TAMS 0x00000000c5f00000, 0x00000000c5f00000| Untracked
|
||||
| 96|0x00000000c6000000, 0x00000000c6000000, 0x00000000c6100000| 0%| F| |TAMS 0x00000000c6000000, 0x00000000c6000000| Untracked
|
||||
| 97|0x00000000c6100000, 0x00000000c6100000, 0x00000000c6200000| 0%| F| |TAMS 0x00000000c6100000, 0x00000000c6100000| Untracked
|
||||
| 98|0x00000000c6200000, 0x00000000c6200000, 0x00000000c6300000| 0%| F| |TAMS 0x00000000c6200000, 0x00000000c6200000| Untracked
|
||||
| 99|0x00000000c6300000, 0x00000000c6300000, 0x00000000c6400000| 0%| F| |TAMS 0x00000000c6300000, 0x00000000c6300000| Untracked
|
||||
| 100|0x00000000c6400000, 0x00000000c6400000, 0x00000000c6500000| 0%| F| |TAMS 0x00000000c6400000, 0x00000000c6400000| Untracked
|
||||
| 101|0x00000000c6500000, 0x00000000c6500000, 0x00000000c6600000| 0%| F| |TAMS 0x00000000c6500000, 0x00000000c6500000| Untracked
|
||||
| 102|0x00000000c6600000, 0x00000000c6600000, 0x00000000c6700000| 0%| F| |TAMS 0x00000000c6600000, 0x00000000c6600000| Untracked
|
||||
| 103|0x00000000c6700000, 0x00000000c6700000, 0x00000000c6800000| 0%| F| |TAMS 0x00000000c6700000, 0x00000000c6700000| Untracked
|
||||
| 104|0x00000000c6800000, 0x00000000c6800000, 0x00000000c6900000| 0%| F| |TAMS 0x00000000c6800000, 0x00000000c6800000| Untracked
|
||||
| 105|0x00000000c6900000, 0x00000000c6900000, 0x00000000c6a00000| 0%| F| |TAMS 0x00000000c6900000, 0x00000000c6900000| Untracked
|
||||
| 106|0x00000000c6a00000, 0x00000000c6a00000, 0x00000000c6b00000| 0%| F| |TAMS 0x00000000c6a00000, 0x00000000c6a00000| Untracked
|
||||
| 107|0x00000000c6b00000, 0x00000000c6b00000, 0x00000000c6c00000| 0%| F| |TAMS 0x00000000c6b00000, 0x00000000c6b00000| Untracked
|
||||
| 108|0x00000000c6c00000, 0x00000000c6c00000, 0x00000000c6d00000| 0%| F| |TAMS 0x00000000c6c00000, 0x00000000c6c00000| Untracked
|
||||
| 109|0x00000000c6d00000, 0x00000000c6d00000, 0x00000000c6e00000| 0%| F| |TAMS 0x00000000c6d00000, 0x00000000c6d00000| Untracked
|
||||
| 110|0x00000000c6e00000, 0x00000000c6e00000, 0x00000000c6f00000| 0%| F| |TAMS 0x00000000c6e00000, 0x00000000c6e00000| Untracked
|
||||
| 111|0x00000000c6f00000, 0x00000000c6f00000, 0x00000000c7000000| 0%| F| |TAMS 0x00000000c6f00000, 0x00000000c6f00000| Untracked
|
||||
| 112|0x00000000c7000000, 0x00000000c7000000, 0x00000000c7100000| 0%| F| |TAMS 0x00000000c7000000, 0x00000000c7000000| Untracked
|
||||
| 113|0x00000000c7100000, 0x00000000c7100000, 0x00000000c7200000| 0%| F| |TAMS 0x00000000c7100000, 0x00000000c7100000| Untracked
|
||||
| 114|0x00000000c7200000, 0x00000000c7200000, 0x00000000c7300000| 0%| F| |TAMS 0x00000000c7200000, 0x00000000c7200000| Untracked
|
||||
| 115|0x00000000c7300000, 0x00000000c7300000, 0x00000000c7400000| 0%| F| |TAMS 0x00000000c7300000, 0x00000000c7300000| Untracked
|
||||
| 116|0x00000000c7400000, 0x00000000c7400000, 0x00000000c7500000| 0%| F| |TAMS 0x00000000c7400000, 0x00000000c7400000| Untracked
|
||||
| 117|0x00000000c7500000, 0x00000000c7500000, 0x00000000c7600000| 0%| F| |TAMS 0x00000000c7500000, 0x00000000c7500000| Untracked
|
||||
| 118|0x00000000c7600000, 0x00000000c7600000, 0x00000000c7700000| 0%| F| |TAMS 0x00000000c7600000, 0x00000000c7600000| Untracked
|
||||
| 119|0x00000000c7700000, 0x00000000c7700000, 0x00000000c7800000| 0%| F| |TAMS 0x00000000c7700000, 0x00000000c7700000| Untracked
|
||||
| 120|0x00000000c7800000, 0x00000000c7800000, 0x00000000c7900000| 0%| F| |TAMS 0x00000000c7800000, 0x00000000c7800000| Untracked
|
||||
| 121|0x00000000c7900000, 0x00000000c7900000, 0x00000000c7a00000| 0%| F| |TAMS 0x00000000c7900000, 0x00000000c7900000| Untracked
|
||||
| 122|0x00000000c7a00000, 0x00000000c7a00000, 0x00000000c7b00000| 0%| F| |TAMS 0x00000000c7a00000, 0x00000000c7a00000| Untracked
|
||||
| 123|0x00000000c7b00000, 0x00000000c7b00000, 0x00000000c7c00000| 0%| F| |TAMS 0x00000000c7b00000, 0x00000000c7b00000| Untracked
|
||||
| 124|0x00000000c7c00000, 0x00000000c7c00000, 0x00000000c7d00000| 0%| F| |TAMS 0x00000000c7c00000, 0x00000000c7c00000| Untracked
|
||||
| 125|0x00000000c7d00000, 0x00000000c7d00000, 0x00000000c7e00000| 0%| F| |TAMS 0x00000000c7d00000, 0x00000000c7d00000| Untracked
|
||||
| 126|0x00000000c7e00000, 0x00000000c7e00000, 0x00000000c7f00000| 0%| F| |TAMS 0x00000000c7e00000, 0x00000000c7e00000| Untracked
|
||||
| 127|0x00000000c7f00000, 0x00000000c7f00000, 0x00000000c8000000| 0%| F| |TAMS 0x00000000c7f00000, 0x00000000c7f00000| Untracked
|
||||
| 128|0x00000000c8000000, 0x00000000c8000000, 0x00000000c8100000| 0%| F| |TAMS 0x00000000c8000000, 0x00000000c8000000| Untracked
|
||||
| 129|0x00000000c8100000, 0x00000000c8100000, 0x00000000c8200000| 0%| F| |TAMS 0x00000000c8100000, 0x00000000c8100000| Untracked
|
||||
| 130|0x00000000c8200000, 0x00000000c8200000, 0x00000000c8300000| 0%| F| |TAMS 0x00000000c8200000, 0x00000000c8200000| Untracked
|
||||
| 131|0x00000000c8300000, 0x00000000c8300000, 0x00000000c8400000| 0%| F| |TAMS 0x00000000c8300000, 0x00000000c8300000| Untracked
|
||||
| 132|0x00000000c8400000, 0x00000000c8400000, 0x00000000c8500000| 0%| F| |TAMS 0x00000000c8400000, 0x00000000c8400000| Untracked
|
||||
| 133|0x00000000c8500000, 0x00000000c85c27a8, 0x00000000c8600000| 75%| S|CS|TAMS 0x00000000c8500000, 0x00000000c8500000| Complete
|
||||
| 134|0x00000000c8600000, 0x00000000c8700000, 0x00000000c8700000|100%| S|CS|TAMS 0x00000000c8600000, 0x00000000c8600000| Complete
|
||||
| 135|0x00000000c8700000, 0x00000000c8800000, 0x00000000c8800000|100%| S|CS|TAMS 0x00000000c8700000, 0x00000000c8700000| Complete
|
||||
| 136|0x00000000c8800000, 0x00000000c8900000, 0x00000000c8900000|100%| S|CS|TAMS 0x00000000c8800000, 0x00000000c8800000| Complete
|
||||
| 137|0x00000000c8900000, 0x00000000c8a00000, 0x00000000c8a00000|100%| S|CS|TAMS 0x00000000c8900000, 0x00000000c8900000| Complete
|
||||
| 138|0x00000000c8a00000, 0x00000000c8b00000, 0x00000000c8b00000|100%| S|CS|TAMS 0x00000000c8a00000, 0x00000000c8a00000| Complete
|
||||
| 139|0x00000000c8b00000, 0x00000000c8c00000, 0x00000000c8c00000|100%| S|CS|TAMS 0x00000000c8b00000, 0x00000000c8b00000| Complete
|
||||
| 140|0x00000000c8c00000, 0x00000000c8d00000, 0x00000000c8d00000|100%| S|CS|TAMS 0x00000000c8c00000, 0x00000000c8c00000| Complete
|
||||
| 141|0x00000000c8d00000, 0x00000000c8e00000, 0x00000000c8e00000|100%| S|CS|TAMS 0x00000000c8d00000, 0x00000000c8d00000| Complete
|
||||
| 142|0x00000000c8e00000, 0x00000000c8f00000, 0x00000000c8f00000|100%| S|CS|TAMS 0x00000000c8e00000, 0x00000000c8e00000| Complete
|
||||
| 143|0x00000000c8f00000, 0x00000000c9000000, 0x00000000c9000000|100%| S|CS|TAMS 0x00000000c8f00000, 0x00000000c8f00000| Complete
|
||||
| 144|0x00000000c9000000, 0x00000000c9000000, 0x00000000c9100000| 0%| F| |TAMS 0x00000000c9000000, 0x00000000c9000000| Untracked
|
||||
| 145|0x00000000c9100000, 0x00000000c9100000, 0x00000000c9200000| 0%| F| |TAMS 0x00000000c9100000, 0x00000000c9100000| Untracked
|
||||
| 146|0x00000000c9200000, 0x00000000c9200000, 0x00000000c9300000| 0%| F| |TAMS 0x00000000c9200000, 0x00000000c9200000| Untracked
|
||||
| 147|0x00000000c9300000, 0x00000000c9300000, 0x00000000c9400000| 0%| F| |TAMS 0x00000000c9300000, 0x00000000c9300000| Untracked
|
||||
| 148|0x00000000c9400000, 0x00000000c9400000, 0x00000000c9500000| 0%| F| |TAMS 0x00000000c9400000, 0x00000000c9400000| Untracked
|
||||
| 149|0x00000000c9500000, 0x00000000c9500000, 0x00000000c9600000| 0%| F| |TAMS 0x00000000c9500000, 0x00000000c9500000| Untracked
|
||||
| 150|0x00000000c9600000, 0x00000000c9600000, 0x00000000c9700000| 0%| F| |TAMS 0x00000000c9600000, 0x00000000c9600000| Untracked
|
||||
| 151|0x00000000c9700000, 0x00000000c9700000, 0x00000000c9800000| 0%| F| |TAMS 0x00000000c9700000, 0x00000000c9700000| Untracked
|
||||
| 152|0x00000000c9800000, 0x00000000c9800000, 0x00000000c9900000| 0%| F| |TAMS 0x00000000c9800000, 0x00000000c9800000| Untracked
|
||||
| 153|0x00000000c9900000, 0x00000000c9900000, 0x00000000c9a00000| 0%| F| |TAMS 0x00000000c9900000, 0x00000000c9900000| Untracked
|
||||
| 154|0x00000000c9a00000, 0x00000000c9a00000, 0x00000000c9b00000| 0%| F| |TAMS 0x00000000c9a00000, 0x00000000c9a00000| Untracked
|
||||
| 155|0x00000000c9b00000, 0x00000000c9b00000, 0x00000000c9c00000| 0%| F| |TAMS 0x00000000c9b00000, 0x00000000c9b00000| Untracked
|
||||
| 156|0x00000000c9c00000, 0x00000000c9c00000, 0x00000000c9d00000| 0%| F| |TAMS 0x00000000c9c00000, 0x00000000c9c00000| Untracked
|
||||
| 157|0x00000000c9d00000, 0x00000000c9d00000, 0x00000000c9e00000| 0%| F| |TAMS 0x00000000c9d00000, 0x00000000c9d00000| Untracked
|
||||
| 158|0x00000000c9e00000, 0x00000000c9e00000, 0x00000000c9f00000| 0%| F| |TAMS 0x00000000c9e00000, 0x00000000c9e00000| Untracked
|
||||
| 159|0x00000000c9f00000, 0x00000000c9f00000, 0x00000000ca000000| 0%| F| |TAMS 0x00000000c9f00000, 0x00000000c9f00000| Untracked
|
||||
| 160|0x00000000ca000000, 0x00000000ca000000, 0x00000000ca100000| 0%| F| |TAMS 0x00000000ca000000, 0x00000000ca000000| Untracked
|
||||
| 161|0x00000000ca100000, 0x00000000ca100000, 0x00000000ca200000| 0%| F| |TAMS 0x00000000ca100000, 0x00000000ca100000| Untracked
|
||||
| 162|0x00000000ca200000, 0x00000000ca200000, 0x00000000ca300000| 0%| F| |TAMS 0x00000000ca200000, 0x00000000ca200000| Untracked
|
||||
| 163|0x00000000ca300000, 0x00000000ca300000, 0x00000000ca400000| 0%| F| |TAMS 0x00000000ca300000, 0x00000000ca300000| Untracked
|
||||
| 164|0x00000000ca400000, 0x00000000ca400000, 0x00000000ca500000| 0%| F| |TAMS 0x00000000ca400000, 0x00000000ca400000| Untracked
|
||||
| 165|0x00000000ca500000, 0x00000000ca500000, 0x00000000ca600000| 0%| F| |TAMS 0x00000000ca500000, 0x00000000ca500000| Untracked
|
||||
| 166|0x00000000ca600000, 0x00000000ca600000, 0x00000000ca700000| 0%| F| |TAMS 0x00000000ca600000, 0x00000000ca600000| Untracked
|
||||
| 167|0x00000000ca700000, 0x00000000ca700000, 0x00000000ca800000| 0%| F| |TAMS 0x00000000ca700000, 0x00000000ca700000| Untracked
|
||||
| 168|0x00000000ca800000, 0x00000000ca800000, 0x00000000ca900000| 0%| F| |TAMS 0x00000000ca800000, 0x00000000ca800000| Untracked
|
||||
| 169|0x00000000ca900000, 0x00000000ca900000, 0x00000000caa00000| 0%| F| |TAMS 0x00000000ca900000, 0x00000000ca900000| Untracked
|
||||
| 170|0x00000000caa00000, 0x00000000caa00000, 0x00000000cab00000| 0%| F| |TAMS 0x00000000caa00000, 0x00000000caa00000| Untracked
|
||||
| 171|0x00000000cab00000, 0x00000000cab00000, 0x00000000cac00000| 0%| F| |TAMS 0x00000000cab00000, 0x00000000cab00000| Untracked
|
||||
| 172|0x00000000cac00000, 0x00000000cac00000, 0x00000000cad00000| 0%| F| |TAMS 0x00000000cac00000, 0x00000000cac00000| Untracked
|
||||
| 173|0x00000000cad00000, 0x00000000cad00000, 0x00000000cae00000| 0%| F| |TAMS 0x00000000cad00000, 0x00000000cad00000| Untracked
|
||||
| 174|0x00000000cae00000, 0x00000000cae00000, 0x00000000caf00000| 0%| F| |TAMS 0x00000000cae00000, 0x00000000cae00000| Untracked
|
||||
| 175|0x00000000caf00000, 0x00000000caf00000, 0x00000000cb000000| 0%| F| |TAMS 0x00000000caf00000, 0x00000000caf00000| Untracked
|
||||
| 176|0x00000000cb000000, 0x00000000cb000000, 0x00000000cb100000| 0%| F| |TAMS 0x00000000cb000000, 0x00000000cb000000| Untracked
|
||||
| 177|0x00000000cb100000, 0x00000000cb100000, 0x00000000cb200000| 0%| F| |TAMS 0x00000000cb100000, 0x00000000cb100000| Untracked
|
||||
| 178|0x00000000cb200000, 0x00000000cb200000, 0x00000000cb300000| 0%| F| |TAMS 0x00000000cb200000, 0x00000000cb200000| Untracked
|
||||
| 179|0x00000000cb300000, 0x00000000cb300000, 0x00000000cb400000| 0%| F| |TAMS 0x00000000cb300000, 0x00000000cb300000| Untracked
|
||||
| 180|0x00000000cb400000, 0x00000000cb400000, 0x00000000cb500000| 0%| F| |TAMS 0x00000000cb400000, 0x00000000cb400000| Untracked
|
||||
| 181|0x00000000cb500000, 0x00000000cb500000, 0x00000000cb600000| 0%| F| |TAMS 0x00000000cb500000, 0x00000000cb500000| Untracked
|
||||
| 182|0x00000000cb600000, 0x00000000cb600000, 0x00000000cb700000| 0%| F| |TAMS 0x00000000cb600000, 0x00000000cb600000| Untracked
|
||||
| 183|0x00000000cb700000, 0x00000000cb700000, 0x00000000cb800000| 0%| F| |TAMS 0x00000000cb700000, 0x00000000cb700000| Untracked
|
||||
| 184|0x00000000cb800000, 0x00000000cb800000, 0x00000000cb900000| 0%| F| |TAMS 0x00000000cb800000, 0x00000000cb800000| Untracked
|
||||
| 185|0x00000000cb900000, 0x00000000cb900000, 0x00000000cba00000| 0%| F| |TAMS 0x00000000cb900000, 0x00000000cb900000| Untracked
|
||||
| 186|0x00000000cba00000, 0x00000000cba00000, 0x00000000cbb00000| 0%| F| |TAMS 0x00000000cba00000, 0x00000000cba00000| Untracked
|
||||
| 187|0x00000000cbb00000, 0x00000000cbb00000, 0x00000000cbc00000| 0%| F| |TAMS 0x00000000cbb00000, 0x00000000cbb00000| Untracked
|
||||
| 188|0x00000000cbc00000, 0x00000000cbc00000, 0x00000000cbd00000| 0%| F| |TAMS 0x00000000cbc00000, 0x00000000cbc00000| Untracked
|
||||
| 189|0x00000000cbd00000, 0x00000000cbd00000, 0x00000000cbe00000| 0%| F| |TAMS 0x00000000cbd00000, 0x00000000cbd00000| Untracked
|
||||
| 190|0x00000000cbe00000, 0x00000000cbe00000, 0x00000000cbf00000| 0%| F| |TAMS 0x00000000cbe00000, 0x00000000cbe00000| Untracked
|
||||
| 191|0x00000000cbf00000, 0x00000000cbf00000, 0x00000000cc000000| 0%| F| |TAMS 0x00000000cbf00000, 0x00000000cbf00000| Untracked
|
||||
| 192|0x00000000cc000000, 0x00000000cc000000, 0x00000000cc100000| 0%| F| |TAMS 0x00000000cc000000, 0x00000000cc000000| Untracked
|
||||
| 193|0x00000000cc100000, 0x00000000cc100000, 0x00000000cc200000| 0%| F| |TAMS 0x00000000cc100000, 0x00000000cc100000| Untracked
|
||||
| 194|0x00000000cc200000, 0x00000000cc200000, 0x00000000cc300000| 0%| F| |TAMS 0x00000000cc200000, 0x00000000cc200000| Untracked
|
||||
| 195|0x00000000cc300000, 0x00000000cc300000, 0x00000000cc400000| 0%| F| |TAMS 0x00000000cc300000, 0x00000000cc300000| Untracked
|
||||
| 196|0x00000000cc400000, 0x00000000cc400000, 0x00000000cc500000| 0%| F| |TAMS 0x00000000cc400000, 0x00000000cc400000| Untracked
|
||||
| 197|0x00000000cc500000, 0x00000000cc500000, 0x00000000cc600000| 0%| F| |TAMS 0x00000000cc500000, 0x00000000cc500000| Untracked
|
||||
| 198|0x00000000cc600000, 0x00000000cc600000, 0x00000000cc700000| 0%| F| |TAMS 0x00000000cc600000, 0x00000000cc600000| Untracked
|
||||
| 199|0x00000000cc700000, 0x00000000cc700000, 0x00000000cc800000| 0%| F| |TAMS 0x00000000cc700000, 0x00000000cc700000| Untracked
|
||||
| 200|0x00000000cc800000, 0x00000000cc800000, 0x00000000cc900000| 0%| F| |TAMS 0x00000000cc800000, 0x00000000cc800000| Untracked
|
||||
| 201|0x00000000cc900000, 0x00000000cc900000, 0x00000000cca00000| 0%| F| |TAMS 0x00000000cc900000, 0x00000000cc900000| Untracked
|
||||
| 202|0x00000000cca00000, 0x00000000cca00000, 0x00000000ccb00000| 0%| F| |TAMS 0x00000000cca00000, 0x00000000cca00000| Untracked
|
||||
| 203|0x00000000ccb00000, 0x00000000ccb00000, 0x00000000ccc00000| 0%| F| |TAMS 0x00000000ccb00000, 0x00000000ccb00000| Untracked
|
||||
| 204|0x00000000ccc00000, 0x00000000ccc00000, 0x00000000ccd00000| 0%| F| |TAMS 0x00000000ccc00000, 0x00000000ccc00000| Untracked
|
||||
| 205|0x00000000ccd00000, 0x00000000ccd00000, 0x00000000cce00000| 0%| F| |TAMS 0x00000000ccd00000, 0x00000000ccd00000| Untracked
|
||||
| 206|0x00000000cce00000, 0x00000000cce00000, 0x00000000ccf00000| 0%| F| |TAMS 0x00000000cce00000, 0x00000000cce00000| Untracked
|
||||
| 207|0x00000000ccf00000, 0x00000000ccf00000, 0x00000000cd000000| 0%| F| |TAMS 0x00000000ccf00000, 0x00000000ccf00000| Untracked
|
||||
| 208|0x00000000cd000000, 0x00000000cd000000, 0x00000000cd100000| 0%| F| |TAMS 0x00000000cd000000, 0x00000000cd000000| Untracked
|
||||
| 209|0x00000000cd100000, 0x00000000cd100000, 0x00000000cd200000| 0%| F| |TAMS 0x00000000cd100000, 0x00000000cd100000| Untracked
|
||||
| 210|0x00000000cd200000, 0x00000000cd200000, 0x00000000cd300000| 0%| F| |TAMS 0x00000000cd200000, 0x00000000cd200000| Untracked
|
||||
| 211|0x00000000cd300000, 0x00000000cd300000, 0x00000000cd400000| 0%| F| |TAMS 0x00000000cd300000, 0x00000000cd300000| Untracked
|
||||
| 212|0x00000000cd400000, 0x00000000cd400000, 0x00000000cd500000| 0%| F| |TAMS 0x00000000cd400000, 0x00000000cd400000| Untracked
|
||||
| 213|0x00000000cd500000, 0x00000000cd500000, 0x00000000cd600000| 0%| F| |TAMS 0x00000000cd500000, 0x00000000cd500000| Untracked
|
||||
| 214|0x00000000cd600000, 0x00000000cd600000, 0x00000000cd700000| 0%| F| |TAMS 0x00000000cd600000, 0x00000000cd600000| Untracked
|
||||
| 215|0x00000000cd700000, 0x00000000cd700000, 0x00000000cd800000| 0%| F| |TAMS 0x00000000cd700000, 0x00000000cd700000| Untracked
|
||||
| 216|0x00000000cd800000, 0x00000000cd800000, 0x00000000cd900000| 0%| F| |TAMS 0x00000000cd800000, 0x00000000cd800000| Untracked
|
||||
| 217|0x00000000cd900000, 0x00000000cd900000, 0x00000000cda00000| 0%| F| |TAMS 0x00000000cd900000, 0x00000000cd900000| Untracked
|
||||
| 218|0x00000000cda00000, 0x00000000cda00000, 0x00000000cdb00000| 0%| F| |TAMS 0x00000000cda00000, 0x00000000cda00000| Untracked
|
||||
| 219|0x00000000cdb00000, 0x00000000cdb00000, 0x00000000cdc00000| 0%| F| |TAMS 0x00000000cdb00000, 0x00000000cdb00000| Untracked
|
||||
| 220|0x00000000cdc00000, 0x00000000cdc00000, 0x00000000cdd00000| 0%| F| |TAMS 0x00000000cdc00000, 0x00000000cdc00000| Untracked
|
||||
| 221|0x00000000cdd00000, 0x00000000cdd00000, 0x00000000cde00000| 0%| F| |TAMS 0x00000000cdd00000, 0x00000000cdd00000| Untracked
|
||||
| 222|0x00000000cde00000, 0x00000000cde00000, 0x00000000cdf00000| 0%| F| |TAMS 0x00000000cde00000, 0x00000000cde00000| Untracked
|
||||
| 223|0x00000000cdf00000, 0x00000000cdf00000, 0x00000000ce000000| 0%| F| |TAMS 0x00000000cdf00000, 0x00000000cdf00000| Untracked
|
||||
| 224|0x00000000ce000000, 0x00000000ce000000, 0x00000000ce100000| 0%| F| |TAMS 0x00000000ce000000, 0x00000000ce000000| Untracked
|
||||
| 225|0x00000000ce100000, 0x00000000ce100000, 0x00000000ce200000| 0%| F| |TAMS 0x00000000ce100000, 0x00000000ce100000| Untracked
|
||||
| 226|0x00000000ce200000, 0x00000000ce200000, 0x00000000ce300000| 0%| F| |TAMS 0x00000000ce200000, 0x00000000ce200000| Untracked
|
||||
| 227|0x00000000ce300000, 0x00000000ce300000, 0x00000000ce400000| 0%| F| |TAMS 0x00000000ce300000, 0x00000000ce300000| Untracked
|
||||
| 228|0x00000000ce400000, 0x00000000ce400000, 0x00000000ce500000| 0%| F| |TAMS 0x00000000ce400000, 0x00000000ce400000| Untracked
|
||||
| 229|0x00000000ce500000, 0x00000000ce500000, 0x00000000ce600000| 0%| F| |TAMS 0x00000000ce500000, 0x00000000ce500000| Untracked
|
||||
| 230|0x00000000ce600000, 0x00000000ce600000, 0x00000000ce700000| 0%| F| |TAMS 0x00000000ce600000, 0x00000000ce600000| Untracked
|
||||
| 231|0x00000000ce700000, 0x00000000ce800000, 0x00000000ce800000|100%| E| |TAMS 0x00000000ce700000, 0x00000000ce700000| Complete
|
||||
| 232|0x00000000ce800000, 0x00000000ce900000, 0x00000000ce900000|100%| E|CS|TAMS 0x00000000ce800000, 0x00000000ce800000| Complete
|
||||
| 233|0x00000000ce900000, 0x00000000cea00000, 0x00000000cea00000|100%| E|CS|TAMS 0x00000000ce900000, 0x00000000ce900000| Complete
|
||||
| 234|0x00000000cea00000, 0x00000000ceb00000, 0x00000000ceb00000|100%| E|CS|TAMS 0x00000000cea00000, 0x00000000cea00000| Complete
|
||||
| 235|0x00000000ceb00000, 0x00000000cec00000, 0x00000000cec00000|100%| E|CS|TAMS 0x00000000ceb00000, 0x00000000ceb00000| Complete
|
||||
| 236|0x00000000cec00000, 0x00000000ced00000, 0x00000000ced00000|100%| E|CS|TAMS 0x00000000cec00000, 0x00000000cec00000| Complete
|
||||
| 237|0x00000000ced00000, 0x00000000cee00000, 0x00000000cee00000|100%| E|CS|TAMS 0x00000000ced00000, 0x00000000ced00000| Complete
|
||||
| 238|0x00000000cee00000, 0x00000000cef00000, 0x00000000cef00000|100%| E|CS|TAMS 0x00000000cee00000, 0x00000000cee00000| Complete
|
||||
| 239|0x00000000cef00000, 0x00000000cf000000, 0x00000000cf000000|100%| E|CS|TAMS 0x00000000cef00000, 0x00000000cef00000| Complete
|
||||
| 240|0x00000000cf000000, 0x00000000cf100000, 0x00000000cf100000|100%| E|CS|TAMS 0x00000000cf000000, 0x00000000cf000000| Complete
|
||||
| 241|0x00000000cf100000, 0x00000000cf200000, 0x00000000cf200000|100%| E|CS|TAMS 0x00000000cf100000, 0x00000000cf100000| Complete
|
||||
| 242|0x00000000cf200000, 0x00000000cf300000, 0x00000000cf300000|100%| E|CS|TAMS 0x00000000cf200000, 0x00000000cf200000| Complete
|
||||
| 243|0x00000000cf300000, 0x00000000cf400000, 0x00000000cf400000|100%| E|CS|TAMS 0x00000000cf300000, 0x00000000cf300000| Complete
|
||||
| 244|0x00000000cf400000, 0x00000000cf500000, 0x00000000cf500000|100%| E|CS|TAMS 0x00000000cf400000, 0x00000000cf400000| Complete
|
||||
| 245|0x00000000cf500000, 0x00000000cf600000, 0x00000000cf600000|100%| E|CS|TAMS 0x00000000cf500000, 0x00000000cf500000| Complete
|
||||
|
||||
Card table byte_map: [0x000002db60750000,0x000002db60950000] _byte_map_base: 0x000002db60150000
|
||||
|
||||
Marking Bits (Prev, Next): (CMBitMap*) 0x000002db46fdad60, (CMBitMap*) 0x000002db46fdada0
|
||||
Prev Bits: [0x000002db60b50000, 0x000002db61b50000)
|
||||
Next Bits: [0x000002db61b50000, 0x000002db62b50000)
|
||||
|
||||
Polling page: 0x000002db470e0000
|
||||
|
||||
Metaspace:
|
||||
|
||||
Usage:
|
||||
Non-class: 17.32 MB used.
|
||||
Class: 2.98 MB used.
|
||||
Both: 20.31 MB used.
|
||||
|
||||
Virtual space:
|
||||
Non-class space: 64.00 MB reserved, 17.50 MB ( 27%) committed, 1 nodes.
|
||||
Class space: 1.00 GB reserved, 3.12 MB ( <1%) committed, 1 nodes.
|
||||
Both: 1.06 GB reserved, 20.62 MB ( 2%) committed.
|
||||
|
||||
Chunk freelists:
|
||||
Non-Class: 13.72 MB
|
||||
Class: 12.69 MB
|
||||
Both: 26.41 MB
|
||||
|
||||
MaxMetaspaceSize: unlimited
|
||||
CompressedClassSpaceSize: 1.00 GB
|
||||
Initial GC threshold: 21.00 MB
|
||||
Current GC threshold: 21.00 MB
|
||||
CDS: on
|
||||
MetaspaceReclaimPolicy: balanced
|
||||
- commit_granule_bytes: 65536.
|
||||
- commit_granule_words: 8192.
|
||||
- virtual_space_node_default_size: 8388608.
|
||||
- enlarge_chunks_in_place: 1.
|
||||
- new_chunks_are_fully_committed: 0.
|
||||
- uncommit_free_chunks: 1.
|
||||
- use_allocation_guard: 0.
|
||||
- handle_deallocations: 1.
|
||||
|
||||
|
||||
Internal statistics:
|
||||
|
||||
num_allocs_failed_limit: 0.
|
||||
num_arena_births: 248.
|
||||
num_arena_deaths: 0.
|
||||
num_vsnodes_births: 2.
|
||||
num_vsnodes_deaths: 0.
|
||||
num_space_committed: 330.
|
||||
num_space_uncommitted: 0.
|
||||
num_chunks_returned_to_freelist: 0.
|
||||
num_chunks_taken_from_freelist: 965.
|
||||
num_chunk_merges: 0.
|
||||
num_chunk_splits: 645.
|
||||
num_chunks_enlarged: 467.
|
||||
num_inconsistent_stats: 0.
|
||||
|
||||
CodeHeap 'non-profiled nmethods': size=119168Kb used=1380Kb max_used=1380Kb free=117787Kb
|
||||
bounds [0x000002db58870000, 0x000002db58ae0000, 0x000002db5fcd0000]
|
||||
CodeHeap 'profiled nmethods': size=119104Kb used=6167Kb max_used=6167Kb free=112936Kb
|
||||
bounds [0x000002db50cd0000, 0x000002db512e0000, 0x000002db58120000]
|
||||
CodeHeap 'non-nmethods': size=7488Kb used=2927Kb max_used=2972Kb free=4560Kb
|
||||
bounds [0x000002db58120000, 0x000002db58420000, 0x000002db58870000]
|
||||
total_blobs=3405 nmethods=2856 adapters=458
|
||||
compilation: enabled
|
||||
stopped_count=0, restarted_count=0
|
||||
full_count=0
|
||||
|
||||
Compilation events (20 events):
|
||||
Event: 4.133 Thread 0x000002db65b38090 nmethod 2854 0x000002db512b5d10 code [0x000002db512b5fa0, 0x000002db512b67a8]
|
||||
Event: 4.133 Thread 0x000002db65b38090 2856 3 java.lang.invoke.AbstractValidatingLambdaMetafactory::isAdaptableToAsReturn (36 bytes)
|
||||
Event: 4.134 Thread 0x000002db65c4c180 nmethod 2857 0x000002db512b6b10 code [0x000002db512b6f40, 0x000002db512b9358]
|
||||
Event: 4.134 Thread 0x000002db65c4c180 2858 3 java.lang.invoke.AbstractValidatingLambdaMetafactory::isAdaptableToAsReturnStrict (34 bytes)
|
||||
Event: 4.134 Thread 0x000002db65b38090 nmethod 2856 0x000002db512b9f10 code [0x000002db512ba0e0, 0x000002db512ba568]
|
||||
Event: 4.134 Thread 0x000002db65b38090 2859 ! 3 java.lang.invoke.InnerClassLambdaMetafactory::buildCallSite (201 bytes)
|
||||
Event: 4.134 Thread 0x000002db65c4c180 nmethod 2858 0x000002db512ba690 code [0x000002db512ba860, 0x000002db512bae08]
|
||||
Event: 4.134 Thread 0x000002db65c4c180 2860 3 java.lang.invoke.LambdaMetafactory::metafactory (71 bytes)
|
||||
Event: 4.135 Thread 0x000002db65c4c180 nmethod 2860 0x000002db512baf90 code [0x000002db512bb220, 0x000002db512bbd48]
|
||||
Event: 4.137 Thread 0x000002db65b38090 nmethod 2859 0x000002db512bc290 code [0x000002db512bc780, 0x000002db512bebe8]
|
||||
Event: 4.138 Thread 0x000002db65c4c6d0 nmethod 2855 0x000002db512bfb90 code [0x000002db512c0640, 0x000002db512c80e8]
|
||||
Event: 4.138 Thread 0x000002db65c4b190 nmethod 2851 0x000002db512ca910 code [0x000002db512cb2a0, 0x000002db512d1088]
|
||||
Event: 4.138 Thread 0x000002db65c4c6d0 2862 3 jdk.internal.org.objectweb.asm.MethodVisitor::visitFieldInsn (20 bytes)
|
||||
Event: 4.138 Thread 0x000002db65c4c6d0 nmethod 2862 0x000002db512d2f10 code [0x000002db512d30c0, 0x000002db512d32c8]
|
||||
Event: 4.140 Thread 0x000002db65c4b190 2863 3 java.lang.invoke.TypeConvertingMethodAdapter::cast (42 bytes)
|
||||
Event: 4.141 Thread 0x000002db65c4b190 nmethod 2863 0x000002db512d3390 code [0x000002db512d3580, 0x000002db512d39e8]
|
||||
Event: 4.146 Thread 0x000002db65b38090 2864 3 jdk.internal.org.objectweb.asm.SymbolTable::putBootstrapMethods (56 bytes)
|
||||
Event: 4.146 Thread 0x000002db65b38090 nmethod 2864 0x000002db512d3b90 code [0x000002db512d3d80, 0x000002db512d4088]
|
||||
Event: 4.149 Thread 0x000002db65b38090 2866 1 java.util.stream.ReferencePipeline$StatelessOp::opIsStateful (2 bytes)
|
||||
Event: 4.150 Thread 0x000002db65b38090 nmethod 2866 0x000002db589c9090 code [0x000002db589c9220, 0x000002db589c92f8]
|
||||
|
||||
GC Heap History (6 events):
|
||||
Event: 0.551 GC heap before
|
||||
{Heap before GC invocations=0 (full 0):
|
||||
garbage-first heap total 251904K, used 26624K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 23 young (23552K), 0 survivors (0K)
|
||||
Metaspace used 2952K, committed 3136K, reserved 1114112K
|
||||
class space used 369K, committed 448K, reserved 1048576K
|
||||
}
|
||||
Event: 0.555 GC heap after
|
||||
{Heap after GC invocations=1 (full 0):
|
||||
garbage-first heap total 251904K, used 10687K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 3 young (3072K), 3 survivors (3072K)
|
||||
Metaspace used 2952K, committed 3136K, reserved 1114112K
|
||||
class space used 369K, committed 448K, reserved 1048576K
|
||||
}
|
||||
Event: 0.977 GC heap before
|
||||
{Heap before GC invocations=1 (full 0):
|
||||
garbage-first heap total 251904K, used 37311K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 29 young (29696K), 3 survivors (3072K)
|
||||
Metaspace used 4108K, committed 4288K, reserved 1114112K
|
||||
class space used 497K, committed 576K, reserved 1048576K
|
||||
}
|
||||
Event: 0.980 GC heap after
|
||||
{Heap after GC invocations=2 (full 0):
|
||||
garbage-first heap total 251904K, used 11377K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 1 young (1024K), 1 survivors (1024K)
|
||||
Metaspace used 4108K, committed 4288K, reserved 1114112K
|
||||
class space used 497K, committed 576K, reserved 1048576K
|
||||
}
|
||||
Event: 3.839 GC heap before
|
||||
{Heap before GC invocations=2 (full 0):
|
||||
garbage-first heap total 251904K, used 115825K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 102 young (104448K), 1 survivors (1024K)
|
||||
Metaspace used 18971K, committed 19264K, reserved 1114112K
|
||||
class space used 2760K, committed 2944K, reserved 1048576K
|
||||
}
|
||||
Event: 3.846 GC heap after
|
||||
{Heap after GC invocations=3 (full 0):
|
||||
garbage-first heap total 251904K, used 21531K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 11 young (11264K), 11 survivors (11264K)
|
||||
Metaspace used 18971K, committed 19264K, reserved 1114112K
|
||||
class space used 2760K, committed 2944K, reserved 1048576K
|
||||
}
|
||||
|
||||
Dll operation events (15 events):
|
||||
Event: 0.011 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\java.dll
|
||||
Event: 0.029 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jsvml.dll
|
||||
Event: 0.084 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\zip.dll
|
||||
Event: 0.089 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\instrument.dll
|
||||
Event: 0.094 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\net.dll
|
||||
Event: 0.097 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\nio.dll
|
||||
Event: 0.100 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\zip.dll
|
||||
Event: 0.278 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jimage.dll
|
||||
Event: 0.329 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\verify.dll
|
||||
Event: 0.481 Loaded shared library F:\gradle\native\c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48\windows-amd64\native-platform.dll
|
||||
Event: 0.486 Loaded shared library F:\gradle\native\38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47\windows-amd64\native-platform-file-events.dll
|
||||
Event: 1.309 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management.dll
|
||||
Event: 1.313 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management_ext.dll
|
||||
Event: 1.761 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\extnet.dll
|
||||
Event: 2.167 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\sunmscapi.dll
|
||||
|
||||
Deoptimization events (20 events):
|
||||
Event: 3.315 Thread 0x000002db6b99b4a0 DEOPT PACKING pc=0x000002db58956c38 sp=0x000000f419ffa860
|
||||
Event: 3.315 Thread 0x000002db6b99b4a0 DEOPT UNPACKING pc=0x000002db581769a3 sp=0x000000f419ffa7f8 mode 2
|
||||
Event: 3.326 Thread 0x000002db6b99b4a0 DEOPT PACKING pc=0x000002db510d3a4a sp=0x000000f419ff66c0
|
||||
Event: 3.326 Thread 0x000002db6b99b4a0 DEOPT UNPACKING pc=0x000002db58177143 sp=0x000000f419ff5bd0 mode 0
|
||||
Event: 3.372 Thread 0x000002db6b99b4a0 DEOPT PACKING pc=0x000002db510d3a4a sp=0x000000f419ff7050
|
||||
Event: 3.372 Thread 0x000002db6b99b4a0 DEOPT UNPACKING pc=0x000002db58177143 sp=0x000000f419ff6560 mode 0
|
||||
Event: 3.392 Thread 0x000002db6b99b4a0 DEOPT PACKING pc=0x000002db510d3a4a sp=0x000000f419ff60c0
|
||||
Event: 3.392 Thread 0x000002db6b99b4a0 DEOPT UNPACKING pc=0x000002db58177143 sp=0x000000f419ff55d0 mode 0
|
||||
Event: 3.700 Thread 0x000002db6b99b4a0 Uncommon trap: trap_request=0xffffff45 fr.pc=0x000002db58987e00 relative=0x00000000000003c0
|
||||
Event: 3.700 Thread 0x000002db6b99b4a0 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000002db58987e00 method=java.util.HashMap.getNode(Ljava/lang/Object;)Ljava/util/HashMap$Node; @ 131 c2
|
||||
Event: 3.700 Thread 0x000002db6b99b4a0 DEOPT PACKING pc=0x000002db58987e00 sp=0x000000f419ffaab0
|
||||
Event: 3.700 Thread 0x000002db6b99b4a0 DEOPT UNPACKING pc=0x000002db581769a3 sp=0x000000f419ffa9d0 mode 2
|
||||
Event: 3.873 Thread 0x000002db6b99b4a0 Uncommon trap: trap_request=0xffffff6e fr.pc=0x000002db5892cd0c relative=0x00000000000003ec
|
||||
Event: 3.873 Thread 0x000002db6b99b4a0 Uncommon trap: reason=loop_limit_check action=maybe_recompile pc=0x000002db5892cd0c method=java.lang.StringLatin1.indexOf([BI[BII)I @ 37 c2
|
||||
Event: 3.873 Thread 0x000002db6b99b4a0 DEOPT PACKING pc=0x000002db5892cd0c sp=0x000000f419ff81f0
|
||||
Event: 3.873 Thread 0x000002db6b99b4a0 DEOPT UNPACKING pc=0x000002db581769a3 sp=0x000000f419ff8150 mode 2
|
||||
Event: 4.082 Thread 0x000002db6b99b4a0 Uncommon trap: trap_request=0xffffff76 fr.pc=0x000002db589c712c relative=0x000000000000016c
|
||||
Event: 4.082 Thread 0x000002db6b99b4a0 Uncommon trap: reason=predicate action=maybe_recompile pc=0x000002db589c712c method=com.google.common.base.CharMatcher.indexIn(Ljava/lang/CharSequence;I)I @ 19 c2
|
||||
Event: 4.082 Thread 0x000002db6b99b4a0 DEOPT PACKING pc=0x000002db589c712c sp=0x000000f419ff9fd0
|
||||
Event: 4.082 Thread 0x000002db6b99b4a0 DEOPT UNPACKING pc=0x000002db581769a3 sp=0x000000f419ff9f60 mode 2
|
||||
|
||||
Classes loaded (20 events):
|
||||
Event: 3.617 Loading class javax/xml/parsers/ParserConfigurationException
|
||||
Event: 3.618 Loading class javax/xml/parsers/ParserConfigurationException done
|
||||
Event: 3.618 Loading class org/xml/sax/SAXException
|
||||
Event: 3.618 Loading class org/xml/sax/SAXException done
|
||||
Event: 3.618 Loading class javax/xml/xpath/XPathExpressionException
|
||||
Event: 3.618 Loading class javax/xml/xpath/XPathException
|
||||
Event: 3.619 Loading class javax/xml/xpath/XPathException done
|
||||
Event: 3.619 Loading class javax/xml/xpath/XPathExpressionException done
|
||||
Event: 3.619 Loading class org/xml/sax/ErrorHandler
|
||||
Event: 3.619 Loading class org/xml/sax/ErrorHandler done
|
||||
Event: 4.073 Loading class java/util/concurrent/TimeoutException
|
||||
Event: 4.073 Loading class java/util/concurrent/TimeoutException done
|
||||
Event: 4.073 Loading class java/util/concurrent/CancellationException
|
||||
Event: 4.074 Loading class java/util/concurrent/CancellationException done
|
||||
Event: 4.116 Loading class java/util/concurrent/locks/AbstractQueuedSynchronizer$SharedNode
|
||||
Event: 4.119 Loading class java/util/concurrent/locks/AbstractQueuedSynchronizer$SharedNode done
|
||||
Event: 4.125 Loading class java/io/InterruptedIOException
|
||||
Event: 4.125 Loading class java/io/InterruptedIOException done
|
||||
Event: 4.144 Loading class java/util/ArrayDeque$DeqSpliterator
|
||||
Event: 4.146 Loading class java/util/ArrayDeque$DeqSpliterator done
|
||||
|
||||
Classes unloaded (0 events):
|
||||
No events
|
||||
|
||||
Classes redefined (0 events):
|
||||
No events
|
||||
|
||||
Internal exceptions (20 events):
|
||||
Event: 2.754 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000cbad0690}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000cbad0690)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 2.755 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000cbad4f60}: 'java.lang.Object java.lang.invoke.Invokers$Holder.invoker(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000cbad4f60)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 2.756 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000cbadaae8}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000cbadaae8)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 2.914 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000cb4c3210}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStaticInit(java.lang.Object)'> (0x00000000cb4c3210)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 2.932 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000cb3722f8}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.newInvokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x00000000cb3722f8)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 2.933 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000cb376c28}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x00000000cb376c28)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 2.933 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000cb37ad40}: 'java.lang.Object java.lang.invoke.Invokers$Holder.linkToTargetMethod(java.lang.Object, java.lang.Object, int, java.lang.Object)'> (0x00000000cb37ad40)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.342 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000ca2d3350}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeSpecialIFC(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000ca2d3350)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.345 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000ca2e25a0}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeInterface(java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000ca2e25a0)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.345 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/IncompatibleClassChangeError'{0x00000000ca2e6460}: Found class java.lang.Object, but interface was expected> (0x00000000ca2e6460)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 826]
|
||||
Event: 3.411 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c9f3fc30}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000c9f3fc30)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.412 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c9f43858}: 'java.lang.Object java.lang.invoke.Invokers$Holder.invokeExact_MT(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000c9f43858)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.671 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c9625338}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeVirtual(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000c9625338)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.713 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c956ce78}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.newInvokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000c956ce78)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.713 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c9571b48}: 'java.lang.Object java.lang.invoke.Invokers$Holder.linkToTargetMethod(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000c9571b48)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 3.742 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c94c72c0}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeVirtual(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Ob
|
||||
Event: 4.129 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000ce980678}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000ce980678)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 4.135 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000ce994cc0}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeVirtual(java.lang.Object, java.lang.Object)'> (0x00000000ce994cc0)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 4.139 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000ce9a7528}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeStaticInit(java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000ce9a7528)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 4.149 Thread 0x000002db6b99b4a0 Exception <a 'java/lang/NoSuchMethodError'{0x00000000ce9ce580}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeVirtual(java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000ce9ce580)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
|
||||
VM Operations (20 events):
|
||||
Event: 1.457 Executing VM operation: HandshakeAllThreads
|
||||
Event: 1.457 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 1.566 Executing VM operation: HandshakeAllThreads
|
||||
Event: 1.566 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 1.725 Executing VM operation: HandshakeAllThreads
|
||||
Event: 1.725 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 2.047 Executing VM operation: HandshakeAllThreads
|
||||
Event: 2.047 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 2.047 Executing VM operation: Cleanup
|
||||
Event: 2.047 Executing VM operation: Cleanup done
|
||||
Event: 2.139 Executing VM operation: HandshakeAllThreads
|
||||
Event: 2.139 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 2.987 Executing VM operation: ICBufferFull
|
||||
Event: 2.987 Executing VM operation: ICBufferFull done
|
||||
Event: 3.065 Executing VM operation: HandshakeAllThreads
|
||||
Event: 3.065 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 3.065 Executing VM operation: HandshakeAllThreads
|
||||
Event: 3.066 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 3.839 Executing VM operation: G1CollectForAllocation
|
||||
Event: 3.846 Executing VM operation: G1CollectForAllocation done
|
||||
|
||||
Memory protections (0 events):
|
||||
No events
|
||||
|
||||
Nmethod flushes (0 events):
|
||||
No events
|
||||
|
||||
Events (20 events):
|
||||
Event: 0.069 Thread 0x000002db65b38090 Thread added: 0x000002db65c4c6d0
|
||||
Event: 0.070 Thread 0x000002db65c4c6d0 Thread added: 0x000002db65c4b190
|
||||
Event: 0.110 Thread 0x000002db49158430 Thread added: 0x000002db65d1a600
|
||||
Event: 0.275 Thread 0x000002db65c4b190 Thread added: 0x000002db65c4cc20
|
||||
Event: 1.366 Thread 0x000002db49158430 Thread added: 0x000002db6baaf8a0
|
||||
Event: 2.001 Thread 0x000002db49158430 Thread added: 0x000002db6bb79060
|
||||
Event: 2.097 Thread 0x000002db49158430 Thread added: 0x000002db6b6cee60
|
||||
Event: 2.193 Thread 0x000002db6bb79060 Thread added: 0x000002db6b49f870
|
||||
Event: 2.199 Thread 0x000002db6b49f870 Thread added: 0x000002db6bc69840
|
||||
Event: 2.301 Thread 0x000002db6b49f870 Thread added: 0x000002db6bc27b60
|
||||
Event: 2.311 Thread 0x000002db6b49f870 Thread added: 0x000002db6b99b4a0
|
||||
Event: 2.324 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b99b9b0
|
||||
Event: 2.329 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b99cdf0
|
||||
Event: 2.335 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b99c8e0
|
||||
Event: 2.385 Thread 0x000002db65c4cc20 Thread exited: 0x000002db65c4cc20
|
||||
Event: 2.930 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b999640
|
||||
Event: 2.940 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b99c3d0
|
||||
Event: 3.301 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b99a060
|
||||
Event: 4.116 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b99af90
|
||||
Event: 4.131 Thread 0x000002db6b99b4a0 Thread added: 0x000002db6b99bec0
|
||||
|
||||
|
||||
Dynamic libraries:
|
||||
0x00007ff7072d0000 - 0x00007ff7072de000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\java.exe
|
||||
0x00007ffe87670000 - 0x00007ffe87868000 C:\Windows\SYSTEM32\ntdll.dll
|
||||
0x00007ffe85800000 - 0x00007ffe858c2000 C:\Windows\System32\KERNEL32.DLL
|
||||
0x00007ffe84f50000 - 0x00007ffe85246000 C:\Windows\System32\KERNELBASE.dll
|
||||
0x00007ffe84e20000 - 0x00007ffe84f20000 C:\Windows\System32\ucrtbase.dll
|
||||
0x00007ffdf5920000 - 0x00007ffdf593e000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\VCRUNTIME140.dll
|
||||
0x00007ffdf5940000 - 0x00007ffdf5958000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jli.dll
|
||||
0x00007ffe86750000 - 0x00007ffe868f1000 C:\Windows\System32\USER32.dll
|
||||
0x00007ffe6d7d0000 - 0x00007ffe6da6b000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.6456_none_60b8a6cb71f64256\COMCTL32.dll
|
||||
0x00007ffe861e0000 - 0x00007ffe8627e000 C:\Windows\System32\msvcrt.dll
|
||||
0x00007ffe84f20000 - 0x00007ffe84f42000 C:\Windows\System32\win32u.dll
|
||||
0x00007ffe86280000 - 0x00007ffe862ab000 C:\Windows\System32\GDI32.dll
|
||||
0x00007ffe85570000 - 0x00007ffe85689000 C:\Windows\System32\gdi32full.dll
|
||||
0x00007ffe84d00000 - 0x00007ffe84d9d000 C:\Windows\System32\msvcp_win.dll
|
||||
0x00007ffe86660000 - 0x00007ffe8668f000 C:\Windows\System32\IMM32.DLL
|
||||
0x00007ffe4e150000 - 0x00007ffe4e15c000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\vcruntime140_1.dll
|
||||
0x00007ffdf5890000 - 0x00007ffdf5919000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\msvcp140.dll
|
||||
0x00007ffdf4c10000 - 0x00007ffdf588a000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\server\jvm.dll
|
||||
0x00007ffe86690000 - 0x00007ffe86741000 C:\Windows\System32\ADVAPI32.dll
|
||||
0x00007ffe858d0000 - 0x00007ffe8596f000 C:\Windows\System32\sechost.dll
|
||||
0x00007ffe860c0000 - 0x00007ffe861e0000 C:\Windows\System32\RPCRT4.dll
|
||||
0x00007ffe85440000 - 0x00007ffe85467000 C:\Windows\System32\bcrypt.dll
|
||||
0x00007ffe85fa0000 - 0x00007ffe8600b000 C:\Windows\System32\WS2_32.dll
|
||||
0x00007ffe7dc00000 - 0x00007ffe7dc0a000 C:\Windows\SYSTEM32\VERSION.dll
|
||||
0x00007ffe84240000 - 0x00007ffe8428b000 C:\Windows\SYSTEM32\POWRPROF.dll
|
||||
0x00007ffe7ad90000 - 0x00007ffe7adb7000 C:\Windows\SYSTEM32\WINMM.dll
|
||||
0x00007ffe84100000 - 0x00007ffe84112000 C:\Windows\SYSTEM32\UMPDC.dll
|
||||
0x00007ffe83510000 - 0x00007ffe83522000 C:\Windows\SYSTEM32\kernel.appcore.dll
|
||||
0x00007ffe42e00000 - 0x00007ffe42e0a000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jimage.dll
|
||||
0x00007ffe83040000 - 0x00007ffe83241000 C:\Windows\SYSTEM32\DBGHELP.DLL
|
||||
0x00007ffe6b0a0000 - 0x00007ffe6b0d4000 C:\Windows\SYSTEM32\dbgcore.DLL
|
||||
0x00007ffe853b0000 - 0x00007ffe85432000 C:\Windows\System32\bcryptPrimitives.dll
|
||||
0x00007ffe7f940000 - 0x00007ffe7f94f000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\instrument.dll
|
||||
0x00007ffdf4be0000 - 0x00007ffdf4c06000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\java.dll
|
||||
0x00007ffdf4b00000 - 0x00007ffdf4bd6000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jsvml.dll
|
||||
0x00007ffe86c60000 - 0x00007ffe873d0000 C:\Windows\System32\SHELL32.dll
|
||||
0x00007ffe82890000 - 0x00007ffe83035000 C:\Windows\SYSTEM32\windows.storage.dll
|
||||
0x00007ffe86900000 - 0x00007ffe86c54000 C:\Windows\System32\combase.dll
|
||||
0x00007ffe84730000 - 0x00007ffe8475b000 C:\Windows\SYSTEM32\Wldp.dll
|
||||
0x00007ffe85e00000 - 0x00007ffe85ecd000 C:\Windows\System32\OLEAUT32.dll
|
||||
0x00007ffe86010000 - 0x00007ffe860bd000 C:\Windows\System32\SHCORE.dll
|
||||
0x00007ffe875d0000 - 0x00007ffe8762b000 C:\Windows\System32\shlwapi.dll
|
||||
0x00007ffe84c30000 - 0x00007ffe84c54000 C:\Windows\SYSTEM32\profapi.dll
|
||||
0x00007ffdf4aa0000 - 0x00007ffdf4ab8000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\zip.dll
|
||||
0x00007ffdf4ae0000 - 0x00007ffdf4afb000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\net.dll
|
||||
0x00007ffe7eac0000 - 0x00007ffe7ebca000 C:\Windows\SYSTEM32\WINHTTP.dll
|
||||
0x00007ffe84490000 - 0x00007ffe844fa000 C:\Windows\system32\mswsock.dll
|
||||
0x00007ffdf4ac0000 - 0x00007ffdf4ad6000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\nio.dll
|
||||
0x00007ffdf3210000 - 0x00007ffdf3220000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\verify.dll
|
||||
0x00007ffe7fde0000 - 0x00007ffe7fe07000 F:\gradle\native\c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48\windows-amd64\native-platform.dll
|
||||
0x00007ffe29cc0000 - 0x00007ffe29e04000 F:\gradle\native\38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47\windows-amd64\native-platform-file-events.dll
|
||||
0x00007ffe6dc30000 - 0x00007ffe6dc3a000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management.dll
|
||||
0x00007ffe6b750000 - 0x00007ffe6b75c000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management_ext.dll
|
||||
0x00007ffe85980000 - 0x00007ffe85988000 C:\Windows\System32\PSAPI.DLL
|
||||
0x00007ffe84690000 - 0x00007ffe846a8000 C:\Windows\SYSTEM32\CRYPTSP.dll
|
||||
0x00007ffe83d40000 - 0x00007ffe83d78000 C:\Windows\system32\rsaenh.dll
|
||||
0x00007ffe84bb0000 - 0x00007ffe84bde000 C:\Windows\SYSTEM32\USERENV.dll
|
||||
0x00007ffe84680000 - 0x00007ffe8468c000 C:\Windows\SYSTEM32\CRYPTBASE.dll
|
||||
0x00007ffe84120000 - 0x00007ffe8415b000 C:\Windows\SYSTEM32\IPHLPAPI.DLL
|
||||
0x00007ffe85970000 - 0x00007ffe85978000 C:\Windows\System32\NSI.dll
|
||||
0x00007ffe7dbb0000 - 0x00007ffe7dbc7000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL
|
||||
0x00007ffe7e000000 - 0x00007ffe7e01d000 C:\Windows\SYSTEM32\dhcpcsvc.DLL
|
||||
0x00007ffe84170000 - 0x00007ffe8423a000 C:\Windows\SYSTEM32\DNSAPI.dll
|
||||
0x00007ffe252e0000 - 0x00007ffe252e9000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\extnet.dll
|
||||
0x00007ffe6b680000 - 0x00007ffe6b68e000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\sunmscapi.dll
|
||||
0x00007ffe85250000 - 0x00007ffe853ad000 C:\Windows\System32\CRYPT32.dll
|
||||
0x00007ffe847a0000 - 0x00007ffe847c7000 C:\Windows\SYSTEM32\ncrypt.dll
|
||||
0x00007ffe84760000 - 0x00007ffe8479b000 C:\Windows\SYSTEM32\NTASN1.dll
|
||||
0x00007ffe58af0000 - 0x00007ffe58af7000 C:\Windows\system32\wshunix.dll
|
||||
|
||||
dbghelp: loaded successfully - version: 4.0.5 - missing functions: none
|
||||
symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Users\SelfImpr\.jdks\ms-17.0.18\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.6456_none_60b8a6cb71f64256;C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\server;F:\gradle\native\c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48\windows-amd64;F:\gradle\native\38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47\windows-amd64
|
||||
|
||||
VM Arguments:
|
||||
jvm_args: --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=CN -Duser.language=zh -Duser.variant -javaagent:F:\gradle\wrapper\dists\gradle-8.5-all\dckgjkhjnjukymoblh8u3ms10\gradle-8.5\lib\agents\gradle-instrumentation-agent-8.5.jar
|
||||
java_command: org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.5
|
||||
java_class_path (initial): F:\gradle\wrapper\dists\gradle-8.5-all\dckgjkhjnjukymoblh8u3ms10\gradle-8.5\lib\gradle-launcher-8.5.jar
|
||||
Launcher Type: SUN_STANDARD
|
||||
|
||||
[Global flags]
|
||||
intx CICompilerCount = 12 {product} {ergonomic}
|
||||
uint ConcGCThreads = 3 {product} {ergonomic}
|
||||
uint G1ConcRefinementThreads = 13 {product} {ergonomic}
|
||||
size_t G1HeapRegionSize = 1048576 {product} {ergonomic}
|
||||
uintx GCDrainStackTargetSize = 64 {product} {ergonomic}
|
||||
size_t InitialHeapSize = 257949696 {product} {ergonomic}
|
||||
size_t MarkStackSize = 4194304 {product} {ergonomic}
|
||||
size_t MaxHeapSize = 1073741824 {product} {command line}
|
||||
size_t MaxNewSize = 643825664 {product} {ergonomic}
|
||||
size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic}
|
||||
size_t MinHeapSize = 8388608 {product} {ergonomic}
|
||||
uintx NonNMethodCodeHeapSize = 7602480 {pd product} {ergonomic}
|
||||
uintx NonProfiledCodeHeapSize = 122027880 {pd product} {ergonomic}
|
||||
uintx ProfiledCodeHeapSize = 122027880 {pd product} {ergonomic}
|
||||
uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic}
|
||||
bool SegmentedCodeCache = true {product} {ergonomic}
|
||||
size_t SoftMaxHeapSize = 1073741824 {manageable} {ergonomic}
|
||||
bool UseCompressedClassPointers = true {product lp64_product} {ergonomic}
|
||||
bool UseCompressedOops = true {product lp64_product} {ergonomic}
|
||||
bool UseG1GC = true {product} {ergonomic}
|
||||
bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic}
|
||||
|
||||
Logging:
|
||||
Log output configuration:
|
||||
#0: stdout all=warning uptime,level,tags
|
||||
#1: stderr all=off uptime,level,tags
|
||||
|
||||
Environment Variables:
|
||||
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291
|
||||
PATH=C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;rogram Files\TortoiseGit\bin;C:\Program Files (x86)\Go\bin;Program Files (x86)\Git\cmd;G:\开发软件\Git\Git\cmd;C:\Program Files\nodejs\;C:\Users\SelfImpr\AppData\Local\Microsoft\WindowsApps;C:\Users\SelfImpr\AppData\Local\GitHubDesktop\bin;C:\Users\SelfImpr\go\bin;G:\工作软件\Microsoft VS Code\bin;C:\Users\SelfImpr\AppData\Local\Programs\Fiddler;C:\Program Files\Java\jdk1.8.0_291\bin;D:\LenovoSoftstore\Install\QQliuxidating\QQGameTempest\Hall.58574\;G:\工作软件\cursor\cursor\resources\app\bin;C:\Users\SelfImpr\AppData\Roaming\npm
|
||||
USERNAME=SelfImpr
|
||||
OS=Windows_NT
|
||||
PROCESSOR_IDENTIFIER=AMD64 Family 23 Model 96 Stepping 1, AuthenticAMD
|
||||
TMP=C:\Users\SelfImpr\AppData\Local\Temp
|
||||
TEMP=C:\Users\SelfImpr\AppData\Local\Temp
|
||||
|
||||
|
||||
|
||||
Periodic native trim disabled
|
||||
|
||||
|
||||
--------------- S Y S T E M ---------------
|
||||
|
||||
OS:
|
||||
Windows 10 , 64 bit Build 19041 (10.0.19041.5915)
|
||||
OS uptime: 0 days 6:50 hours
|
||||
|
||||
CPU: total 16 (initial active 16) (16 cores per cpu, 2 threads per core) family 23 model 96 stepping 1 microcode 0x0, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4a, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, clmul, bmi1, bmi2, adx, sha, fma, vzeroupper, clflush, clflushopt
|
||||
Processor Information for the first 16 processors :
|
||||
Max Mhz: 2900, Current Mhz: 2900, Mhz Limit: 2900
|
||||
|
||||
Memory: 4k page, system-wide physical 15741M (164M free)
|
||||
TotalPageFile size 33109M (AvailPageFile size 4M)
|
||||
current process WorkingSet (physical memory assigned to process): 229M, peak: 229M
|
||||
current process commit charge ("private bytes"): 416M, peak: 417M
|
||||
|
||||
vm_info: OpenJDK 64-Bit Server VM (17.0.18+8-LTS) for windows-amd64 JRE (17.0.18+8-LTS), built on Jan 15 2026 18:50:45 by "MicrosoftCorporation" with MS VC++ 17.14 (VS2022)
|
||||
|
||||
END.
|
||||
@@ -0,0 +1,929 @@
|
||||
#
|
||||
# There is insufficient memory for the Java Runtime Environment to continue.
|
||||
# Native memory allocation (malloc) failed to allocate 828624 bytes. Error detail: Chunk::new
|
||||
# Possible reasons:
|
||||
# The system is out of physical RAM or swap space
|
||||
# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
|
||||
# Possible solutions:
|
||||
# Reduce memory load on the system
|
||||
# Increase physical memory or swap space
|
||||
# Check if swap backing store is full
|
||||
# Decrease Java heap size (-Xmx/-Xms)
|
||||
# Decrease number of Java threads
|
||||
# Decrease Java thread stack sizes (-Xss)
|
||||
# Set larger code cache with -XX:ReservedCodeCacheSize=
|
||||
# JVM is running with Unscaled Compressed Oops mode in which the Java heap is
|
||||
# placed in the first 4GB address space. The Java Heap base address is the
|
||||
# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
|
||||
# to set the Java Heap base and to place the Java Heap above 4GB virtual address.
|
||||
# This output file may be truncated or incomplete.
|
||||
#
|
||||
# Out of Memory Error (arena.cpp:191), pid=26756, tid=26828
|
||||
#
|
||||
# JRE version: OpenJDK Runtime Environment Microsoft-13106358 (17.0.18+8) (build 17.0.18+8-LTS)
|
||||
# Java VM: OpenJDK 64-Bit Server VM Microsoft-13106358 (17.0.18+8-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
|
||||
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
|
||||
#
|
||||
|
||||
--------------- S U M M A R Y ------------
|
||||
|
||||
Command Line: --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=CN -Duser.language=zh -Duser.variant -javaagent:F:\gradle\wrapper\dists\gradle-8.5-all\dckgjkhjnjukymoblh8u3ms10\gradle-8.5\lib\agents\gradle-instrumentation-agent-8.5.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.5
|
||||
|
||||
Host: AMD Ryzen 7 4800H with Radeon Graphics , 16 cores, 15G, Windows 10 , 64 bit Build 19041 (10.0.19041.5915)
|
||||
Time: Thu May 7 17:42:03 2026 Windows 10 , 64 bit Build 19041 (10.0.19041.5915) elapsed time: 13.309325 seconds (0d 0h 0m 13s)
|
||||
|
||||
--------------- T H R E A D ---------------
|
||||
|
||||
Current thread (0x000001c47fb48200): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=26828, stack(0x000000412cc00000,0x000000412cd00000)]
|
||||
|
||||
|
||||
Current CompileTask:
|
||||
C2:13309 8694 4 java.lang.reflect.AccessibleObject::checkCanSetAccessible (368 bytes)
|
||||
|
||||
Stack: [0x000000412cc00000,0x000000412cd00000]
|
||||
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
|
||||
V [jvm.dll+0x68c879] (no source info available)
|
||||
V [jvm.dll+0x845979] (no source info available)
|
||||
V [jvm.dll+0x8476e8] (no source info available)
|
||||
V [jvm.dll+0x847d73] (no source info available)
|
||||
V [jvm.dll+0x24cf6f] (no source info available)
|
||||
V [jvm.dll+0xaecb6] (no source info available)
|
||||
V [jvm.dll+0xaf35c] (no source info available)
|
||||
V [jvm.dll+0x37174e] (no source info available)
|
||||
V [jvm.dll+0x33b985] (no source info available)
|
||||
V [jvm.dll+0x33adea] (no source info available)
|
||||
V [jvm.dll+0x21df29] (no source info available)
|
||||
V [jvm.dll+0x21d36d] (no source info available)
|
||||
V [jvm.dll+0x1a8ce6] (no source info available)
|
||||
V [jvm.dll+0x22db1b] (no source info available)
|
||||
V [jvm.dll+0x22bca6] (no source info available)
|
||||
V [jvm.dll+0x7fbabb] (no source info available)
|
||||
V [jvm.dll+0x7f5ebc] (no source info available)
|
||||
V [jvm.dll+0x68de17] (no source info available)
|
||||
C [ucrtbase.dll+0x21bb2] (no source info available)
|
||||
C [KERNEL32.DLL+0x17374] (no source info available)
|
||||
C [ntdll.dll+0x4cc91] (no source info available)
|
||||
|
||||
|
||||
--------------- P R O C E S S ---------------
|
||||
|
||||
Threads class SMR info:
|
||||
_java_thread_list=0x000001c449dc1320, length=119, elements={
|
||||
0x000001c46518eb10, 0x000001c47fb248c0, 0x000001c47fb25650, 0x000001c47fb3e0f0,
|
||||
0x000001c47fb41ae0, 0x000001c47fb443c0, 0x000001c47fb45430, 0x000001c47fb48200,
|
||||
0x000001c47fb4cf50, 0x000001c47fb50400, 0x000001c47fc5c6c0, 0x000001c47fd48d40,
|
||||
0x000001c448edcf50, 0x000001c4490839a0, 0x000001c448c6d4c0, 0x000001c4491f45d0,
|
||||
0x000001c4491f4ab0, 0x000001c447c2c2f0, 0x000001c447c2b8d0, 0x000001c447c2b3c0,
|
||||
0x000001c447c2bde0, 0x000001c447c2a490, 0x000001c447c2c800, 0x000001c447c29050,
|
||||
0x000001c448e9a0b0, 0x000001c448e98c70, 0x000001c448e99690, 0x000001c448e99180,
|
||||
0x000001c448e98760, 0x000001c448e99ba0, 0x000001c448e97d40, 0x000001c448e9afe0,
|
||||
0x000001c448e98250, 0x000001c447c2aeb0, 0x000001c449f21760, 0x000001c449f1f900,
|
||||
0x000001c449f24a00, 0x000001c449f24f10, 0x000001c449f22180, 0x000001c449f20830,
|
||||
0x000001c449f244f0, 0x000001c449f20d40, 0x000001c449f21250, 0x000001c449f1e4c0,
|
||||
0x000001c449f1f3f0, 0x000001c449f21c70, 0x000001c449f1eee0, 0x000001c449f1e9d0,
|
||||
0x000001c449f1daa0, 0x000001c449f22690, 0x000001c449f230b0, 0x000001c449f23fe0,
|
||||
0x000001c449f25420, 0x000001c47ff408f0, 0x000001c47ff42c60, 0x000001c47ff3ea90,
|
||||
0x000001c47ff459f0, 0x000001c47ff41310, 0x000001c47ff403e0, 0x000001c47ff40e00,
|
||||
0x000001c47ff45f00, 0x000001c47ff43680, 0x000001c47ff43170, 0x000001c47ff454e0,
|
||||
0x000001c47ff3efa0, 0x000001c47ff41820, 0x000001c47ff46410, 0x000001c47ff41d30,
|
||||
0x000001c47ff44fd0, 0x000001c47ff3f4b0, 0x000001c47ff3f9c0, 0x000001c47ff43b90,
|
||||
0x000001c47ff440a0, 0x000001c47ff445b0, 0x000001c47ff44ac0, 0x000001c47ff3fed0,
|
||||
0x000001c44cd939a0, 0x000001c44cd98aa0, 0x000001c44cd952f0, 0x000001c44cd98080,
|
||||
0x000001c44cd97b70, 0x000001c44cd994c0, 0x000001c44cd98590, 0x000001c44cd92050,
|
||||
0x000001c44cd96c40, 0x000001c44cd948d0, 0x000001c44cd95d10, 0x000001c44cd98fb0,
|
||||
0x000001c44cd92f80, 0x000001c44cd999d0, 0x000001c44cd93490, 0x000001c44cd93eb0,
|
||||
0x000001c44cd97660, 0x000001c44cd943c0, 0x000001c44cd96220, 0x000001c44cd95800,
|
||||
0x000001c44cd92560, 0x000001c44cd92a70, 0x000001c44cd97150, 0x000001c44cd94de0,
|
||||
0x000001c44dd588e0, 0x000001c44dd579b0, 0x000001c44dd59300, 0x000001c44dd58df0,
|
||||
0x000001c44dd59810, 0x000001c44dd57ec0, 0x000001c44dd56f90, 0x000001c44dd56a80,
|
||||
0x000001c44dd583d0, 0x000001c44dd59d20, 0x000001c44dd5a230, 0x000001c44dd574a0,
|
||||
0x000001c44e8ed410, 0x000001c44e8e7e00, 0x000001c44e8e9c60, 0x000001c44e8ea680,
|
||||
0x000001c44e8e9750, 0x000001c44e8ec4e0, 0x000001c44e8eab90
|
||||
}
|
||||
|
||||
Java Threads: ( => current thread )
|
||||
0x000001c46518eb10 JavaThread "main" [_thread_blocked, id=29144, stack(0x000000412bf00000,0x000000412c000000)]
|
||||
0x000001c47fb248c0 JavaThread "Reference Handler" daemon [_thread_blocked, id=27112, stack(0x000000412c600000,0x000000412c700000)]
|
||||
0x000001c47fb25650 JavaThread "Finalizer" daemon [_thread_blocked, id=3792, stack(0x000000412c700000,0x000000412c800000)]
|
||||
0x000001c47fb3e0f0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=22896, stack(0x000000412c800000,0x000000412c900000)]
|
||||
0x000001c47fb41ae0 JavaThread "Attach Listener" daemon [_thread_blocked, id=26816, stack(0x000000412c900000,0x000000412ca00000)]
|
||||
0x000001c47fb443c0 JavaThread "Service Thread" daemon [_thread_blocked, id=1312, stack(0x000000412ca00000,0x000000412cb00000)]
|
||||
0x000001c47fb45430 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=28544, stack(0x000000412cb00000,0x000000412cc00000)]
|
||||
=>0x000001c47fb48200 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=26828, stack(0x000000412cc00000,0x000000412cd00000)]
|
||||
0x000001c47fb4cf50 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=15916, stack(0x000000412cd00000,0x000000412ce00000)]
|
||||
0x000001c47fb50400 JavaThread "Sweeper thread" daemon [_thread_blocked, id=17184, stack(0x000000412ce00000,0x000000412cf00000)]
|
||||
0x000001c47fc5c6c0 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=16604, stack(0x000000412cf00000,0x000000412d000000)]
|
||||
0x000001c47fd48d40 JavaThread "Notification Thread" daemon [_thread_blocked, id=29872, stack(0x000000412d300000,0x000000412d400000)]
|
||||
0x000001c448edcf50 JavaThread "Daemon health stats" [_thread_blocked, id=25320, stack(0x000000412db00000,0x000000412dc00000)]
|
||||
0x000001c4490839a0 JavaThread "Incoming local TCP Connector on port 13951" [_thread_in_native, id=10816, stack(0x000000412dc00000,0x000000412dd00000)]
|
||||
0x000001c448c6d4c0 JavaThread "Daemon periodic checks" [_thread_blocked, id=4476, stack(0x000000412dd00000,0x000000412de00000)]
|
||||
0x000001c4491f45d0 JavaThread "Daemon" [_thread_blocked, id=31736, stack(0x000000412de00000,0x000000412df00000)]
|
||||
0x000001c4491f4ab0 JavaThread "Handler for socket connection from /127.0.0.1:13951 to /127.0.0.1:13952" [_thread_in_native, id=23168, stack(0x000000412df00000,0x000000412e000000)]
|
||||
0x000001c447c2c2f0 JavaThread "Cancel handler" [_thread_blocked, id=10764, stack(0x000000412e000000,0x000000412e100000)]
|
||||
0x000001c447c2b8d0 JavaThread "Daemon worker" [_thread_blocked, id=27804, stack(0x000000412e100000,0x000000412e200000)]
|
||||
0x000001c447c2b3c0 JavaThread "Asynchronous log dispatcher for DefaultDaemonConnection: socket connection from /127.0.0.1:13951 to /127.0.0.1:13952" [_thread_blocked, id=8720, stack(0x000000412e200000,0x000000412e300000)]
|
||||
0x000001c447c2bde0 JavaThread "Stdin handler" [_thread_blocked, id=15964, stack(0x000000412e300000,0x000000412e400000)]
|
||||
0x000001c447c2a490 JavaThread "Daemon client event forwarder" [_thread_blocked, id=2016, stack(0x000000412e400000,0x000000412e500000)]
|
||||
0x000001c447c2c800 JavaThread "Cache worker for journal cache (F:\gradle\caches\journal-1)" [_thread_blocked, id=29024, stack(0x000000412e500000,0x000000412e600000)]
|
||||
0x000001c447c29050 JavaThread "File lock request listener" [_thread_in_native, id=30656, stack(0x000000412e600000,0x000000412e700000)]
|
||||
0x000001c448e9a0b0 JavaThread "Cache worker for file hash cache (F:\gradle\caches\8.5\fileHashes)" [_thread_blocked, id=16660, stack(0x000000412e700000,0x000000412e800000)]
|
||||
0x000001c448e98c70 JavaThread "File watcher server" daemon [_thread_in_native, id=8796, stack(0x000000412f000000,0x000000412f100000)]
|
||||
0x000001c448e99690 JavaThread "File watcher consumer" daemon [_thread_blocked, id=21216, stack(0x000000412f100000,0x000000412f200000)]
|
||||
0x000001c448e99180 JavaThread "Cache worker for checksums cache (F:\coding\protoPlugin\.gradle\8.5\checksums)" [_thread_blocked, id=9916, stack(0x000000412f400000,0x000000412f500000)]
|
||||
0x000001c448e98760 JavaThread "Cache worker for file hash cache (F:\coding\protoPlugin\.gradle\8.5\fileHashes)" [_thread_blocked, id=22188, stack(0x000000412f500000,0x000000412f600000)]
|
||||
0x000001c448e99ba0 JavaThread "Cache worker for cache directory md-supplier (F:\gradle\caches\8.5\md-supplier)" [_thread_blocked, id=28676, stack(0x000000412f600000,0x000000412f700000)]
|
||||
0x000001c448e97d40 JavaThread "Cache worker for cache directory md-rule (F:\gradle\caches\8.5\md-rule)" [_thread_blocked, id=22576, stack(0x000000412f700000,0x000000412f800000)]
|
||||
0x000001c448e9afe0 JavaThread "Cache worker for file content cache (F:\gradle\caches\8.5\fileContent)" [_thread_blocked, id=28584, stack(0x000000412d200000,0x000000412d300000)]
|
||||
0x000001c448e98250 JavaThread "Cache worker for execution history cache (F:\gradle\caches\8.5\executionHistory)" [_thread_blocked, id=27716, stack(0x000000412d500000,0x000000412d600000)]
|
||||
0x000001c447c2aeb0 JavaThread "jar transforms" [_thread_blocked, id=15372, stack(0x000000412fa00000,0x000000412fb00000)]
|
||||
0x000001c449f21760 JavaThread "jar transforms Thread 2" [_thread_blocked, id=28892, stack(0x000000412fb00000,0x000000412fc00000)]
|
||||
0x000001c449f1f900 JavaThread "jar transforms Thread 3" [_thread_blocked, id=4112, stack(0x000000412fd00000,0x000000412fe00000)]
|
||||
0x000001c449f24a00 JavaThread "jar transforms Thread 4" [_thread_blocked, id=16288, stack(0x000000412fe00000,0x000000412ff00000)]
|
||||
0x000001c449f24f10 JavaThread "Cache worker for kotlin-dsl (F:\gradle\caches\8.5\kotlin-dsl)" [_thread_blocked, id=27744, stack(0x000000412ff00000,0x0000004130000000)]
|
||||
0x000001c449f22180 JavaThread "jar transforms Thread 5" [_thread_blocked, id=26384, stack(0x0000004130000000,0x0000004130100000)]
|
||||
0x000001c449f20830 JavaThread "jar transforms Thread 6" [_thread_blocked, id=26160, stack(0x0000004130100000,0x0000004130200000)]
|
||||
0x000001c449f244f0 JavaThread "jar transforms Thread 7" [_thread_blocked, id=30116, stack(0x0000004130200000,0x0000004130300000)]
|
||||
0x000001c449f20d40 JavaThread "jar transforms Thread 8" [_thread_blocked, id=27912, stack(0x0000004130300000,0x0000004130400000)]
|
||||
0x000001c449f21250 JavaThread "Cache worker for dependencies-accessors (F:\coding\protoPlugin\.gradle\8.5\dependencies-accessors)" [_thread_blocked, id=22732, stack(0x0000004130400000,0x0000004130500000)]
|
||||
0x000001c449f1e4c0 JavaThread "Cache worker for Build Output Cleanup Cache (F:\coding\protoPlugin\.gradle\buildOutputCleanup)" [_thread_blocked, id=28948, stack(0x0000004130500000,0x0000004130600000)]
|
||||
0x000001c449f1f3f0 JavaThread "jar transforms Thread 9" [_thread_blocked, id=28204, stack(0x0000004130600000,0x0000004130700000)]
|
||||
0x000001c449f21c70 JavaThread "jar transforms Thread 10" [_thread_blocked, id=2832, stack(0x0000004130700000,0x0000004130800000)]
|
||||
0x000001c449f1eee0 JavaThread "Unconstrained build operations" [_thread_blocked, id=15636, stack(0x0000004130800000,0x0000004130900000)]
|
||||
0x000001c449f1e9d0 JavaThread "Unconstrained build operations Thread 2" [_thread_blocked, id=11368, stack(0x0000004130900000,0x0000004130a00000)]
|
||||
0x000001c449f1daa0 JavaThread "Unconstrained build operations Thread 3" [_thread_blocked, id=14044, stack(0x0000004130a00000,0x0000004130b00000)]
|
||||
0x000001c449f22690 JavaThread "Unconstrained build operations Thread 4" [_thread_blocked, id=10708, stack(0x0000004130b00000,0x0000004130c00000)]
|
||||
0x000001c449f230b0 JavaThread "Unconstrained build operations Thread 5" [_thread_blocked, id=29364, stack(0x0000004130c00000,0x0000004130d00000)]
|
||||
0x000001c449f23fe0 JavaThread "Unconstrained build operations Thread 6" [_thread_blocked, id=30976, stack(0x0000004130d00000,0x0000004130e00000)]
|
||||
0x000001c449f25420 JavaThread "Unconstrained build operations Thread 7" [_thread_blocked, id=28752, stack(0x0000004130e00000,0x0000004130f00000)]
|
||||
0x000001c47ff408f0 JavaThread "Unconstrained build operations Thread 8" [_thread_blocked, id=2004, stack(0x0000004130f00000,0x0000004131000000)]
|
||||
0x000001c47ff42c60 JavaThread "Unconstrained build operations Thread 9" [_thread_blocked, id=8128, stack(0x0000004131000000,0x0000004131100000)]
|
||||
0x000001c47ff3ea90 JavaThread "Unconstrained build operations Thread 10" [_thread_blocked, id=27156, stack(0x0000004131100000,0x0000004131200000)]
|
||||
0x000001c47ff459f0 JavaThread "Unconstrained build operations Thread 11" [_thread_blocked, id=28500, stack(0x0000004131200000,0x0000004131300000)]
|
||||
0x000001c47ff41310 JavaThread "Unconstrained build operations Thread 12" [_thread_blocked, id=2556, stack(0x0000004131300000,0x0000004131400000)]
|
||||
0x000001c47ff403e0 JavaThread "Unconstrained build operations Thread 13" [_thread_blocked, id=27848, stack(0x0000004131400000,0x0000004131500000)]
|
||||
0x000001c47ff40e00 JavaThread "Unconstrained build operations Thread 14" [_thread_blocked, id=22092, stack(0x0000004131500000,0x0000004131600000)]
|
||||
0x000001c47ff45f00 JavaThread "Unconstrained build operations Thread 15" [_thread_blocked, id=9220, stack(0x0000004131600000,0x0000004131700000)]
|
||||
0x000001c47ff43680 JavaThread "jar transforms Thread 11" [_thread_blocked, id=29536, stack(0x0000004131700000,0x0000004131800000)]
|
||||
0x000001c47ff43170 JavaThread "jar transforms Thread 12" [_thread_blocked, id=29584, stack(0x0000004131800000,0x0000004131900000)]
|
||||
0x000001c47ff454e0 JavaThread "jar transforms Thread 13" [_thread_blocked, id=29924, stack(0x0000004131900000,0x0000004131a00000)]
|
||||
0x000001c47ff3efa0 JavaThread "jar transforms Thread 14" [_thread_blocked, id=31592, stack(0x0000004131a00000,0x0000004131b00000)]
|
||||
0x000001c47ff41820 JavaThread "jar transforms Thread 15" [_thread_blocked, id=22988, stack(0x0000004131b00000,0x0000004131c00000)]
|
||||
0x000001c47ff46410 JavaThread "jar transforms Thread 16" [_thread_blocked, id=22216, stack(0x0000004131c00000,0x0000004131d00000)]
|
||||
0x000001c47ff41d30 JavaThread "Memory manager" [_thread_blocked, id=29900, stack(0x0000004131d00000,0x0000004131e00000)]
|
||||
0x000001c47ff44fd0 JavaThread "Unconstrained build operations Thread 16" [_thread_blocked, id=29332, stack(0x000000412fc00000,0x000000412fd00000)]
|
||||
0x000001c47ff3f4b0 JavaThread "Unconstrained build operations Thread 17" [_thread_blocked, id=29608, stack(0x0000004131e00000,0x0000004131f00000)]
|
||||
0x000001c47ff3f9c0 JavaThread "Unconstrained build operations Thread 18" [_thread_blocked, id=11888, stack(0x0000004131f00000,0x0000004132000000)]
|
||||
0x000001c47ff43b90 JavaThread "Unconstrained build operations Thread 19" [_thread_blocked, id=28140, stack(0x0000004132000000,0x0000004132100000)]
|
||||
0x000001c47ff440a0 JavaThread "Unconstrained build operations Thread 20" [_thread_blocked, id=6240, stack(0x0000004132100000,0x0000004132200000)]
|
||||
0x000001c47ff445b0 JavaThread "Unconstrained build operations Thread 21" [_thread_blocked, id=29136, stack(0x0000004132200000,0x0000004132300000)]
|
||||
0x000001c47ff44ac0 JavaThread "Unconstrained build operations Thread 22" [_thread_blocked, id=31140, stack(0x0000004132300000,0x0000004132400000)]
|
||||
0x000001c47ff3fed0 JavaThread "Unconstrained build operations Thread 23" [_thread_blocked, id=20232, stack(0x0000004132400000,0x0000004132500000)]
|
||||
0x000001c44cd939a0 JavaThread "Unconstrained build operations Thread 24" [_thread_blocked, id=12732, stack(0x0000004132500000,0x0000004132600000)]
|
||||
0x000001c44cd98aa0 JavaThread "Unconstrained build operations Thread 25" [_thread_blocked, id=15480, stack(0x0000004132600000,0x0000004132700000)]
|
||||
0x000001c44cd952f0 JavaThread "Unconstrained build operations Thread 26" [_thread_blocked, id=31128, stack(0x0000004132700000,0x0000004132800000)]
|
||||
0x000001c44cd98080 JavaThread "Unconstrained build operations Thread 27" [_thread_blocked, id=26948, stack(0x0000004132800000,0x0000004132900000)]
|
||||
0x000001c44cd97b70 JavaThread "Unconstrained build operations Thread 28" [_thread_blocked, id=29800, stack(0x0000004132900000,0x0000004132a00000)]
|
||||
0x000001c44cd994c0 JavaThread "Unconstrained build operations Thread 29" [_thread_blocked, id=25132, stack(0x0000004132a00000,0x0000004132b00000)]
|
||||
0x000001c44cd98590 JavaThread "Unconstrained build operations Thread 30" [_thread_blocked, id=24328, stack(0x0000004132b00000,0x0000004132c00000)]
|
||||
0x000001c44cd92050 JavaThread "Unconstrained build operations Thread 31" [_thread_blocked, id=16016, stack(0x0000004132c00000,0x0000004132d00000)]
|
||||
0x000001c44cd96c40 JavaThread "Unconstrained build operations Thread 32" [_thread_blocked, id=29252, stack(0x0000004132d00000,0x0000004132e00000)]
|
||||
0x000001c44cd948d0 JavaThread "Unconstrained build operations Thread 33" [_thread_blocked, id=30748, stack(0x0000004132e00000,0x0000004132f00000)]
|
||||
0x000001c44cd95d10 JavaThread "Unconstrained build operations Thread 34" [_thread_blocked, id=19588, stack(0x0000004132f00000,0x0000004133000000)]
|
||||
0x000001c44cd98fb0 JavaThread "Unconstrained build operations Thread 35" [_thread_blocked, id=10184, stack(0x0000004133000000,0x0000004133100000)]
|
||||
0x000001c44cd92f80 JavaThread "Unconstrained build operations Thread 36" [_thread_blocked, id=27824, stack(0x0000004133100000,0x0000004133200000)]
|
||||
0x000001c44cd999d0 JavaThread "Unconstrained build operations Thread 37" [_thread_blocked, id=30256, stack(0x0000004133200000,0x0000004133300000)]
|
||||
0x000001c44cd93490 JavaThread "Unconstrained build operations Thread 38" [_thread_blocked, id=31540, stack(0x0000004133300000,0x0000004133400000)]
|
||||
0x000001c44cd93eb0 JavaThread "Unconstrained build operations Thread 39" [_thread_blocked, id=3504, stack(0x0000004133400000,0x0000004133500000)]
|
||||
0x000001c44cd97660 JavaThread "Unconstrained build operations Thread 40" [_thread_blocked, id=23648, stack(0x0000004133500000,0x0000004133600000)]
|
||||
0x000001c44cd943c0 JavaThread "Unconstrained build operations Thread 41" [_thread_blocked, id=22236, stack(0x0000004133600000,0x0000004133700000)]
|
||||
0x000001c44cd96220 JavaThread "Unconstrained build operations Thread 42" [_thread_blocked, id=31648, stack(0x0000004133700000,0x0000004133800000)]
|
||||
0x000001c44cd95800 JavaThread "Unconstrained build operations Thread 43" [_thread_blocked, id=13228, stack(0x0000004133800000,0x0000004133900000)]
|
||||
0x000001c44cd92560 JavaThread "Unconstrained build operations Thread 44" [_thread_blocked, id=29692, stack(0x0000004133900000,0x0000004133a00000)]
|
||||
0x000001c44cd92a70 JavaThread "Unconstrained build operations Thread 45" [_thread_blocked, id=12280, stack(0x0000004133a00000,0x0000004133b00000)]
|
||||
0x000001c44cd97150 JavaThread "included builds" [_thread_blocked, id=29128, stack(0x0000004133b00000,0x0000004133c00000)]
|
||||
0x000001c44cd94de0 JavaThread "Execution worker" [_thread_blocked, id=11192, stack(0x0000004133c00000,0x0000004133d00000)]
|
||||
0x000001c44dd588e0 JavaThread "Execution worker Thread 2" [_thread_blocked, id=31428, stack(0x0000004133d00000,0x0000004133e00000)]
|
||||
0x000001c44dd579b0 JavaThread "Execution worker Thread 3" [_thread_blocked, id=29428, stack(0x0000004133e00000,0x0000004133f00000)]
|
||||
0x000001c44dd59300 JavaThread "Execution worker Thread 4" [_thread_blocked, id=18080, stack(0x0000004133f00000,0x0000004134000000)]
|
||||
0x000001c44dd58df0 JavaThread "Execution worker Thread 5" [_thread_blocked, id=28980, stack(0x0000004134000000,0x0000004134100000)]
|
||||
0x000001c44dd59810 JavaThread "Execution worker Thread 6" [_thread_blocked, id=27008, stack(0x0000004134100000,0x0000004134200000)]
|
||||
0x000001c44dd57ec0 JavaThread "Execution worker Thread 7" [_thread_blocked, id=15556, stack(0x0000004134200000,0x0000004134300000)]
|
||||
0x000001c44dd56f90 JavaThread "Execution worker Thread 8" [_thread_blocked, id=2780, stack(0x0000004134300000,0x0000004134400000)]
|
||||
0x000001c44dd56a80 JavaThread "Execution worker Thread 9" [_thread_blocked, id=14324, stack(0x0000004134400000,0x0000004134500000)]
|
||||
0x000001c44dd583d0 JavaThread "Execution worker Thread 10" [_thread_blocked, id=10580, stack(0x0000004134500000,0x0000004134600000)]
|
||||
0x000001c44dd59d20 JavaThread "Execution worker Thread 11" [_thread_blocked, id=26604, stack(0x0000004134600000,0x0000004134700000)]
|
||||
0x000001c44dd5a230 JavaThread "Execution worker Thread 12" [_thread_blocked, id=27956, stack(0x0000004134700000,0x0000004134800000)]
|
||||
0x000001c44dd574a0 JavaThread "Execution worker Thread 13" [_thread_blocked, id=23408, stack(0x0000004134800000,0x0000004134900000)]
|
||||
0x000001c44e8ed410 JavaThread "Execution worker Thread 14" [_thread_blocked, id=28516, stack(0x0000004134900000,0x0000004134a00000)]
|
||||
0x000001c44e8e7e00 JavaThread "Execution worker Thread 15" [_thread_blocked, id=5332, stack(0x0000004134a00000,0x0000004134b00000)]
|
||||
0x000001c44e8e9c60 JavaThread "Cache worker for execution history cache (F:\coding\protoPlugin\.gradle\8.5\executionHistory)" [_thread_blocked, id=30192, stack(0x0000004134b00000,0x0000004134c00000)]
|
||||
0x000001c44e8ea680 JavaThread "Unconstrained build operations Thread 46" [_thread_blocked, id=21716, stack(0x0000004134c00000,0x0000004134d00000)]
|
||||
0x000001c44e8e9750 JavaThread "Exec process" [_thread_in_native, id=13148, stack(0x0000004134d00000,0x0000004134e00000)]
|
||||
0x000001c44e8ec4e0 JavaThread "Exec process Thread 2" [_thread_in_native, id=28556, stack(0x0000004134e00000,0x0000004134f00000)]
|
||||
0x000001c44e8eab90 JavaThread "Exec process Thread 3" [_thread_in_native, id=27884, stack(0x0000004134f00000,0x0000004135000000)]
|
||||
|
||||
Other Threads:
|
||||
0x000001c47fb1b290 VMThread "VM Thread" [stack: 0x000000412c500000,0x000000412c600000] [id=31028]
|
||||
0x000001c47fd60120 WatcherThread [stack: 0x000000412d400000,0x000000412d500000] [id=10364]
|
||||
0x000001c4651cf570 GCTaskThread "GC Thread#0" [stack: 0x000000412c000000,0x000000412c100000] [id=16116]
|
||||
0x000001c447952b10 GCTaskThread "GC Thread#1" [stack: 0x000000412d700000,0x000000412d800000] [id=29856]
|
||||
0x000001c447953920 GCTaskThread "GC Thread#2" [stack: 0x000000412d800000,0x000000412d900000] [id=4608]
|
||||
0x000001c4479522a0 GCTaskThread "GC Thread#3" [stack: 0x000000412d900000,0x000000412da00000] [id=16912]
|
||||
0x000001c447952570 GCTaskThread "GC Thread#4" [stack: 0x000000412da00000,0x000000412db00000] [id=18016]
|
||||
0x000001c4479530b0 GCTaskThread "GC Thread#5" [stack: 0x000000412e800000,0x000000412e900000] [id=28920]
|
||||
0x000001c447953380 GCTaskThread "GC Thread#6" [stack: 0x000000412e900000,0x000000412ea00000] [id=16112]
|
||||
0x000001c447953650 GCTaskThread "GC Thread#7" [stack: 0x000000412ea00000,0x000000412eb00000] [id=18744]
|
||||
0x000001c44c7e4770 GCTaskThread "GC Thread#8" [stack: 0x000000412eb00000,0x000000412ec00000] [id=11408]
|
||||
0x000001c44c7e2b50 GCTaskThread "GC Thread#9" [stack: 0x000000412ec00000,0x000000412ed00000] [id=28760]
|
||||
0x000001c44c7e1200 GCTaskThread "GC Thread#10" [stack: 0x000000412ed00000,0x000000412ee00000] [id=2344]
|
||||
0x000001c44c7e1a70 GCTaskThread "GC Thread#11" [stack: 0x000000412ee00000,0x000000412ef00000] [id=21676]
|
||||
0x000001c44c7e25b0 GCTaskThread "GC Thread#12" [stack: 0x000000412ef00000,0x000000412f000000] [id=7632]
|
||||
0x000001c4651d83e0 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000412c100000,0x000000412c200000] [id=9428]
|
||||
0x000001c4651d94b0 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000412c200000,0x000000412c300000] [id=25408]
|
||||
0x000001c44c7e2010 ConcurrentGCThread "G1 Conc#1" [stack: 0x000000412f200000,0x000000412f300000] [id=12352]
|
||||
0x000001c44c7e1d40 ConcurrentGCThread "G1 Conc#2" [stack: 0x000000412f300000,0x000000412f400000] [id=7668]
|
||||
0x000001c47f9de540 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000412c300000,0x000000412c400000] [id=25912]
|
||||
0x000001c46524dd80 ConcurrentGCThread "G1 Service" [stack: 0x000000412c400000,0x000000412c500000] [id=31488]
|
||||
|
||||
Threads with active compile tasks:
|
||||
C2 CompilerThread0 13341 8694 4 java.lang.reflect.AccessibleObject::checkCanSetAccessible (368 bytes)
|
||||
|
||||
VM state: not at safepoint (normal execution)
|
||||
|
||||
VM Mutex/Monitor currently owned by a thread: None
|
||||
|
||||
Heap address: 0x00000000c0000000, size: 1024 MB, Compressed Oops mode: 32-bit
|
||||
|
||||
CDS archive(s) mapped at: [0x000001c402000000-0x000001c402bb0000-0x000001c402bb0000), size 12255232, SharedBaseAddress: 0x000001c402000000, ArchiveRelocationMode: 1.
|
||||
Compressed class space mapped at: 0x000001c403000000-0x000001c443000000, reserved size: 1073741824
|
||||
Narrow klass base: 0x000001c402000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
|
||||
|
||||
GC Precious Log:
|
||||
CPUs: 16 total, 16 available
|
||||
Memory: 15741M
|
||||
Large Page Support: Disabled
|
||||
NUMA Support: Disabled
|
||||
Compressed Oops: Enabled (32-bit)
|
||||
Heap Region Size: 1M
|
||||
Heap Min Capacity: 8M
|
||||
Heap Initial Capacity: 246M
|
||||
Heap Max Capacity: 1G
|
||||
Pre-touch: Disabled
|
||||
Parallel Workers: 13
|
||||
Concurrent Workers: 3
|
||||
Concurrent Refinement Workers: 13
|
||||
Periodic GC: Disabled
|
||||
|
||||
Heap:
|
||||
garbage-first heap total 96256K, used 67085K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 19 young (19456K), 4 survivors (4096K)
|
||||
Metaspace used 66958K, committed 67648K, reserved 1114112K
|
||||
class space used 9476K, committed 9792K, reserved 1048576K
|
||||
|
||||
Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next)
|
||||
| 0|0x00000000c0000000, 0x00000000c0100000, 0x00000000c0100000|100%|HS| |TAMS 0x00000000c0100000, 0x00000000c0000000| Complete
|
||||
| 1|0x00000000c0100000, 0x00000000c0200000, 0x00000000c0200000|100%|HC| |TAMS 0x00000000c0200000, 0x00000000c0100000| Complete
|
||||
| 2|0x00000000c0200000, 0x00000000c0300000, 0x00000000c0300000|100%|HC| |TAMS 0x00000000c0300000, 0x00000000c0200000| Complete
|
||||
| 3|0x00000000c0300000, 0x00000000c0400000, 0x00000000c0400000|100%|HC| |TAMS 0x00000000c0400000, 0x00000000c0300000| Complete
|
||||
| 4|0x00000000c0400000, 0x00000000c0500000, 0x00000000c0500000|100%| O| |TAMS 0x00000000c0500000, 0x00000000c0400000| Untracked
|
||||
| 5|0x00000000c0500000, 0x00000000c0600000, 0x00000000c0600000|100%| O| |TAMS 0x00000000c0600000, 0x00000000c0500000| Untracked
|
||||
| 6|0x00000000c0600000, 0x00000000c0700000, 0x00000000c0700000|100%| O| |TAMS 0x00000000c0700000, 0x00000000c0600000| Untracked
|
||||
| 7|0x00000000c0700000, 0x00000000c0800000, 0x00000000c0800000|100%| O| |TAMS 0x00000000c0800000, 0x00000000c0700000| Untracked
|
||||
| 8|0x00000000c0800000, 0x00000000c0900000, 0x00000000c0900000|100%| O| |TAMS 0x00000000c0900000, 0x00000000c0800000| Untracked
|
||||
| 9|0x00000000c0900000, 0x00000000c0a00000, 0x00000000c0a00000|100%| O| |TAMS 0x00000000c0a00000, 0x00000000c0900000| Untracked
|
||||
| 10|0x00000000c0a00000, 0x00000000c0b00000, 0x00000000c0b00000|100%| O| |TAMS 0x00000000c0b00000, 0x00000000c0a00000| Untracked
|
||||
| 11|0x00000000c0b00000, 0x00000000c0c00000, 0x00000000c0c00000|100%| O| |TAMS 0x00000000c0c00000, 0x00000000c0b00000| Untracked
|
||||
| 12|0x00000000c0c00000, 0x00000000c0d00000, 0x00000000c0d00000|100%| O| |TAMS 0x00000000c0d00000, 0x00000000c0c00000| Untracked
|
||||
| 13|0x00000000c0d00000, 0x00000000c0e00000, 0x00000000c0e00000|100%| O| |TAMS 0x00000000c0e00000, 0x00000000c0d00000| Untracked
|
||||
| 14|0x00000000c0e00000, 0x00000000c0f00000, 0x00000000c0f00000|100%| O| |TAMS 0x00000000c0f00000, 0x00000000c0e00000| Untracked
|
||||
| 15|0x00000000c0f00000, 0x00000000c1000000, 0x00000000c1000000|100%| O| |TAMS 0x00000000c1000000, 0x00000000c0f00000| Untracked
|
||||
| 16|0x00000000c1000000, 0x00000000c1100000, 0x00000000c1100000|100%| O| |TAMS 0x00000000c1100000, 0x00000000c1000000| Untracked
|
||||
| 17|0x00000000c1100000, 0x00000000c1200000, 0x00000000c1200000|100%| O| |TAMS 0x00000000c1200000, 0x00000000c1100000| Untracked
|
||||
| 18|0x00000000c1200000, 0x00000000c1300000, 0x00000000c1300000|100%| O| |TAMS 0x00000000c1300000, 0x00000000c1200000| Untracked
|
||||
| 19|0x00000000c1300000, 0x00000000c1400000, 0x00000000c1400000|100%| O| |TAMS 0x00000000c1400000, 0x00000000c1300000| Untracked
|
||||
| 20|0x00000000c1400000, 0x00000000c14b5600, 0x00000000c1500000| 70%| O| |TAMS 0x00000000c14b5600, 0x00000000c1400000| Untracked
|
||||
| 21|0x00000000c1500000, 0x00000000c1600000, 0x00000000c1600000|100%| O| |TAMS 0x00000000c1600000, 0x00000000c1500000| Untracked
|
||||
| 22|0x00000000c1600000, 0x00000000c1700000, 0x00000000c1700000|100%| O| |TAMS 0x00000000c1700000, 0x00000000c1600000| Untracked
|
||||
| 23|0x00000000c1700000, 0x00000000c1800000, 0x00000000c1800000|100%| O| |TAMS 0x00000000c1800000, 0x00000000c1700000| Untracked
|
||||
| 24|0x00000000c1800000, 0x00000000c1900000, 0x00000000c1900000|100%| O| |TAMS 0x00000000c1900000, 0x00000000c1800000| Untracked
|
||||
| 25|0x00000000c1900000, 0x00000000c1a00000, 0x00000000c1a00000|100%| O| |TAMS 0x00000000c1a00000, 0x00000000c1900000| Untracked
|
||||
| 26|0x00000000c1a00000, 0x00000000c1b00000, 0x00000000c1b00000|100%| O| |TAMS 0x00000000c1b00000, 0x00000000c1a00000| Untracked
|
||||
| 27|0x00000000c1b00000, 0x00000000c1c00000, 0x00000000c1c00000|100%| O| |TAMS 0x00000000c1c00000, 0x00000000c1b00000| Untracked
|
||||
| 28|0x00000000c1c00000, 0x00000000c1d00000, 0x00000000c1d00000|100%| O| |TAMS 0x00000000c1d00000, 0x00000000c1c00000| Untracked
|
||||
| 29|0x00000000c1d00000, 0x00000000c1e00000, 0x00000000c1e00000|100%| O| |TAMS 0x00000000c1e00000, 0x00000000c1d00000| Untracked
|
||||
| 30|0x00000000c1e00000, 0x00000000c1f00000, 0x00000000c1f00000|100%| O| |TAMS 0x00000000c1f00000, 0x00000000c1e00000| Untracked
|
||||
| 31|0x00000000c1f00000, 0x00000000c2000000, 0x00000000c2000000|100%| O| |TAMS 0x00000000c2000000, 0x00000000c1f00000| Untracked
|
||||
| 32|0x00000000c2000000, 0x00000000c2100000, 0x00000000c2100000|100%| O| |TAMS 0x00000000c2100000, 0x00000000c2000000| Untracked
|
||||
| 33|0x00000000c2100000, 0x00000000c2200000, 0x00000000c2200000|100%| O| |TAMS 0x00000000c2200000, 0x00000000c2100000| Untracked
|
||||
| 34|0x00000000c2200000, 0x00000000c2300000, 0x00000000c2300000|100%| O| |TAMS 0x00000000c2300000, 0x00000000c2200000| Untracked
|
||||
| 35|0x00000000c2300000, 0x00000000c2400000, 0x00000000c2400000|100%| O| |TAMS 0x00000000c2400000, 0x00000000c2300000| Untracked
|
||||
| 36|0x00000000c2400000, 0x00000000c2500000, 0x00000000c2500000|100%| O| |TAMS 0x00000000c2500000, 0x00000000c2400000| Untracked
|
||||
| 37|0x00000000c2500000, 0x00000000c2600000, 0x00000000c2600000|100%| O| |TAMS 0x00000000c2600000, 0x00000000c2500000| Untracked
|
||||
| 38|0x00000000c2600000, 0x00000000c2700000, 0x00000000c2700000|100%| O| |TAMS 0x00000000c2700000, 0x00000000c2600000| Untracked
|
||||
| 39|0x00000000c2700000, 0x00000000c2800000, 0x00000000c2800000|100%| O| |TAMS 0x00000000c2800000, 0x00000000c2700000| Untracked
|
||||
| 40|0x00000000c2800000, 0x00000000c2900000, 0x00000000c2900000|100%| O| |TAMS 0x00000000c2900000, 0x00000000c2800000| Untracked
|
||||
| 41|0x00000000c2900000, 0x00000000c2a00000, 0x00000000c2a00000|100%| O| |TAMS 0x00000000c2a00000, 0x00000000c2900000| Untracked
|
||||
| 42|0x00000000c2a00000, 0x00000000c2b00000, 0x00000000c2b00000|100%| O| |TAMS 0x00000000c2b00000, 0x00000000c2a00000| Untracked
|
||||
| 43|0x00000000c2b00000, 0x00000000c2c00000, 0x00000000c2c00000|100%| O| |TAMS 0x00000000c2c00000, 0x00000000c2b00000| Untracked
|
||||
| 44|0x00000000c2c00000, 0x00000000c2d00000, 0x00000000c2d00000|100%| O| |TAMS 0x00000000c2d00000, 0x00000000c2c00000| Untracked
|
||||
| 45|0x00000000c2d00000, 0x00000000c2e00000, 0x00000000c2e00000|100%| O| |TAMS 0x00000000c2e00000, 0x00000000c2d00000| Untracked
|
||||
| 46|0x00000000c2e00000, 0x00000000c2f00000, 0x00000000c2f00000|100%| O| |TAMS 0x00000000c2f00000, 0x00000000c2e00000| Untracked
|
||||
| 47|0x00000000c2f00000, 0x00000000c3000000, 0x00000000c3000000|100%| O| |TAMS 0x00000000c3000000, 0x00000000c2f00000| Untracked
|
||||
| 48|0x00000000c3000000, 0x00000000c3100000, 0x00000000c3100000|100%| O| |TAMS 0x00000000c302f200, 0x00000000c3000000| Untracked
|
||||
| 49|0x00000000c3100000, 0x00000000c318fe00, 0x00000000c3200000| 56%| O| |TAMS 0x00000000c3100000, 0x00000000c3100000| Untracked
|
||||
| 50|0x00000000c3200000, 0x00000000c3200000, 0x00000000c3300000| 0%| F| |TAMS 0x00000000c3200000, 0x00000000c3200000| Untracked
|
||||
| 51|0x00000000c3300000, 0x00000000c3300000, 0x00000000c3400000| 0%| F| |TAMS 0x00000000c3300000, 0x00000000c3300000| Untracked
|
||||
| 52|0x00000000c3400000, 0x00000000c3400000, 0x00000000c3500000| 0%| F| |TAMS 0x00000000c3400000, 0x00000000c3400000| Untracked
|
||||
| 53|0x00000000c3500000, 0x00000000c3500000, 0x00000000c3600000| 0%| F| |TAMS 0x00000000c3500000, 0x00000000c3500000| Untracked
|
||||
| 54|0x00000000c3600000, 0x00000000c3600000, 0x00000000c3700000| 0%| F| |TAMS 0x00000000c3600000, 0x00000000c3600000| Untracked
|
||||
| 55|0x00000000c3700000, 0x00000000c3700000, 0x00000000c3800000| 0%| F| |TAMS 0x00000000c3700000, 0x00000000c3700000| Untracked
|
||||
| 56|0x00000000c3800000, 0x00000000c3800000, 0x00000000c3900000| 0%| F| |TAMS 0x00000000c3800000, 0x00000000c3800000| Untracked
|
||||
| 57|0x00000000c3900000, 0x00000000c3900000, 0x00000000c3a00000| 0%| F| |TAMS 0x00000000c3900000, 0x00000000c3900000| Untracked
|
||||
| 58|0x00000000c3a00000, 0x00000000c3a00000, 0x00000000c3b00000| 0%| F| |TAMS 0x00000000c3a00000, 0x00000000c3a00000| Untracked
|
||||
| 59|0x00000000c3b00000, 0x00000000c3b3e008, 0x00000000c3c00000| 24%| S|CS|TAMS 0x00000000c3b00000, 0x00000000c3b00000| Complete
|
||||
| 60|0x00000000c3c00000, 0x00000000c3d00000, 0x00000000c3d00000|100%| S|CS|TAMS 0x00000000c3c00000, 0x00000000c3c00000| Complete
|
||||
| 61|0x00000000c3d00000, 0x00000000c3e00000, 0x00000000c3e00000|100%| S|CS|TAMS 0x00000000c3d00000, 0x00000000c3d00000| Complete
|
||||
| 62|0x00000000c3e00000, 0x00000000c3f00000, 0x00000000c3f00000|100%| S|CS|TAMS 0x00000000c3e00000, 0x00000000c3e00000| Complete
|
||||
| 63|0x00000000c3f00000, 0x00000000c3f00000, 0x00000000c4000000| 0%| F| |TAMS 0x00000000c3f00000, 0x00000000c3f00000| Untracked
|
||||
| 64|0x00000000c4000000, 0x00000000c4000000, 0x00000000c4100000| 0%| F| |TAMS 0x00000000c4000000, 0x00000000c4000000| Untracked
|
||||
| 65|0x00000000c4100000, 0x00000000c4100000, 0x00000000c4200000| 0%| F| |TAMS 0x00000000c4100000, 0x00000000c4100000| Untracked
|
||||
| 66|0x00000000c4200000, 0x00000000c4200000, 0x00000000c4300000| 0%| F| |TAMS 0x00000000c4200000, 0x00000000c4200000| Untracked
|
||||
| 67|0x00000000c4300000, 0x00000000c4300000, 0x00000000c4400000| 0%| F| |TAMS 0x00000000c4300000, 0x00000000c4300000| Untracked
|
||||
| 68|0x00000000c4400000, 0x00000000c4400000, 0x00000000c4500000| 0%| F| |TAMS 0x00000000c4400000, 0x00000000c4400000| Untracked
|
||||
| 69|0x00000000c4500000, 0x00000000c4500000, 0x00000000c4600000| 0%| F| |TAMS 0x00000000c4500000, 0x00000000c4500000| Untracked
|
||||
| 70|0x00000000c4600000, 0x00000000c4600000, 0x00000000c4700000| 0%| F| |TAMS 0x00000000c4600000, 0x00000000c4600000| Untracked
|
||||
| 71|0x00000000c4700000, 0x00000000c4700000, 0x00000000c4800000| 0%| F| |TAMS 0x00000000c4700000, 0x00000000c4700000| Untracked
|
||||
| 72|0x00000000c4800000, 0x00000000c4800000, 0x00000000c4900000| 0%| F| |TAMS 0x00000000c4800000, 0x00000000c4800000| Untracked
|
||||
| 73|0x00000000c4900000, 0x00000000c4900000, 0x00000000c4a00000| 0%| F| |TAMS 0x00000000c4900000, 0x00000000c4900000| Untracked
|
||||
| 74|0x00000000c4a00000, 0x00000000c4a00000, 0x00000000c4b00000| 0%| F| |TAMS 0x00000000c4a00000, 0x00000000c4a00000| Untracked
|
||||
| 75|0x00000000c4b00000, 0x00000000c4b00000, 0x00000000c4c00000| 0%| F| |TAMS 0x00000000c4b00000, 0x00000000c4b00000| Untracked
|
||||
| 76|0x00000000c4c00000, 0x00000000c4c00000, 0x00000000c4d00000| 0%| F| |TAMS 0x00000000c4c00000, 0x00000000c4c00000| Untracked
|
||||
| 77|0x00000000c4d00000, 0x00000000c4d00000, 0x00000000c4e00000| 0%| F| |TAMS 0x00000000c4d00000, 0x00000000c4d00000| Untracked
|
||||
| 78|0x00000000c4e00000, 0x00000000c4e00000, 0x00000000c4f00000| 0%| F| |TAMS 0x00000000c4e00000, 0x00000000c4e00000| Untracked
|
||||
| 79|0x00000000c4f00000, 0x00000000c4f057d0, 0x00000000c5000000| 2%| E| |TAMS 0x00000000c4f00000, 0x00000000c4f00000| Complete
|
||||
| 80|0x00000000c5000000, 0x00000000c5100000, 0x00000000c5100000|100%| E|CS|TAMS 0x00000000c5000000, 0x00000000c5000000| Complete
|
||||
| 81|0x00000000c5100000, 0x00000000c5200000, 0x00000000c5200000|100%| E|CS|TAMS 0x00000000c5100000, 0x00000000c5100000| Complete
|
||||
| 82|0x00000000c5200000, 0x00000000c5300000, 0x00000000c5300000|100%| E|CS|TAMS 0x00000000c5200000, 0x00000000c5200000| Complete
|
||||
| 83|0x00000000c5300000, 0x00000000c5400000, 0x00000000c5400000|100%| E|CS|TAMS 0x00000000c5300000, 0x00000000c5300000| Complete
|
||||
| 84|0x00000000c5400000, 0x00000000c5500000, 0x00000000c5500000|100%| E|CS|TAMS 0x00000000c5400000, 0x00000000c5400000| Complete
|
||||
| 85|0x00000000c5500000, 0x00000000c5600000, 0x00000000c5600000|100%| E|CS|TAMS 0x00000000c5500000, 0x00000000c5500000| Complete
|
||||
| 86|0x00000000c5600000, 0x00000000c5700000, 0x00000000c5700000|100%| E| |TAMS 0x00000000c5600000, 0x00000000c5600000| Complete
|
||||
| 87|0x00000000c5700000, 0x00000000c5800000, 0x00000000c5800000|100%| E|CS|TAMS 0x00000000c5700000, 0x00000000c5700000| Complete
|
||||
| 88|0x00000000c5800000, 0x00000000c5900000, 0x00000000c5900000|100%| E|CS|TAMS 0x00000000c5800000, 0x00000000c5800000| Complete
|
||||
| 89|0x00000000c5900000, 0x00000000c5a00000, 0x00000000c5a00000|100%| E|CS|TAMS 0x00000000c5900000, 0x00000000c5900000| Complete
|
||||
| 90|0x00000000c5a00000, 0x00000000c5b00000, 0x00000000c5b00000|100%| E|CS|TAMS 0x00000000c5a00000, 0x00000000c5a00000| Complete
|
||||
| 223|0x00000000cdf00000, 0x00000000ce000000, 0x00000000ce000000|100%| E|CS|TAMS 0x00000000cdf00000, 0x00000000cdf00000| Complete
|
||||
| 224|0x00000000ce000000, 0x00000000ce100000, 0x00000000ce100000|100%| E|CS|TAMS 0x00000000ce000000, 0x00000000ce000000| Complete
|
||||
| 245|0x00000000cf500000, 0x00000000cf600000, 0x00000000cf600000|100%| E|CS|TAMS 0x00000000cf500000, 0x00000000cf500000| Complete
|
||||
|
||||
Card table byte_map: [0x000001c47c790000,0x000001c47c990000] _byte_map_base: 0x000001c47c190000
|
||||
|
||||
Marking Bits (Prev, Next): (CMBitMap*) 0x000001c4651cfaf0, (CMBitMap*) 0x000001c4651cfab0
|
||||
Prev Bits: [0x000001c47db90000, 0x000001c47eb90000)
|
||||
Next Bits: [0x000001c47cb90000, 0x000001c47db90000)
|
||||
|
||||
Polling page: 0x000001c464950000
|
||||
|
||||
Metaspace:
|
||||
|
||||
Usage:
|
||||
Non-class: 56.13 MB used.
|
||||
Class: 9.25 MB used.
|
||||
Both: 65.39 MB used.
|
||||
|
||||
Virtual space:
|
||||
Non-class space: 64.00 MB reserved, 56.50 MB ( 88%) committed, 1 nodes.
|
||||
Class space: 1.00 GB reserved, 9.56 MB ( <1%) committed, 1 nodes.
|
||||
Both: 1.06 GB reserved, 66.06 MB ( 6%) committed.
|
||||
|
||||
Chunk freelists:
|
||||
Non-Class: 7.17 MB
|
||||
Class: 6.35 MB
|
||||
Both: 13.52 MB
|
||||
|
||||
MaxMetaspaceSize: unlimited
|
||||
CompressedClassSpaceSize: 1.00 GB
|
||||
Initial GC threshold: 21.00 MB
|
||||
Current GC threshold: 108.12 MB
|
||||
CDS: on
|
||||
MetaspaceReclaimPolicy: balanced
|
||||
- commit_granule_bytes: 65536.
|
||||
- commit_granule_words: 8192.
|
||||
- virtual_space_node_default_size: 8388608.
|
||||
- enlarge_chunks_in_place: 1.
|
||||
- new_chunks_are_fully_committed: 0.
|
||||
- uncommit_free_chunks: 1.
|
||||
- use_allocation_guard: 0.
|
||||
- handle_deallocations: 1.
|
||||
|
||||
|
||||
Internal statistics:
|
||||
|
||||
num_allocs_failed_limit: 6.
|
||||
num_arena_births: 820.
|
||||
num_arena_deaths: 0.
|
||||
num_vsnodes_births: 2.
|
||||
num_vsnodes_deaths: 0.
|
||||
num_space_committed: 1057.
|
||||
num_space_uncommitted: 0.
|
||||
num_chunks_returned_to_freelist: 6.
|
||||
num_chunks_taken_from_freelist: 3553.
|
||||
num_chunk_merges: 6.
|
||||
num_chunk_splits: 2359.
|
||||
num_chunks_enlarged: 1558.
|
||||
num_inconsistent_stats: 0.
|
||||
|
||||
CodeHeap 'non-profiled nmethods': size=119168Kb used=5038Kb max_used=5038Kb free=114129Kb
|
||||
bounds [0x000001c4748b0000, 0x000001c474da0000, 0x000001c47bd10000]
|
||||
CodeHeap 'profiled nmethods': size=119104Kb used=16029Kb max_used=16029Kb free=103074Kb
|
||||
bounds [0x000001c46cd10000, 0x000001c46dcc0000, 0x000001c474160000]
|
||||
CodeHeap 'non-nmethods': size=7488Kb used=2365Kb max_used=4109Kb free=5122Kb
|
||||
bounds [0x000001c474160000, 0x000001c474570000, 0x000001c4748b0000]
|
||||
total_blobs=8845 nmethods=7956 adapters=799
|
||||
compilation: enabled
|
||||
stopped_count=0, restarted_count=0
|
||||
full_count=0
|
||||
|
||||
Compilation events (20 events):
|
||||
Event: 13.285 Thread 0x000001c47fb4cf50 8700 3 org.gradle.internal.logging.events.StyledTextOutputEvent::<init> (26 bytes)
|
||||
Event: 13.286 Thread 0x000001c47fb4cf50 nmethod 8700 0x000001c46dcaec90 code [0x000001c46dcaee80, 0x000001c46dcaf448]
|
||||
Event: 13.286 Thread 0x000001c47fb4cf50 8701 3 org.gradle.internal.logging.events.StyledTextOutputEvent::withLogLevel (25 bytes)
|
||||
Event: 13.286 Thread 0x000001c47fb4cf50 nmethod 8701 0x000001c46dcaf690 code [0x000001c46dcaf840, 0x000001c46dcafbe8]
|
||||
Event: 13.286 Thread 0x000001c47fb4cf50 8702 ! 3 org.gradle.internal.io.StreamByteBuffer::readAsCharBuffer (383 bytes)
|
||||
Event: 13.288 Thread 0x000001c47fb4cf50 nmethod 8702 0x000001c46dcafc90 code [0x000001c46dcb0200, 0x000001c46dcb2f28]
|
||||
Event: 13.294 Thread 0x000001c47fb4cf50 8704 3 org.gradle.internal.serialize.AbstractCollectionSerializer::write (52 bytes)
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 nmethod 8704 0x000001c46dcb4010 code [0x000001c46dcb4220, 0x000001c46dcb4898]
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 8703 3 org.gradle.internal.serialize.AbstractCollectionSerializer::write (10 bytes)
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 nmethod 8703 0x000001c46dcb4a90 code [0x000001c46dcb4c40, 0x000001c46dcb4f08]
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 8705 3 org.gradle.internal.logging.serializer.StyledTextOutputEventSerializer::write (10 bytes)
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 nmethod 8705 0x000001c46dcb5010 code [0x000001c46dcb51c0, 0x000001c46dcb5408]
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 8706 3 org.gradle.internal.logging.serializer.StyledTextOutputEventSerializer::write (86 bytes)
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 nmethod 8706 0x000001c46dcb5510 code [0x000001c46dcb5740, 0x000001c46dcb61c8]
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 8707 3 org.gradle.internal.serialize.kryo.KryoBackedEncoder::writeInt (9 bytes)
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 nmethod 8707 0x000001c46dcb6390 code [0x000001c46dcb6540, 0x000001c46dcb66a8]
|
||||
Event: 13.295 Thread 0x000001c47fb4cf50 8708 3 org.gradle.internal.logging.serializer.SpanSerializer::write (10 bytes)
|
||||
Event: 13.296 Thread 0x000001c47fb4cf50 nmethod 8708 0x000001c46dcb6790 code [0x000001c46dcb6960, 0x000001c46dcb6dd8]
|
||||
Event: 13.296 Thread 0x000001c47fb4cf50 8709 3 org.gradle.internal.logging.serializer.SpanSerializer::write (25 bytes)
|
||||
Event: 13.296 Thread 0x000001c47fb4cf50 nmethod 8709 0x000001c46dcb6f90 code [0x000001c46dcb7160, 0x000001c46dcb7478]
|
||||
|
||||
GC Heap History (20 events):
|
||||
Event: 7.179 GC heap before
|
||||
{Heap before GC invocations=13 (full 0):
|
||||
garbage-first heap total 81920K, used 65805K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 32 young (32768K), 5 survivors (5120K)
|
||||
Metaspace used 49359K, committed 49856K, reserved 1114112K
|
||||
class space used 6967K, committed 7168K, reserved 1048576K
|
||||
}
|
||||
Event: 7.182 GC heap after
|
||||
{Heap after GC invocations=14 (full 0):
|
||||
garbage-first heap total 81920K, used 41580K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 4 young (4096K), 4 survivors (4096K)
|
||||
Metaspace used 49359K, committed 49856K, reserved 1114112K
|
||||
class space used 6967K, committed 7168K, reserved 1048576K
|
||||
}
|
||||
Event: 7.363 GC heap before
|
||||
{Heap before GC invocations=14 (full 0):
|
||||
garbage-first heap total 81920K, used 65132K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 27 young (27648K), 4 survivors (4096K)
|
||||
Metaspace used 49797K, committed 50368K, reserved 1114112K
|
||||
class space used 7035K, committed 7360K, reserved 1048576K
|
||||
}
|
||||
Event: 7.366 GC heap after
|
||||
{Heap after GC invocations=15 (full 0):
|
||||
garbage-first heap total 81920K, used 44712K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 3 young (3072K), 3 survivors (3072K)
|
||||
Metaspace used 49797K, committed 50368K, reserved 1114112K
|
||||
class space used 7035K, committed 7360K, reserved 1048576K
|
||||
}
|
||||
Event: 7.648 GC heap before
|
||||
{Heap before GC invocations=16 (full 0):
|
||||
garbage-first heap total 81920K, used 66216K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 24 young (24576K), 3 survivors (3072K)
|
||||
Metaspace used 51294K, committed 51904K, reserved 1114112K
|
||||
class space used 7322K, committed 7616K, reserved 1048576K
|
||||
}
|
||||
Event: 7.650 GC heap after
|
||||
{Heap after GC invocations=17 (full 0):
|
||||
garbage-first heap total 81920K, used 46148K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 2 young (2048K), 2 survivors (2048K)
|
||||
Metaspace used 51294K, committed 51904K, reserved 1114112K
|
||||
class space used 7322K, committed 7616K, reserved 1048576K
|
||||
}
|
||||
Event: 7.878 GC heap before
|
||||
{Heap before GC invocations=17 (full 0):
|
||||
garbage-first heap total 81920K, used 66628K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 22 young (22528K), 2 survivors (2048K)
|
||||
Metaspace used 53963K, committed 54528K, reserved 1114112K
|
||||
class space used 7663K, committed 7936K, reserved 1048576K
|
||||
}
|
||||
Event: 7.879 GC heap after
|
||||
{Heap after GC invocations=18 (full 0):
|
||||
garbage-first heap total 81920K, used 46624K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 2 young (2048K), 2 survivors (2048K)
|
||||
Metaspace used 53963K, committed 54528K, reserved 1114112K
|
||||
class space used 7663K, committed 7936K, reserved 1048576K
|
||||
}
|
||||
Event: 8.081 GC heap before
|
||||
{Heap before GC invocations=19 (full 0):
|
||||
garbage-first heap total 83968K, used 68128K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 23 young (23552K), 2 survivors (2048K)
|
||||
Metaspace used 55423K, committed 56000K, reserved 1114112K
|
||||
class space used 7907K, committed 8192K, reserved 1048576K
|
||||
}
|
||||
Event: 8.083 GC heap after
|
||||
{Heap after GC invocations=20 (full 0):
|
||||
garbage-first heap total 83968K, used 47260K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 2 young (2048K), 2 survivors (2048K)
|
||||
Metaspace used 55423K, committed 56000K, reserved 1114112K
|
||||
class space used 7907K, committed 8192K, reserved 1048576K
|
||||
}
|
||||
Event: 8.381 GC heap before
|
||||
{Heap before GC invocations=20 (full 0):
|
||||
garbage-first heap total 83968K, used 68764K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 23 young (23552K), 2 survivors (2048K)
|
||||
Metaspace used 57483K, committed 58048K, reserved 1114112K
|
||||
class space used 8196K, committed 8448K, reserved 1048576K
|
||||
}
|
||||
Event: 8.383 GC heap after
|
||||
{Heap after GC invocations=21 (full 0):
|
||||
garbage-first heap total 83968K, used 47994K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 3 young (3072K), 3 survivors (3072K)
|
||||
Metaspace used 57483K, committed 58048K, reserved 1114112K
|
||||
class space used 8196K, committed 8448K, reserved 1048576K
|
||||
}
|
||||
Event: 8.654 GC heap before
|
||||
{Heap before GC invocations=22 (full 0):
|
||||
garbage-first heap total 86016K, used 68474K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 24 young (24576K), 3 survivors (3072K)
|
||||
Metaspace used 60176K, committed 60736K, reserved 1114112K
|
||||
class space used 8539K, committed 8768K, reserved 1048576K
|
||||
}
|
||||
Event: 8.656 GC heap after
|
||||
{Heap after GC invocations=23 (full 0):
|
||||
garbage-first heap total 86016K, used 49111K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 3 young (3072K), 3 survivors (3072K)
|
||||
Metaspace used 60176K, committed 60736K, reserved 1114112K
|
||||
class space used 8539K, committed 8768K, reserved 1048576K
|
||||
}
|
||||
Event: 8.983 GC heap before
|
||||
{Heap before GC invocations=23 (full 0):
|
||||
garbage-first heap total 86016K, used 70615K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 25 young (25600K), 3 survivors (3072K)
|
||||
Metaspace used 62080K, committed 62656K, reserved 1114112K
|
||||
class space used 8758K, committed 9024K, reserved 1048576K
|
||||
}
|
||||
Event: 8.985 GC heap after
|
||||
{Heap after GC invocations=24 (full 0):
|
||||
garbage-first heap total 86016K, used 50719K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 4 young (4096K), 4 survivors (4096K)
|
||||
Metaspace used 62080K, committed 62656K, reserved 1114112K
|
||||
class space used 8758K, committed 9024K, reserved 1048576K
|
||||
}
|
||||
Event: 9.252 GC heap before
|
||||
{Heap before GC invocations=25 (full 0):
|
||||
garbage-first heap total 91136K, used 71199K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 24 young (24576K), 4 survivors (4096K)
|
||||
Metaspace used 64050K, committed 64704K, reserved 1114112K
|
||||
class space used 9020K, committed 9344K, reserved 1048576K
|
||||
}
|
||||
Event: 9.255 GC heap after
|
||||
{Heap after GC invocations=26 (full 0):
|
||||
garbage-first heap total 91136K, used 51418K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 3 young (3072K), 3 survivors (3072K)
|
||||
Metaspace used 64050K, committed 64704K, reserved 1114112K
|
||||
class space used 9020K, committed 9344K, reserved 1048576K
|
||||
}
|
||||
Event: 9.553 GC heap before
|
||||
{Heap before GC invocations=26 (full 0):
|
||||
garbage-first heap total 91136K, used 73946K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 26 young (26624K), 3 survivors (3072K)
|
||||
Metaspace used 65626K, committed 66240K, reserved 1114112K
|
||||
class space used 9312K, committed 9600K, reserved 1048576K
|
||||
}
|
||||
Event: 9.556 GC heap after
|
||||
{Heap after GC invocations=27 (full 0):
|
||||
garbage-first heap total 91136K, used 53773K [0x00000000c0000000, 0x0000000100000000)
|
||||
region size 1024K, 4 young (4096K), 4 survivors (4096K)
|
||||
Metaspace used 65626K, committed 66240K, reserved 1114112K
|
||||
class space used 9312K, committed 9600K, reserved 1048576K
|
||||
}
|
||||
|
||||
Dll operation events (15 events):
|
||||
Event: 0.010 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\java.dll
|
||||
Event: 0.040 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jsvml.dll
|
||||
Event: 0.093 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\zip.dll
|
||||
Event: 0.099 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\instrument.dll
|
||||
Event: 0.103 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\net.dll
|
||||
Event: 0.106 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\nio.dll
|
||||
Event: 0.110 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\zip.dll
|
||||
Event: 0.281 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jimage.dll
|
||||
Event: 0.335 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\verify.dll
|
||||
Event: 0.527 Loaded shared library F:\gradle\native\c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48\windows-amd64\native-platform.dll
|
||||
Event: 0.537 Loaded shared library F:\gradle\native\38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47\windows-amd64\native-platform-file-events.dll
|
||||
Event: 1.464 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management.dll
|
||||
Event: 1.468 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management_ext.dll
|
||||
Event: 1.712 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\extnet.dll
|
||||
Event: 1.968 Loaded shared library C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\sunmscapi.dll
|
||||
|
||||
Deoptimization events (20 events):
|
||||
Event: 9.851 Thread 0x000001c44e8eab90 DEOPT PACKING pc=0x000001c474a8e004 sp=0x0000004134ffebe0
|
||||
Event: 9.851 Thread 0x000001c44e8eab90 DEOPT UNPACKING pc=0x000001c4741b69a3 sp=0x0000004134ffeaf8 mode 2
|
||||
Event: 9.904 Thread 0x000001c44e8eab90 Uncommon trap: trap_request=0xffffffde fr.pc=0x000001c474a8e004 relative=0x00000000000009e4
|
||||
Event: 9.904 Thread 0x000001c44e8eab90 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000001c474a8e004 method=java.io.BufferedInputStream.read1([BII)I @ 39 c2
|
||||
Event: 9.904 Thread 0x000001c44e8eab90 DEOPT PACKING pc=0x000001c474a8e004 sp=0x0000004134ffebe0
|
||||
Event: 9.904 Thread 0x000001c44e8eab90 DEOPT UNPACKING pc=0x000001c4741b69a3 sp=0x0000004134ffeaf8 mode 2
|
||||
Event: 10.582 Thread 0x000001c448e99690 DEOPT PACKING pc=0x000001c46d11be7c sp=0x000000412f1feb20
|
||||
Event: 10.582 Thread 0x000001c448e99690 DEOPT UNPACKING pc=0x000001c4741b7143 sp=0x000000412f1fe0a0 mode 0
|
||||
Event: 11.455 Thread 0x000001c47ff41d30 Uncommon trap: trap_request=0xffffffd6 fr.pc=0x000001c474c4f28c relative=0x000000000000036c
|
||||
Event: 11.455 Thread 0x000001c47ff41d30 Uncommon trap: reason=array_check action=maybe_recompile pc=0x000001c474c4f28c method=java.util.LinkedHashMap.keysToArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 25 c2
|
||||
Event: 11.455 Thread 0x000001c47ff41d30 DEOPT PACKING pc=0x000001c474c4f28c sp=0x0000004131dfcc00
|
||||
Event: 11.455 Thread 0x000001c47ff41d30 DEOPT UNPACKING pc=0x000001c4741b69a3 sp=0x0000004131dfcba8 mode 2
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 Uncommon trap: trap_request=0xffffffde fr.pc=0x000001c474a8e004 relative=0x00000000000009e4
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000001c474a8e004 method=java.io.BufferedInputStream.read1([BII)I @ 39 c2
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 DEOPT PACKING pc=0x000001c474a8e004 sp=0x0000004134ffebe0
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 DEOPT UNPACKING pc=0x000001c4741b69a3 sp=0x0000004134ffeaf8 mode 2
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 Uncommon trap: trap_request=0xffffffde fr.pc=0x000001c474a8d068 relative=0x00000000000001a8
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 Uncommon trap: reason=class_check action=maybe_recompile pc=0x000001c474a8d068 method=java.io.BufferedInputStream.read1([BII)I @ 39 c2
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 DEOPT PACKING pc=0x000001c474a8d068 sp=0x0000004134ffeb40
|
||||
Event: 13.285 Thread 0x000001c44e8eab90 DEOPT UNPACKING pc=0x000001c4741b69a3 sp=0x0000004134ffeae8 mode 2
|
||||
|
||||
Classes loaded (20 events):
|
||||
Event: 9.809 Loading class java/util/CollectionsBeanInfo
|
||||
Event: 9.809 Loading class java/util/CollectionsBeanInfo done
|
||||
Event: 9.809 Loading class java/util/CollectionsCustomizer
|
||||
Event: 9.809 Loading class java/util/CollectionsCustomizer done
|
||||
Event: 9.809 Loading class java/util/CollectionsCustomizer
|
||||
Event: 9.809 Loading class java/util/CollectionsCustomizer done
|
||||
Event: 9.837 Loading class java/lang/ProcessImpl
|
||||
Event: 9.838 Loading class java/lang/ProcessImpl done
|
||||
Event: 9.845 Loading class java/lang/ProcessHandleImpl
|
||||
Event: 9.846 Loading class java/lang/ProcessHandleImpl done
|
||||
Event: 9.848 Loading class java/lang/ProcessImpl$2
|
||||
Event: 9.848 Loading class java/lang/ProcessImpl$2 done
|
||||
Event: 9.849 Loading class java/lang/Process$PipeInputStream
|
||||
Event: 9.849 Loading class java/lang/Process$PipeInputStream done
|
||||
Event: 9.850 Loading class jdk/internal/event/ProcessStartEvent
|
||||
Event: 9.850 Loading class jdk/internal/event/ProcessStartEvent done
|
||||
Event: 11.953 Loading class java/util/concurrent/LinkedBlockingDeque$Itr
|
||||
Event: 11.953 Loading class java/util/concurrent/LinkedBlockingDeque$AbstractItr
|
||||
Event: 11.953 Loading class java/util/concurrent/LinkedBlockingDeque$AbstractItr done
|
||||
Event: 11.953 Loading class java/util/concurrent/LinkedBlockingDeque$Itr done
|
||||
|
||||
Classes unloaded (0 events):
|
||||
No events
|
||||
|
||||
Classes redefined (0 events):
|
||||
No events
|
||||
|
||||
Internal exceptions (20 events):
|
||||
Event: 9.822 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5115190}> (0x00000000c5115190)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.822 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5116298}> (0x00000000c5116298)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.823 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c51173a0}> (0x00000000c51173a0)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.823 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c51184a8}> (0x00000000c51184a8)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.823 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c51195e8}> (0x00000000c51195e8)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.823 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c511a710}> (0x00000000c511a710)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.823 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c511bad0}> (0x00000000c511bad0)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.823 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c511cc50}> (0x00000000c511cc50)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.823 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c511dd78}> (0x00000000c511dd78)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.826 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5140c98}> (0x00000000c5140c98)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.826 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5141d20}> (0x00000000c5141d20)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.826 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5143038}> (0x00000000c5143038)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.826 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c51448e0}> (0x00000000c51448e0)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.826 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5145948}> (0x00000000c5145948)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.827 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5146e78}> (0x00000000c5146e78)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.827 Thread 0x000001c44cd94de0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000c5147ef0}> (0x00000000c5147ef0)
|
||||
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
|
||||
Event: 9.844 Thread 0x000001c44e8e9750 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c51dc070}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, long)'> (0x00000000c51dc070)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 9.845 Thread 0x000001c44e8e9750 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c51e18d0}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.newInvokeSpecial(java.lang.Object, long)'> (0x00000000c51e18d0)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 9.847 Thread 0x000001c44e8e9750 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c51eb3c0}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, long, java.lang.Object)'> (0x00000000c51eb3c0)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
Event: 9.847 Thread 0x000001c44e8e9750 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c51eede0}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeStaticInit(java.lang.Object, java.lang.Object, long, java.lang.Object)'> (0x00000000c51eede0)
|
||||
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
|
||||
|
||||
VM Operations (20 events):
|
||||
Event: 9.553 Executing VM operation: G1CollectForAllocation
|
||||
Event: 9.556 Executing VM operation: G1CollectForAllocation done
|
||||
Event: 9.582 Executing VM operation: G1PauseRemark
|
||||
Event: 9.585 Executing VM operation: G1PauseRemark done
|
||||
Event: 9.598 Executing VM operation: G1PauseCleanup
|
||||
Event: 9.598 Executing VM operation: G1PauseCleanup done
|
||||
Event: 9.681 Executing VM operation: HandshakeAllThreads
|
||||
Event: 9.682 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 9.849 Executing VM operation: HandshakeAllThreads
|
||||
Event: 9.850 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 9.894 Executing VM operation: ICBufferFull
|
||||
Event: 9.894 Executing VM operation: ICBufferFull done
|
||||
Event: 10.906 Executing VM operation: Cleanup
|
||||
Event: 10.906 Executing VM operation: Cleanup done
|
||||
Event: 11.906 Executing VM operation: Cleanup
|
||||
Event: 11.906 Executing VM operation: Cleanup done
|
||||
Event: 11.963 Executing VM operation: HandshakeAllThreads
|
||||
Event: 11.963 Executing VM operation: HandshakeAllThreads done
|
||||
Event: 12.971 Executing VM operation: Cleanup
|
||||
Event: 12.971 Executing VM operation: Cleanup done
|
||||
|
||||
Memory protections (0 events):
|
||||
No events
|
||||
|
||||
Nmethod flushes (20 events):
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4c7c90
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4c8f10
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4c9990
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4ca190
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4caf90
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4d0790
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4d5210
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d4e4f10
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d514590
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d5afc90
|
||||
Event: 5.560 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d5d3a90
|
||||
Event: 5.561 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d611910
|
||||
Event: 5.561 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d63c410
|
||||
Event: 5.561 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d68de90
|
||||
Event: 5.561 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d6a7090
|
||||
Event: 7.803 Thread 0x000001c47fb50400 flushing nmethod 0x000001c474a99010
|
||||
Event: 7.808 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d272590
|
||||
Event: 7.808 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d35be90
|
||||
Event: 7.810 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d625e90
|
||||
Event: 7.810 Thread 0x000001c47fb50400 flushing nmethod 0x000001c46d6a9410
|
||||
|
||||
Events (20 events):
|
||||
Event: 9.408 Thread 0x000001c44cd97150 Thread added: 0x000001c44dd56f90
|
||||
Event: 9.408 Thread 0x000001c44cd97150 Thread added: 0x000001c44dd56a80
|
||||
Event: 9.409 Thread 0x000001c44cd97150 Thread added: 0x000001c44dd583d0
|
||||
Event: 9.409 Thread 0x000001c44cd97150 Thread added: 0x000001c44dd59d20
|
||||
Event: 9.409 Thread 0x000001c44cd97150 Thread added: 0x000001c44dd5a230
|
||||
Event: 9.409 Thread 0x000001c44cd97150 Thread added: 0x000001c44dd574a0
|
||||
Event: 9.409 Thread 0x000001c44cd97150 Thread added: 0x000001c44e8ed410
|
||||
Event: 9.409 Thread 0x000001c44cd97150 Thread added: 0x000001c44e8e7e00
|
||||
Event: 9.431 Thread 0x000001c44cd97150 Thread added: 0x000001c44e8e9c60
|
||||
Event: 9.622 Thread 0x000001c44cd94de0 Thread added: 0x000001c44e8ea680
|
||||
Event: 9.835 Thread 0x000001c44cd94de0 Thread added: 0x000001c44e8e9750
|
||||
Event: 9.851 Thread 0x000001c44e8e9750 Thread added: 0x000001c44e8ec4e0
|
||||
Event: 9.851 Thread 0x000001c44e8e9750 Thread added: 0x000001c44e8eab90
|
||||
Event: 10.582 Thread 0x000001c47fc6a170 Thread exited: 0x000001c47fc6a170
|
||||
Event: 10.582 Thread 0x000001c4479515a0 Thread exited: 0x000001c4479515a0
|
||||
Event: 10.582 Thread 0x000001c4484a0000 Thread exited: 0x000001c4484a0000
|
||||
Event: 11.165 Thread 0x000001c44a4a16d0 Thread exited: 0x000001c44a4a16d0
|
||||
Event: 11.165 Thread 0x000001c47fc65830 Thread exited: 0x000001c47fc65830
|
||||
Event: 11.293 Thread 0x000001c47fb4cf50 Thread added: 0x000001c448f08b50
|
||||
Event: 12.495 Thread 0x000001c448f08b50 Thread exited: 0x000001c448f08b50
|
||||
|
||||
|
||||
Dynamic libraries:
|
||||
0x00007ff7072d0000 - 0x00007ff7072de000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\java.exe
|
||||
0x00007ffe87670000 - 0x00007ffe87868000 C:\Windows\SYSTEM32\ntdll.dll
|
||||
0x00007ffe85800000 - 0x00007ffe858c2000 C:\Windows\System32\KERNEL32.DLL
|
||||
0x00007ffe84f50000 - 0x00007ffe85246000 C:\Windows\System32\KERNELBASE.dll
|
||||
0x00007ffe84e20000 - 0x00007ffe84f20000 C:\Windows\System32\ucrtbase.dll
|
||||
0x00007ffdf5920000 - 0x00007ffdf593e000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\VCRUNTIME140.dll
|
||||
0x00007ffdf5940000 - 0x00007ffdf5958000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jli.dll
|
||||
0x00007ffe86750000 - 0x00007ffe868f1000 C:\Windows\System32\USER32.dll
|
||||
0x00007ffe6d7d0000 - 0x00007ffe6da6b000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.6456_none_60b8a6cb71f64256\COMCTL32.dll
|
||||
0x00007ffe84f20000 - 0x00007ffe84f42000 C:\Windows\System32\win32u.dll
|
||||
0x00007ffe86280000 - 0x00007ffe862ab000 C:\Windows\System32\GDI32.dll
|
||||
0x00007ffe861e0000 - 0x00007ffe8627e000 C:\Windows\System32\msvcrt.dll
|
||||
0x00007ffe85570000 - 0x00007ffe85689000 C:\Windows\System32\gdi32full.dll
|
||||
0x00007ffe84d00000 - 0x00007ffe84d9d000 C:\Windows\System32\msvcp_win.dll
|
||||
0x00007ffe86660000 - 0x00007ffe8668f000 C:\Windows\System32\IMM32.DLL
|
||||
0x00007ffe4e150000 - 0x00007ffe4e15c000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\vcruntime140_1.dll
|
||||
0x00007ffdf5890000 - 0x00007ffdf5919000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\msvcp140.dll
|
||||
0x00007ffdf4c10000 - 0x00007ffdf588a000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\server\jvm.dll
|
||||
0x00007ffe86690000 - 0x00007ffe86741000 C:\Windows\System32\ADVAPI32.dll
|
||||
0x00007ffe858d0000 - 0x00007ffe8596f000 C:\Windows\System32\sechost.dll
|
||||
0x00007ffe860c0000 - 0x00007ffe861e0000 C:\Windows\System32\RPCRT4.dll
|
||||
0x00007ffe85440000 - 0x00007ffe85467000 C:\Windows\System32\bcrypt.dll
|
||||
0x00007ffe85fa0000 - 0x00007ffe8600b000 C:\Windows\System32\WS2_32.dll
|
||||
0x00007ffe7ad90000 - 0x00007ffe7adb7000 C:\Windows\SYSTEM32\WINMM.dll
|
||||
0x00007ffe84240000 - 0x00007ffe8428b000 C:\Windows\SYSTEM32\POWRPROF.dll
|
||||
0x00007ffe7dc00000 - 0x00007ffe7dc0a000 C:\Windows\SYSTEM32\VERSION.dll
|
||||
0x00007ffe84100000 - 0x00007ffe84112000 C:\Windows\SYSTEM32\UMPDC.dll
|
||||
0x00007ffe83510000 - 0x00007ffe83522000 C:\Windows\SYSTEM32\kernel.appcore.dll
|
||||
0x00007ffe42e00000 - 0x00007ffe42e0a000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jimage.dll
|
||||
0x00007ffe83040000 - 0x00007ffe83241000 C:\Windows\SYSTEM32\DBGHELP.DLL
|
||||
0x00007ffe6b0a0000 - 0x00007ffe6b0d4000 C:\Windows\SYSTEM32\dbgcore.DLL
|
||||
0x00007ffe853b0000 - 0x00007ffe85432000 C:\Windows\System32\bcryptPrimitives.dll
|
||||
0x00007ffe7f940000 - 0x00007ffe7f94f000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\instrument.dll
|
||||
0x00007ffdf4be0000 - 0x00007ffdf4c06000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\java.dll
|
||||
0x00007ffdf4b00000 - 0x00007ffdf4bd6000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\jsvml.dll
|
||||
0x00007ffe86c60000 - 0x00007ffe873d0000 C:\Windows\System32\SHELL32.dll
|
||||
0x00007ffe82890000 - 0x00007ffe83035000 C:\Windows\SYSTEM32\windows.storage.dll
|
||||
0x00007ffe86900000 - 0x00007ffe86c54000 C:\Windows\System32\combase.dll
|
||||
0x00007ffe84730000 - 0x00007ffe8475b000 C:\Windows\SYSTEM32\Wldp.dll
|
||||
0x00007ffe85e00000 - 0x00007ffe85ecd000 C:\Windows\System32\OLEAUT32.dll
|
||||
0x00007ffe86010000 - 0x00007ffe860bd000 C:\Windows\System32\SHCORE.dll
|
||||
0x00007ffe875d0000 - 0x00007ffe8762b000 C:\Windows\System32\shlwapi.dll
|
||||
0x00007ffe84c30000 - 0x00007ffe84c54000 C:\Windows\SYSTEM32\profapi.dll
|
||||
0x00007ffdf4aa0000 - 0x00007ffdf4ab8000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\zip.dll
|
||||
0x00007ffdf4ae0000 - 0x00007ffdf4afb000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\net.dll
|
||||
0x00007ffe7eac0000 - 0x00007ffe7ebca000 C:\Windows\SYSTEM32\WINHTTP.dll
|
||||
0x00007ffe84490000 - 0x00007ffe844fa000 C:\Windows\system32\mswsock.dll
|
||||
0x00007ffdf4ac0000 - 0x00007ffdf4ad6000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\nio.dll
|
||||
0x00007ffdf3210000 - 0x00007ffdf3220000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\verify.dll
|
||||
0x00007ffe7fde0000 - 0x00007ffe7fe07000 F:\gradle\native\c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48\windows-amd64\native-platform.dll
|
||||
0x00007ffe29cc0000 - 0x00007ffe29e04000 F:\gradle\native\38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47\windows-amd64\native-platform-file-events.dll
|
||||
0x00007ffe6dc30000 - 0x00007ffe6dc3a000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management.dll
|
||||
0x00007ffe6b750000 - 0x00007ffe6b75c000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\management_ext.dll
|
||||
0x00007ffe85980000 - 0x00007ffe85988000 C:\Windows\System32\PSAPI.DLL
|
||||
0x00007ffe84690000 - 0x00007ffe846a8000 C:\Windows\SYSTEM32\CRYPTSP.dll
|
||||
0x00007ffe83d40000 - 0x00007ffe83d78000 C:\Windows\system32\rsaenh.dll
|
||||
0x00007ffe84bb0000 - 0x00007ffe84bde000 C:\Windows\SYSTEM32\USERENV.dll
|
||||
0x00007ffe84680000 - 0x00007ffe8468c000 C:\Windows\SYSTEM32\CRYPTBASE.dll
|
||||
0x00007ffe84120000 - 0x00007ffe8415b000 C:\Windows\SYSTEM32\IPHLPAPI.DLL
|
||||
0x00007ffe85970000 - 0x00007ffe85978000 C:\Windows\System32\NSI.dll
|
||||
0x00007ffe7dbb0000 - 0x00007ffe7dbc7000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL
|
||||
0x00007ffe7e000000 - 0x00007ffe7e01d000 C:\Windows\SYSTEM32\dhcpcsvc.DLL
|
||||
0x00007ffe84170000 - 0x00007ffe8423a000 C:\Windows\SYSTEM32\DNSAPI.dll
|
||||
0x00007ffe252e0000 - 0x00007ffe252e9000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\extnet.dll
|
||||
0x00007ffe6b680000 - 0x00007ffe6b68e000 C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\sunmscapi.dll
|
||||
0x00007ffe85250000 - 0x00007ffe853ad000 C:\Windows\System32\CRYPT32.dll
|
||||
0x00007ffe847a0000 - 0x00007ffe847c7000 C:\Windows\SYSTEM32\ncrypt.dll
|
||||
0x00007ffe84760000 - 0x00007ffe8479b000 C:\Windows\SYSTEM32\NTASN1.dll
|
||||
0x00007ffe58af0000 - 0x00007ffe58af7000 C:\Windows\system32\wshunix.dll
|
||||
|
||||
dbghelp: loaded successfully - version: 4.0.5 - missing functions: none
|
||||
symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Users\SelfImpr\.jdks\ms-17.0.18\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.6456_none_60b8a6cb71f64256;C:\Users\SelfImpr\.jdks\ms-17.0.18\bin\server;F:\gradle\native\c067742578af261105cb4f569cf0c3c89f3d7b1fecec35dd04571415982c5e48\windows-amd64;F:\gradle\native\38dada09dfb8b06ba9b0570ebf7e218e3eb74d4ef43ca46872605cf95ebc2f47\windows-amd64
|
||||
|
||||
VM Arguments:
|
||||
jvm_args: --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED -Xmx1024m -Dfile.encoding=UTF-8 -Duser.country=CN -Duser.language=zh -Duser.variant -javaagent:F:\gradle\wrapper\dists\gradle-8.5-all\dckgjkhjnjukymoblh8u3ms10\gradle-8.5\lib\agents\gradle-instrumentation-agent-8.5.jar
|
||||
java_command: org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.5
|
||||
java_class_path (initial): F:\gradle\wrapper\dists\gradle-8.5-all\dckgjkhjnjukymoblh8u3ms10\gradle-8.5\lib\gradle-launcher-8.5.jar
|
||||
Launcher Type: SUN_STANDARD
|
||||
|
||||
[Global flags]
|
||||
intx CICompilerCount = 12 {product} {ergonomic}
|
||||
uint ConcGCThreads = 3 {product} {ergonomic}
|
||||
uint G1ConcRefinementThreads = 13 {product} {ergonomic}
|
||||
size_t G1HeapRegionSize = 1048576 {product} {ergonomic}
|
||||
uintx GCDrainStackTargetSize = 64 {product} {ergonomic}
|
||||
size_t InitialHeapSize = 257949696 {product} {ergonomic}
|
||||
size_t MarkStackSize = 4194304 {product} {ergonomic}
|
||||
size_t MaxHeapSize = 1073741824 {product} {command line}
|
||||
size_t MaxNewSize = 643825664 {product} {ergonomic}
|
||||
size_t MinHeapDeltaBytes = 1048576 {product} {ergonomic}
|
||||
size_t MinHeapSize = 8388608 {product} {ergonomic}
|
||||
uintx NonNMethodCodeHeapSize = 7602480 {pd product} {ergonomic}
|
||||
uintx NonProfiledCodeHeapSize = 122027880 {pd product} {ergonomic}
|
||||
uintx ProfiledCodeHeapSize = 122027880 {pd product} {ergonomic}
|
||||
uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic}
|
||||
bool SegmentedCodeCache = true {product} {ergonomic}
|
||||
size_t SoftMaxHeapSize = 1073741824 {manageable} {ergonomic}
|
||||
bool UseCompressedClassPointers = true {product lp64_product} {ergonomic}
|
||||
bool UseCompressedOops = true {product lp64_product} {ergonomic}
|
||||
bool UseG1GC = true {product} {ergonomic}
|
||||
bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic}
|
||||
|
||||
Logging:
|
||||
Log output configuration:
|
||||
#0: stdout all=warning uptime,level,tags
|
||||
#1: stderr all=off uptime,level,tags
|
||||
|
||||
Environment Variables:
|
||||
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291
|
||||
PATH=C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;rogram Files\TortoiseGit\bin;C:\Program Files (x86)\Go\bin;Program Files (x86)\Git\cmd;G:\开发软件\Git\Git\cmd;C:\Program Files\nodejs\;C:\Users\SelfImpr\AppData\Local\Microsoft\WindowsApps;C:\Users\SelfImpr\AppData\Local\GitHubDesktop\bin;C:\Users\SelfImpr\go\bin;G:\工作软件\Microsoft VS Code\bin;C:\Users\SelfImpr\AppData\Local\Programs\Fiddler;C:\Program Files\Java\jdk1.8.0_291\bin;D:\LenovoSoftstore\Install\QQliuxidating\QQGameTempest\Hall.58574\;G:\工作软件\cursor\cursor\resources\app\bin;C:\Users\SelfImpr\AppData\Roaming\npm
|
||||
USERNAME=SelfImpr
|
||||
OS=Windows_NT
|
||||
PROCESSOR_IDENTIFIER=AMD64 Family 23 Model 96 Stepping 1, AuthenticAMD
|
||||
TMP=C:\Users\SelfImpr\AppData\Local\Temp
|
||||
TEMP=C:\Users\SelfImpr\AppData\Local\Temp
|
||||
|
||||
|
||||
|
||||
Periodic native trim disabled
|
||||
|
||||
|
||||
--------------- S Y S T E M ---------------
|
||||
|
||||
OS:
|
||||
Windows 10 , 64 bit Build 19041 (10.0.19041.5915)
|
||||
OS uptime: 0 days 6:42 hours
|
||||
|
||||
CPU: total 16 (initial active 16) (16 cores per cpu, 2 threads per core) family 23 model 96 stepping 1 microcode 0x0, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4a, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, clmul, bmi1, bmi2, adx, sha, fma, vzeroupper, clflush, clflushopt
|
||||
Processor Information for the first 16 processors :
|
||||
Max Mhz: 2900, Current Mhz: 2900, Mhz Limit: 2900
|
||||
|
||||
Memory: 4k page, system-wide physical 15741M (204M free)
|
||||
TotalPageFile size 33109M (AvailPageFile size 3M)
|
||||
current process WorkingSet (physical memory assigned to process): 302M, peak: 356M
|
||||
current process commit charge ("private bytes"): 349M, peak: 455M
|
||||
|
||||
vm_info: OpenJDK 64-Bit Server VM (17.0.18+8-LTS) for windows-amd64 JRE (17.0.18+8-LTS), built on Jan 15 2026 18:50:45 by "MicrosoftCorporation" with MS VC++ 17.14 (VS2022)
|
||||
|
||||
END.
|
||||
+5147
File diff suppressed because one or more lines are too long
+9760
File diff suppressed because one or more lines are too long
@@ -0,0 +1,22 @@
|
||||
import org.gradle.api.JavaVersion
|
||||
import org.gradle.api.GradleException
|
||||
|
||||
pluginManagement {
|
||||
repositories {
|
||||
// 国内镜像:Gradle 插件(含 org.jetbrains.intellij 等,同步自 Gradle Plugin Portal)
|
||||
maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") }
|
||||
gradlePluginPortal()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
// org.jetbrains.intellij 插件 1.17.x 的构件声明为 Java 11+;用 Java 8 跑 Gradle 会报 “compatible with Java 8” 类错误
|
||||
if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) {
|
||||
throw GradleException(
|
||||
"Idea-Plugin 需要 JDK 11+ 运行 Gradle(当前 JVM: ${System.getProperty("java.version")})。\n" +
|
||||
"IntelliJ IDEA: Settings → Build, Execution, Deployment → Build Tools → Gradle → Gradle JVM → 选 17。\n" +
|
||||
"命令行: 将 JAVA_HOME 设为 JDK 17 后再执行 gradlew。"
|
||||
)
|
||||
}
|
||||
|
||||
rootProject.name = "Idea-Plugin"
|
||||
@@ -0,0 +1,156 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
||||
import com.intellij.openapi.ui.ValidationInfo;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.swing.Box;
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class GenerateCmdDialog extends DialogWrapper {
|
||||
|
||||
private final Project project;
|
||||
private final ProtoParseResult parseResult;
|
||||
private final String cmdRpcFullText;
|
||||
private final Map<Integer, String> pbServiceByNumber;
|
||||
private final List<JCheckBox> checkBoxes = new ArrayList<>();
|
||||
private final TextFieldWithBrowseButton outputDirField = new TextFieldWithBrowseButton();
|
||||
|
||||
public GenerateCmdDialog(
|
||||
@Nullable Project project,
|
||||
ProtoParseResult parseResult,
|
||||
String cmdRpcFullText,
|
||||
Map<Integer, String> pbServiceByNumber) {
|
||||
super(project);
|
||||
this.project = project;
|
||||
this.parseResult = parseResult;
|
||||
this.cmdRpcFullText = cmdRpcFullText;
|
||||
this.pbServiceByNumber = pbServiceByNumber;
|
||||
setTitle("Proto转Java");
|
||||
init();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JComponent createCenterPanel() {
|
||||
JPanel root = new JPanel(new BorderLayout(8, 8));
|
||||
|
||||
String jp = parseResult.getJavaPackageOption();
|
||||
JLabel hint =
|
||||
new JLabel("<html>proto <code>java_package</code>: <b>"
|
||||
+ (jp != null ? jp : "(未解析到 option java_package)")
|
||||
+ "</b><br/>勾选要生成的 RPC;输出目录建议选模块下 <code>src/main/java/.../cmd/cmds</code>。</html>");
|
||||
root.add(hint, BorderLayout.NORTH);
|
||||
|
||||
JPanel listPanel = new JPanel();
|
||||
listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.Y_AXIS));
|
||||
for (RpcMethodInfo rpc : parseResult.getRpcMethods()) {
|
||||
JCheckBox cb = new JCheckBox(rpc.toString(), true);
|
||||
cb.putClientProperty("rpc", rpc);
|
||||
checkBoxes.add(cb);
|
||||
listPanel.add(cb);
|
||||
listPanel.add(Box.createVerticalStrut(4));
|
||||
}
|
||||
JBScrollPane scroll = new JBScrollPane(listPanel);
|
||||
scroll.setPreferredSize(new Dimension(560, 220));
|
||||
root.add(scroll, BorderLayout.CENTER);
|
||||
|
||||
JPanel south = new JPanel(new BorderLayout(4, 4));
|
||||
south.add(new JLabel("输出目录:"), BorderLayout.WEST);
|
||||
FileChooserDescriptor desc = FileChooserDescriptorFactory.createSingleFolderDescriptor();
|
||||
desc.setTitle("选择生成 Java 的根目录(通常为 .../cmd/cmds)");
|
||||
outputDirField.addBrowseFolderListener("选择目录", null, project, desc);
|
||||
south.add(outputDirField, BorderLayout.CENTER);
|
||||
root.add(south, BorderLayout.SOUTH);
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected ValidationInfo doValidate() {
|
||||
String path = outputDirField.getText().trim();
|
||||
if (path.isEmpty()) {
|
||||
return new ValidationInfo("请选择输出目录", outputDirField);
|
||||
}
|
||||
VirtualFile dir = LocalFileSystem.getInstance().findFileByPath(path);
|
||||
if (dir == null || !dir.isDirectory()) {
|
||||
return new ValidationInfo("输出路径不是有效目录", outputDirField);
|
||||
}
|
||||
String pkg = PackageInference.inferPackage(dir);
|
||||
if (pkg.isEmpty()) {
|
||||
return new ValidationInfo(
|
||||
"无法推断 Java 包名:请选择位于 .../src/main/java/<包路径>/ 下的目录。", outputDirField);
|
||||
}
|
||||
List<RpcMethodInfo> sel = getSelectedRpcs();
|
||||
if (sel.isEmpty()) {
|
||||
return new ValidationInfo("请至少勾选一条 RPC");
|
||||
}
|
||||
for (RpcMethodInfo rpc : sel) {
|
||||
List<String> methods =
|
||||
ProtoEnumResolver.orderedMethodConstantNames(cmdRpcFullText, rpc.getServiceIndex());
|
||||
if (rpc.getRpcIndexInService() >= methods.size()) {
|
||||
return new ValidationInfo(
|
||||
"RPC "
|
||||
+ rpc.getRpcName()
|
||||
+ " 在 service "
|
||||
+ rpc.getServiceIndex()
|
||||
+ " 中为第 "
|
||||
+ (rpc.getRpcIndexInService() + 1)
|
||||
+ " 条,但 proto 中 Service"
|
||||
+ rpc.getServiceIndex()
|
||||
+ "_Method 可用枚举项不足(请检查 Method 定义顺序与 RPC 顺序是否一致)。");
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<RpcMethodInfo> getSelectedRpcs() {
|
||||
List<RpcMethodInfo> list = new ArrayList<>();
|
||||
for (JCheckBox cb : checkBoxes) {
|
||||
if (cb.isSelected()) {
|
||||
list.add((RpcMethodInfo) cb.getClientProperty("rpc"));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public VirtualFile getOutputDirectory() {
|
||||
String path = outputDirField.getText().trim();
|
||||
return LocalFileSystem.getInstance().findFileByPath(path);
|
||||
}
|
||||
|
||||
public String getOutputPackage() {
|
||||
VirtualFile dir = getOutputDirectory();
|
||||
return PackageInference.inferPackage(dir);
|
||||
}
|
||||
|
||||
public String getProtoJavaPackage() {
|
||||
String p = parseResult.getJavaPackageOption();
|
||||
return p != null ? p : "com.huangzj.cmd.gen";
|
||||
}
|
||||
|
||||
public String resolvePbServiceEnumName(RpcMethodInfo rpc) {
|
||||
return ProtoEnumResolver.resolvePbServiceConstant(pbServiceByNumber, rpc.getServiceIndex());
|
||||
}
|
||||
|
||||
public String resolveMethodEnumConstant(RpcMethodInfo rpc) {
|
||||
List<String> names =
|
||||
ProtoEnumResolver.orderedMethodConstantNames(cmdRpcFullText, rpc.getServiceIndex());
|
||||
return names.get(rpc.getRpcIndexInService());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
/** 生成与 comm-framework 风格一致的 {@link com.huangzj.base.cmd.AbstractTypedPbCommand} 子类源码。 */
|
||||
public final class JavaCommandGenerator {
|
||||
|
||||
private JavaCommandGenerator() {}
|
||||
|
||||
public static String generate(
|
||||
RpcMethodInfo rpc,
|
||||
String outputPackage,
|
||||
String protoJavaPackage,
|
||||
String pbServiceEnumConstant,
|
||||
String methodEnumConstant) {
|
||||
|
||||
String cts = rpc.getRequestType();
|
||||
String stc = rpc.getResponseType();
|
||||
String className = rpc.getRpcName();
|
||||
String methodEnumClass = rpc.methodEnumClass();
|
||||
|
||||
String imports =
|
||||
"import "
|
||||
+ protoJavaPackage
|
||||
+ "."
|
||||
+ cts
|
||||
+ ";\n"
|
||||
+ "import "
|
||||
+ protoJavaPackage
|
||||
+ "."
|
||||
+ stc
|
||||
+ ";\n"
|
||||
+ "import "
|
||||
+ protoJavaPackage
|
||||
+ ".PbService;\n"
|
||||
+ "import "
|
||||
+ protoJavaPackage
|
||||
+ "."
|
||||
+ methodEnumClass
|
||||
+ ";\n";
|
||||
|
||||
return "package "
|
||||
+ outputPackage
|
||||
+ ";\n\n"
|
||||
+ "import com.huangzj.base.cmd.AbstractTypedPbCommand;\n"
|
||||
+ "import com.huangzj.base.cmd.Cmd;\n"
|
||||
+ "import com.huangzj.base.cmd.CommandContext;\n"
|
||||
+ "import com.huangzj.base.cmd.CommandSource;\n"
|
||||
+ imports
|
||||
+ "import org.springframework.stereotype.Component;\n\n"
|
||||
+ "/**\n"
|
||||
+ " * Generated from proto rpc: "
|
||||
+ rpc.getServiceName()
|
||||
+ "."
|
||||
+ rpc.getRpcName()
|
||||
+ "\n"
|
||||
+ " * Request: "
|
||||
+ cts
|
||||
+ ", Response: "
|
||||
+ stc
|
||||
+ ".\n"
|
||||
+ " */\n"
|
||||
+ "@Component\n"
|
||||
+ "@Cmd(source = CommandSource.Client_TCP, serviceId = PbService."
|
||||
+ pbServiceEnumConstant
|
||||
+ "_VALUE, methodId = "
|
||||
+ methodEnumClass
|
||||
+ "."
|
||||
+ methodEnumConstant
|
||||
+ "_VALUE)\n"
|
||||
+ "public class "
|
||||
+ className
|
||||
+ " extends AbstractTypedPbCommand<"
|
||||
+ cts
|
||||
+ ", "
|
||||
+ stc
|
||||
+ ".Builder> {\n\n"
|
||||
+ " @Override\n"
|
||||
+ " protected void run(CommandContext ctx, "
|
||||
+ cts
|
||||
+ " cts, "
|
||||
+ stc
|
||||
+ ".Builder stcBuilder) throws Exception {\n"
|
||||
+ " // TODO: implement business logic\n"
|
||||
+ " }\n"
|
||||
+ "}\n";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import com.intellij.openapi.actionSystem.ActionPlaces;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.huangzj.protoplugin.mysql.MysqlEntityDialog;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/** 在项目目录上打开「从 MySQL 生成 JPA 实体」对话框。 */
|
||||
public class MysqlEntityFromFolderAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void update(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE);
|
||||
boolean dir = vf != null && vf.isDirectory();
|
||||
String place = e.getPlace();
|
||||
if (ActionPlaces.isPopupPlace(place)) {
|
||||
e.getPresentation().setEnabledAndVisible(dir);
|
||||
} else {
|
||||
e.getPresentation().setVisible(true);
|
||||
e.getPresentation().setEnabled(project != null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
if (project == null) {
|
||||
return;
|
||||
}
|
||||
VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE);
|
||||
VirtualFile folder = vf != null && vf.isDirectory() ? vf : null;
|
||||
MysqlEntityDialog dialog = new MysqlEntityDialog(project, folder);
|
||||
dialog.showAndGet();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
|
||||
/** 根据输出目录路径推断 Java package(优先 {@code src/main/java} 之后的路径)。 */
|
||||
public final class PackageInference {
|
||||
|
||||
private PackageInference() {}
|
||||
|
||||
public static String inferPackage(VirtualFile directory) {
|
||||
if (directory == null) {
|
||||
return "com.example.cmd.cmds";
|
||||
}
|
||||
String path = directory.getPath().replace('\\', '/');
|
||||
String marker = "/src/main/java/";
|
||||
int idx = path.indexOf(marker);
|
||||
if (idx >= 0) {
|
||||
String sub = path.substring(idx + marker.length());
|
||||
if (sub.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
return sub.replace('/', '.');
|
||||
}
|
||||
int j = path.lastIndexOf("/java/");
|
||||
if (j >= 0) {
|
||||
String sub = path.substring(j + "/java/".length());
|
||||
return sub.replace('/', '.');
|
||||
}
|
||||
return "com.example.cmd.cmds";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import com.intellij.lang.java.JavaLanguage;
|
||||
import com.intellij.openapi.actionSystem.ActionPlaces;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys;
|
||||
import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiFileFactory;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ProtoCmdGeneratorAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void update(@NotNull AnActionEvent e) {
|
||||
VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE);
|
||||
if (vf == null) {
|
||||
PsiFile pf = e.getData(CommonDataKeys.PSI_FILE);
|
||||
if (pf != null) {
|
||||
vf = pf.getVirtualFile();
|
||||
}
|
||||
}
|
||||
boolean proto = vf != null && "proto".equalsIgnoreCase(vf.getExtension());
|
||||
// 主菜单(如 Tools):始终显示条目,非 proto 时禁用,避免用户找不到入口。
|
||||
// 编辑器/项目树右键:仅在看 .proto 时显示,减少菜单噪音。
|
||||
String place = e.getPlace();
|
||||
if (ActionPlaces.isPopupPlace(place)) {
|
||||
e.getPresentation().setEnabledAndVisible(proto);
|
||||
} else {
|
||||
e.getPresentation().setVisible(true);
|
||||
e.getPresentation().setEnabled(proto);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
VirtualFile protoFile = e.getData(CommonDataKeys.VIRTUAL_FILE);
|
||||
if (protoFile == null) {
|
||||
PsiFile pf = e.getData(CommonDataKeys.PSI_FILE);
|
||||
if (pf != null) {
|
||||
protoFile = pf.getVirtualFile();
|
||||
}
|
||||
}
|
||||
if (project == null || protoFile == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
String text;
|
||||
try {
|
||||
text = new String(protoFile.contentsToByteArray(), StandardCharsets.UTF_8);
|
||||
} catch (Exception ex) {
|
||||
Messages.showErrorDialog(project, ex.getMessage(), "读取 proto 失败");
|
||||
return;
|
||||
}
|
||||
|
||||
ProtoParseResult parsed = ProtoFileParser.parse(text);
|
||||
if (parsed.getRpcMethods().isEmpty()) {
|
||||
Messages.showWarningDialog(
|
||||
project,
|
||||
"当前文件未解析到 service/rpc。\n需 service 命名为 Service1Service、Service2Service…,且 rpc 为标准 proto3 语法。",
|
||||
"未找到 RPC");
|
||||
return;
|
||||
}
|
||||
|
||||
Map<Integer, String> pbMap = Map.of();
|
||||
VirtualFile parent = protoFile.getParent();
|
||||
if (parent != null) {
|
||||
VirtualFile pbSvc = parent.findChild("pb_service.proto");
|
||||
if (pbSvc != null) {
|
||||
try {
|
||||
String pbText = new String(pbSvc.contentsToByteArray(), StandardCharsets.UTF_8);
|
||||
pbMap = ProtoEnumResolver.parsePbServiceByNumber(pbText);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GenerateCmdDialog dialog = new GenerateCmdDialog(project, parsed, text, pbMap);
|
||||
if (!dialog.showAndGet()) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<RpcMethodInfo> selected = dialog.getSelectedRpcs();
|
||||
VirtualFile outDir = dialog.getOutputDirectory();
|
||||
String outPkg = dialog.getOutputPackage();
|
||||
String protoJavaPkg = dialog.getProtoJavaPackage();
|
||||
|
||||
if (outDir == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
int[] created = {0};
|
||||
int[] skipped = {0};
|
||||
|
||||
WriteCommandAction.runWriteCommandAction(project, () -> {
|
||||
PsiDirectory psiDir = PsiManager.getInstance(project).findDirectory(outDir);
|
||||
if (psiDir == null) {
|
||||
return;
|
||||
}
|
||||
PsiFileFactory factory = PsiFileFactory.getInstance(project);
|
||||
for (RpcMethodInfo rpc : selected) {
|
||||
String className = rpc.getRpcName() + ".java";
|
||||
if (psiDir.findFile(className) != null) {
|
||||
skipped[0]++;
|
||||
continue;
|
||||
}
|
||||
String pbConst = dialog.resolvePbServiceEnumName(rpc);
|
||||
String methodConst = dialog.resolveMethodEnumConstant(rpc);
|
||||
String src =
|
||||
JavaCommandGenerator.generate(
|
||||
rpc, outPkg, protoJavaPkg, pbConst, methodConst);
|
||||
PsiFile psiFile =
|
||||
factory.createFileFromText(className, JavaLanguage.INSTANCE, src);
|
||||
psiDir.add(psiFile);
|
||||
created[0]++;
|
||||
}
|
||||
});
|
||||
|
||||
Messages.showInfoMessage(
|
||||
project,
|
||||
"新建 " + created[0] + " 个文件,跳过已存在 " + skipped[0] + " 个。",
|
||||
"Proto转Java 完成");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* 从 proto 文本解析 {@code PbService} 与 {@code ServiceN_Method},供生成 {@code PbService.Service_k_VALUE} /
|
||||
* {@code ServiceN_Method.MethodJ_VALUE}。
|
||||
*/
|
||||
public final class ProtoEnumResolver {
|
||||
|
||||
private static final Pattern ENUM_ENTRY = Pattern.compile("(\\w+)\\s*=\\s*(\\d+)\\s*;?");
|
||||
|
||||
private ProtoEnumResolver() {}
|
||||
|
||||
/** service 序号(如 1)→ PbService 枚举常量名(如 Service_1)。 */
|
||||
public static Map<Integer, String> parsePbServiceByNumber(String pbServiceProtoContent) {
|
||||
Map<Integer, String> map = new HashMap<>();
|
||||
Matcher em = Pattern.compile("enum\\s+PbService\\s*\\{([^}]+)\\}", Pattern.DOTALL)
|
||||
.matcher(pbServiceProtoContent);
|
||||
if (!em.find()) {
|
||||
return map;
|
||||
}
|
||||
String body = em.group(1);
|
||||
Matcher m = ENUM_ENTRY.matcher(body);
|
||||
while (m.find()) {
|
||||
String name = m.group(1);
|
||||
int num = Integer.parseInt(m.group(2));
|
||||
if ("Default".equals(name) || num == 0) {
|
||||
continue;
|
||||
}
|
||||
map.put(num, name);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 {@code ServiceN_Method}:去掉 Default*,按数值排序,第 i 个(从 0 起)对应同 service 内第 i 条 rpc。
|
||||
*/
|
||||
public static List<String> orderedMethodConstantNames(String cmdRpcContent, int serviceNumber) {
|
||||
Pattern p = Pattern.compile(
|
||||
"enum\\s+Service" + serviceNumber + "_Method\\s*\\{([^}]+)\\}", Pattern.DOTALL);
|
||||
Matcher em = p.matcher(cmdRpcContent);
|
||||
if (!em.find()) {
|
||||
return List.of();
|
||||
}
|
||||
String body = em.group(1);
|
||||
List<NameValue> list = new ArrayList<>();
|
||||
Matcher m = ENUM_ENTRY.matcher(body);
|
||||
while (m.find()) {
|
||||
String name = m.group(1);
|
||||
int val = Integer.parseInt(m.group(2));
|
||||
if (name.startsWith("Default")) {
|
||||
continue;
|
||||
}
|
||||
list.add(new NameValue(name, val));
|
||||
}
|
||||
list.sort(Comparator.comparingInt(nv -> nv.value));
|
||||
return list.stream().map(nv -> nv.name).toList();
|
||||
}
|
||||
|
||||
public static String resolvePbServiceConstant(Map<Integer, String> byNumber, int serviceIndex) {
|
||||
String name = byNumber.get(serviceIndex);
|
||||
if (name != null) {
|
||||
return name;
|
||||
}
|
||||
return "Service_" + serviceIndex;
|
||||
}
|
||||
|
||||
private record NameValue(String name, int value) {}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* 轻量解析 proto3:提取 {@code option java_package}、{@code service} 块内的 {@code rpc ... (Req) returns (Res)}。
|
||||
*/
|
||||
public final class ProtoFileParser {
|
||||
|
||||
private static final Pattern JAVA_PACKAGE =
|
||||
Pattern.compile("option\\s+java_package\\s*=\\s*\"([^\"]+)\"\\s*;", Pattern.MULTILINE);
|
||||
private static final Pattern SERVICE_HEADER =
|
||||
Pattern.compile("\\bservice\\s+(\\w+)\\s*\\{");
|
||||
private static final Pattern RPC_LINE = Pattern.compile(
|
||||
"\\brpc\\s+(\\w+)\\s*\\(\\s*(\\w+)\\s*\\)\\s*returns\\s*\\(\\s*(\\w+)\\s*\\)\\s*;",
|
||||
Pattern.MULTILINE);
|
||||
|
||||
private ProtoFileParser() {}
|
||||
|
||||
public static ProtoParseResult parse(String content) {
|
||||
String javaPkg = null;
|
||||
Matcher jm = JAVA_PACKAGE.matcher(content);
|
||||
if (jm.find()) {
|
||||
javaPkg = jm.group(1);
|
||||
}
|
||||
|
||||
List<RpcMethodInfo> out = new ArrayList<>();
|
||||
Matcher sm = SERVICE_HEADER.matcher(content);
|
||||
while (sm.find()) {
|
||||
String serviceName = sm.group(1);
|
||||
Integer idx = parseServiceIndex(serviceName);
|
||||
if (idx == null) {
|
||||
continue;
|
||||
}
|
||||
int blockStart = sm.end() - 1;
|
||||
int blockEnd = findMatchingBrace(content, blockStart);
|
||||
if (blockEnd < 0) {
|
||||
continue;
|
||||
}
|
||||
String block = content.substring(blockStart + 1, blockEnd);
|
||||
Matcher rm = RPC_LINE.matcher(block);
|
||||
int rpcIndex = 0;
|
||||
while (rm.find()) {
|
||||
String rpcName = rm.group(1);
|
||||
String req = rm.group(2);
|
||||
String res = rm.group(3);
|
||||
out.add(new RpcMethodInfo(serviceName, idx, rpcIndex, rpcName, req, res));
|
||||
rpcIndex++;
|
||||
}
|
||||
}
|
||||
return new ProtoParseResult(javaPkg, out);
|
||||
}
|
||||
|
||||
/** 识别 {@code Service1Service} → 1;其它命名返回 null 并跳过该 service。 */
|
||||
static Integer parseServiceIndex(String serviceName) {
|
||||
Matcher m = Pattern.compile("^Service(\\d+)Service$").matcher(serviceName);
|
||||
if (m.matches()) {
|
||||
return Integer.parseInt(m.group(1));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static int findMatchingBrace(String s, int openBraceIndex) {
|
||||
int depth = 0;
|
||||
for (int i = openBraceIndex; i < s.length(); i++) {
|
||||
char c = s.charAt(i);
|
||||
if (c == '{') {
|
||||
depth++;
|
||||
} else if (c == '}') {
|
||||
depth--;
|
||||
if (depth == 0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public final class ProtoParseResult {
|
||||
|
||||
private final String javaPackageOption;
|
||||
private final List<RpcMethodInfo> rpcMethods;
|
||||
|
||||
public ProtoParseResult(String javaPackageOption, List<RpcMethodInfo> rpcMethods) {
|
||||
this.javaPackageOption = javaPackageOption;
|
||||
this.rpcMethods = rpcMethods;
|
||||
}
|
||||
|
||||
public String getJavaPackageOption() {
|
||||
return javaPackageOption;
|
||||
}
|
||||
|
||||
public List<RpcMethodInfo> getRpcMethods() {
|
||||
return Collections.unmodifiableList(rpcMethods);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
package com.huangzj.protoplugin;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/** 一条 RPC:所属 service、方法名、请求/响应消息类型(proto 中的 message 名)。 */
|
||||
public final class RpcMethodInfo {
|
||||
|
||||
private final String serviceName;
|
||||
private final int serviceIndex;
|
||||
private final int rpcIndexInService;
|
||||
private final String rpcName;
|
||||
private final String requestType;
|
||||
private final String responseType;
|
||||
|
||||
public RpcMethodInfo(
|
||||
String serviceName,
|
||||
int serviceIndex,
|
||||
int rpcIndexInService,
|
||||
String rpcName,
|
||||
String requestType,
|
||||
String responseType) {
|
||||
this.serviceName = serviceName;
|
||||
this.serviceIndex = serviceIndex;
|
||||
this.rpcIndexInService = rpcIndexInService;
|
||||
this.rpcName = rpcName;
|
||||
this.requestType = requestType;
|
||||
this.responseType = responseType;
|
||||
}
|
||||
|
||||
public String getServiceName() {
|
||||
return serviceName;
|
||||
}
|
||||
|
||||
public int getServiceIndex() {
|
||||
return serviceIndex;
|
||||
}
|
||||
|
||||
public int getRpcIndexInService() {
|
||||
return rpcIndexInService;
|
||||
}
|
||||
|
||||
public String getRpcName() {
|
||||
return rpcName;
|
||||
}
|
||||
|
||||
public String getRequestType() {
|
||||
return requestType;
|
||||
}
|
||||
|
||||
public String getResponseType() {
|
||||
return responseType;
|
||||
}
|
||||
|
||||
public String methodEnumClass() {
|
||||
return "Service" + serviceIndex + "_Method";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return serviceName
|
||||
+ "."
|
||||
+ rpcName
|
||||
+ " ("
|
||||
+ requestType
|
||||
+ " → "
|
||||
+ responseType
|
||||
+ ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
RpcMethodInfo that = (RpcMethodInfo) o;
|
||||
return serviceIndex == that.serviceIndex
|
||||
&& rpcIndexInService == that.rpcIndexInService
|
||||
&& Objects.equals(serviceName, that.serviceName)
|
||||
&& Objects.equals(rpcName, that.rpcName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(serviceName, serviceIndex, rpcIndexInService, rpcName);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.huangzj.protoplugin.json;
|
||||
|
||||
import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiIdentifier;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/** 光标在类名标识符上时,确认后生成默认 JSON。 */
|
||||
public final class ClassToJsonIntention extends PsiElementBaseIntentionAction {
|
||||
|
||||
@Override
|
||||
public @NotNull String getFamilyName() {
|
||||
return "Idea-Plugin JSON";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getText() {
|
||||
return "是否生成 JSON(默认值)…";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable(
|
||||
@NotNull Project project, Editor editor, @NotNull PsiElement element) {
|
||||
if (!(element instanceof PsiIdentifier)) {
|
||||
return false;
|
||||
}
|
||||
PsiElement parent = element.getParent();
|
||||
if (!(parent instanceof PsiClass)) {
|
||||
return false;
|
||||
}
|
||||
PsiClass cls = (PsiClass) parent;
|
||||
PsiIdentifier id = cls.getNameIdentifier();
|
||||
return id != null && id.equals(element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(
|
||||
@NotNull Project project, Editor editor, @NotNull PsiElement element)
|
||||
throws IncorrectOperationException {
|
||||
PsiElement parent = element.getParent();
|
||||
if (!(parent instanceof PsiClass)) {
|
||||
return;
|
||||
}
|
||||
PsiClass cls = (PsiClass) parent;
|
||||
int r =
|
||||
Messages.showYesNoDialog(
|
||||
project,
|
||||
"是否根据当前类「" + cls.getName() + "」生成带默认值的 JSON?",
|
||||
"生成 JSON",
|
||||
Messages.getQuestionIcon());
|
||||
if (r != Messages.YES) {
|
||||
return;
|
||||
}
|
||||
String json = JavaClassToJsonBuilder.buildPrettyJson(cls);
|
||||
new ShowJsonResultDialog(project, "JSON — " + cls.getName(), json).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean startInWriteAction() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.huangzj.protoplugin.json;
|
||||
|
||||
import com.intellij.openapi.actionSystem.ActionPlaces;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiJavaFile;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/** 编辑器右键:对光标所在类生成默认 JSON(与意图行为一致)。 */
|
||||
public final class GenerateClassJsonEditorAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void update(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
PsiFile file = e.getData(CommonDataKeys.PSI_FILE);
|
||||
Editor editor = e.getData(CommonDataKeys.EDITOR);
|
||||
boolean javaFile = file instanceof PsiJavaFile && editor != null;
|
||||
PsiClass cls = null;
|
||||
if (javaFile) {
|
||||
int off = editor.getCaretModel().getOffset();
|
||||
PsiElement at = file.findElementAt(off);
|
||||
cls = PsiTreeUtil.getParentOfType(at, PsiClass.class);
|
||||
}
|
||||
boolean ok = project != null && cls != null;
|
||||
String place = e.getPlace();
|
||||
if (ActionPlaces.isPopupPlace(place)) {
|
||||
e.getPresentation().setEnabledAndVisible(ok);
|
||||
} else {
|
||||
e.getPresentation().setVisible(true);
|
||||
e.getPresentation().setEnabled(ok);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
PsiFile file = e.getData(CommonDataKeys.PSI_FILE);
|
||||
Editor editor = e.getData(CommonDataKeys.EDITOR);
|
||||
if (project == null || !(file instanceof PsiJavaFile) || editor == null) {
|
||||
return;
|
||||
}
|
||||
int off = editor.getCaretModel().getOffset();
|
||||
PsiElement at = file.findElementAt(off);
|
||||
PsiClass cls = PsiTreeUtil.getParentOfType(at, PsiClass.class);
|
||||
if (cls == null) {
|
||||
return;
|
||||
}
|
||||
int r =
|
||||
Messages.showYesNoDialog(
|
||||
project,
|
||||
"是否根据当前类「" + cls.getName() + "」生成带默认值的 JSON?",
|
||||
"生成 JSON",
|
||||
Messages.getQuestionIcon());
|
||||
if (r != Messages.YES) {
|
||||
return;
|
||||
}
|
||||
String json = JavaClassToJsonBuilder.buildPrettyJson(cls);
|
||||
new ShowJsonResultDialog(project, "JSON — " + cls.getName(), json).show();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
package com.huangzj.protoplugin.json;
|
||||
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonNull;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
import com.intellij.psi.PsiArrayType;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiClassType;
|
||||
import com.intellij.psi.PsiEnumConstant;
|
||||
import com.intellij.psi.PsiField;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import com.intellij.psi.PsiPrimitiveType;
|
||||
import com.intellij.psi.PsiType;
|
||||
import com.intellij.psi.PsiTypes;
|
||||
import com.intellij.psi.PsiWildcardType;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/** 根据 {@link PsiClass} 生成带类型默认值的 JSON 文本。 */
|
||||
public final class JavaClassToJsonBuilder {
|
||||
|
||||
private JavaClassToJsonBuilder() {}
|
||||
|
||||
public static String buildPrettyJson(PsiClass psiClass) {
|
||||
JsonObject root = new JsonObject();
|
||||
for (PsiField field : psiClass.getAllFields()) {
|
||||
if (field.hasModifierProperty(PsiModifier.STATIC)) {
|
||||
continue;
|
||||
}
|
||||
if (field instanceof PsiEnumConstant) {
|
||||
continue;
|
||||
}
|
||||
if ("serialVersionUID".equals(field.getName())) {
|
||||
continue;
|
||||
}
|
||||
JsonElement value =
|
||||
typeToDefaultJson(field.getType(), new HashSet<>(), psiClass);
|
||||
root.add(field.getName(), value);
|
||||
}
|
||||
return new GsonBuilder().setPrettyPrinting().serializeNulls().create().toJson(root);
|
||||
}
|
||||
|
||||
private static JsonElement typeToDefaultJson(
|
||||
PsiType type, Set<String> visitingQualifiedNames, @Nullable PsiClass contextClass) {
|
||||
if (type == null) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
if (type instanceof PsiWildcardType) {
|
||||
PsiType bound = ((PsiWildcardType) type).getExtendsBound();
|
||||
if (bound != null) {
|
||||
return typeToDefaultJson(bound, visitingQualifiedNames, contextClass);
|
||||
}
|
||||
PsiType superBound = ((PsiWildcardType) type).getSuperBound();
|
||||
if (superBound != null) {
|
||||
return typeToDefaultJson(superBound, visitingQualifiedNames, contextClass);
|
||||
}
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
if (type instanceof PsiArrayType) {
|
||||
return new JsonArray();
|
||||
}
|
||||
if (type instanceof PsiPrimitiveType) {
|
||||
return primitiveDefault((PsiPrimitiveType) type);
|
||||
}
|
||||
if (!(type instanceof PsiClassType)) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
PsiClassType classType = (PsiClassType) type;
|
||||
PsiClass resolved = classType.resolve();
|
||||
if (resolved == null) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
String qn = resolved.getQualifiedName();
|
||||
if (qn != null && qn.equals("java.lang.Object")) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
if (resolved.isEnum()) {
|
||||
for (PsiField f : resolved.getFields()) {
|
||||
if (f instanceof PsiEnumConstant) {
|
||||
return new JsonPrimitive(f.getName());
|
||||
}
|
||||
}
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
if (qn != null && qn.startsWith("java.")) {
|
||||
return javaLangDefault(classType, resolved, visitingQualifiedNames, contextClass);
|
||||
}
|
||||
if (InheritanceUtil.isInheritor(resolved, "java.util.Collection")) {
|
||||
return new JsonArray();
|
||||
}
|
||||
if (InheritanceUtil.isInheritor(resolved, "java.util.Map")) {
|
||||
return new JsonObject();
|
||||
}
|
||||
if (qn == null) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
if (visitingQualifiedNames.contains(qn)) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
visitingQualifiedNames.add(qn);
|
||||
try {
|
||||
JsonObject obj = new JsonObject();
|
||||
for (PsiField field : resolved.getAllFields()) {
|
||||
if (field.hasModifierProperty(PsiModifier.STATIC)) {
|
||||
continue;
|
||||
}
|
||||
if (field instanceof PsiEnumConstant) {
|
||||
continue;
|
||||
}
|
||||
if ("serialVersionUID".equals(field.getName())) {
|
||||
continue;
|
||||
}
|
||||
obj.add(
|
||||
field.getName(),
|
||||
typeToDefaultJson(field.getType(), visitingQualifiedNames, resolved));
|
||||
}
|
||||
return obj;
|
||||
} finally {
|
||||
visitingQualifiedNames.remove(qn);
|
||||
}
|
||||
}
|
||||
|
||||
private static JsonElement primitiveDefault(PsiPrimitiveType p) {
|
||||
if (p.equals(PsiTypes.booleanType())) {
|
||||
return new JsonPrimitive(false);
|
||||
}
|
||||
if (p.equals(PsiTypes.charType())) {
|
||||
return new JsonPrimitive("\u0000");
|
||||
}
|
||||
if (p.equals(PsiTypes.floatType()) || p.equals(PsiTypes.doubleType())) {
|
||||
return new JsonPrimitive(0.0);
|
||||
}
|
||||
if (p.equals(PsiTypes.longType())) {
|
||||
return new JsonPrimitive(0L);
|
||||
}
|
||||
if (p.equals(PsiTypes.intType())
|
||||
|| p.equals(PsiTypes.shortType())
|
||||
|| p.equals(PsiTypes.byteType())) {
|
||||
return new JsonPrimitive(0);
|
||||
}
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
|
||||
private static JsonElement javaLangDefault(
|
||||
PsiClassType classType,
|
||||
PsiClass resolved,
|
||||
Set<String> visitingQualifiedNames,
|
||||
@Nullable PsiClass contextClass) {
|
||||
String qn = resolved.getQualifiedName();
|
||||
if (qn == null) {
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
switch (qn) {
|
||||
case "java.lang.String":
|
||||
return new JsonPrimitive("");
|
||||
case "java.lang.Boolean":
|
||||
return new JsonPrimitive(false);
|
||||
case "java.lang.Character":
|
||||
return new JsonPrimitive("\u0000");
|
||||
case "java.lang.Byte":
|
||||
case "java.lang.Short":
|
||||
case "java.lang.Integer":
|
||||
return new JsonPrimitive(0);
|
||||
case "java.lang.Long":
|
||||
return new JsonPrimitive(0L);
|
||||
case "java.lang.Float":
|
||||
case "java.lang.Double":
|
||||
return new JsonPrimitive(0.0);
|
||||
case "java.math.BigDecimal":
|
||||
case "java.math.BigInteger":
|
||||
return new JsonPrimitive("0");
|
||||
case "java.util.UUID":
|
||||
return new JsonPrimitive("00000000-0000-0000-0000-000000000000");
|
||||
case "java.util.Optional":
|
||||
{
|
||||
PsiType[] p = classType.getParameters();
|
||||
if (p.length == 1) {
|
||||
return typeToDefaultJson(p[0], visitingQualifiedNames, contextClass);
|
||||
}
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
default:
|
||||
if (InheritanceUtil.isInheritor(resolved, "java.util.Collection")) {
|
||||
return new JsonArray();
|
||||
}
|
||||
if (InheritanceUtil.isInheritor(resolved, "java.util.Map")) {
|
||||
return new JsonObject();
|
||||
}
|
||||
if (qn.startsWith("java.time.")
|
||||
|| "java.util.Date".equals(qn)
|
||||
|| "java.util.Calendar".equals(qn)) {
|
||||
return new JsonPrimitive("");
|
||||
}
|
||||
if (Number.class.getName().equals(qn)) {
|
||||
return new JsonPrimitive(0);
|
||||
}
|
||||
return JsonNull.INSTANCE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package com.huangzj.protoplugin.json;
|
||||
|
||||
import com.intellij.openapi.actionSystem.ActionPlaces;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/** 在目录上打开「Json 转 Java」对话框。 */
|
||||
public final class JsonToJavaAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void update(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE);
|
||||
boolean dir = vf != null && vf.isDirectory();
|
||||
String place = e.getPlace();
|
||||
if (ActionPlaces.isPopupPlace(place)) {
|
||||
e.getPresentation().setEnabledAndVisible(dir);
|
||||
} else {
|
||||
e.getPresentation().setVisible(true);
|
||||
e.getPresentation().setEnabled(project != null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
if (project == null) {
|
||||
return;
|
||||
}
|
||||
VirtualFile vf = e.getData(CommonDataKeys.VIRTUAL_FILE);
|
||||
VirtualFile folder = vf != null && vf.isDirectory() ? vf : null;
|
||||
new JsonToJavaDialog(project, folder).showAndGet();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,158 @@
|
||||
package com.huangzj.protoplugin.json;
|
||||
|
||||
import com.intellij.lang.java.JavaLanguage;
|
||||
import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiFileFactory;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.huangzj.protoplugin.PackageInference;
|
||||
import com.intellij.ui.components.JBLabel;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import com.intellij.ui.components.JBTextArea;
|
||||
import com.intellij.util.ui.JBUI;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/** 输入 JSON 与类名,在选中目录生成 Java 源文件。 */
|
||||
public final class JsonToJavaDialog extends DialogWrapper {
|
||||
|
||||
private final Project project;
|
||||
private final @Nullable VirtualFile folder;
|
||||
private final JBTextArea jsonArea;
|
||||
private final JTextField classNameField;
|
||||
private final JTextField packageField;
|
||||
|
||||
public JsonToJavaDialog(Project project, @Nullable VirtualFile folder) {
|
||||
super(project);
|
||||
this.project = project;
|
||||
this.folder = folder;
|
||||
setTitle("Json 转 Java");
|
||||
jsonArea = new JBTextArea(12, 48);
|
||||
jsonArea.setLineWrap(true);
|
||||
jsonArea.setWrapStyleWord(true);
|
||||
classNameField = new JTextField(32);
|
||||
String pkg = PackageInference.inferPackage(folder);
|
||||
packageField = new JTextField(pkg, 32);
|
||||
init();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @Nullable JComponent createCenterPanel() {
|
||||
JPanel root = new JPanel(new GridBagLayout());
|
||||
root.setBorder(JBUI.Borders.empty(8));
|
||||
GridBagConstraints gc = new GridBagConstraints();
|
||||
gc.insets = JBUI.insets(4);
|
||||
gc.anchor = GridBagConstraints.WEST;
|
||||
gc.fill = GridBagConstraints.HORIZONTAL;
|
||||
gc.gridx = 0;
|
||||
gc.gridy = 0;
|
||||
root.add(new JBLabel("Java 类名(不含 .java):"), gc);
|
||||
gc.gridx = 1;
|
||||
gc.weightx = 1.0;
|
||||
root.add(classNameField, gc);
|
||||
gc.gridy++;
|
||||
gc.gridx = 0;
|
||||
gc.weightx = 0;
|
||||
root.add(new JBLabel("包名:"), gc);
|
||||
gc.gridx = 1;
|
||||
gc.weightx = 1.0;
|
||||
root.add(packageField, gc);
|
||||
gc.gridy++;
|
||||
gc.gridx = 0;
|
||||
gc.gridwidth = 2;
|
||||
gc.weightx = 1.0;
|
||||
gc.weighty = 0;
|
||||
root.add(new JBLabel("JSON(根须为对象 {}):"), gc);
|
||||
gc.gridy++;
|
||||
gc.fill = GridBagConstraints.BOTH;
|
||||
gc.weighty = 1.0;
|
||||
JBScrollPane scroll = new JBScrollPane(jsonArea);
|
||||
scroll.setPreferredSize(new Dimension(480, 220));
|
||||
root.add(scroll, gc);
|
||||
return root;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doOKAction() {
|
||||
String rawName = classNameField.getText().trim();
|
||||
if (rawName.isEmpty()) {
|
||||
Messages.showWarningDialog(project, "请填写类名。", "Json 转 Java");
|
||||
return;
|
||||
}
|
||||
if (!isValidJavaIdentifier(rawName)) {
|
||||
Messages.showWarningDialog(project, "类名不是合法 Java 标识符。", "Json 转 Java");
|
||||
return;
|
||||
}
|
||||
String json = jsonArea.getText().trim();
|
||||
if (json.isEmpty()) {
|
||||
Messages.showWarningDialog(project, "请填写 JSON。", "Json 转 Java");
|
||||
return;
|
||||
}
|
||||
if (folder == null || !folder.isDirectory()) {
|
||||
Messages.showWarningDialog(project, "请在项目树中选择输出目录。", "Json 转 Java");
|
||||
return;
|
||||
}
|
||||
String pkg = packageField.getText().trim();
|
||||
String src;
|
||||
try {
|
||||
src = JsonToJavaGenerator.generate(json, rawName, pkg);
|
||||
} catch (Exception ex) {
|
||||
Messages.showErrorDialog(project, ex.getMessage(), "JSON 解析失败");
|
||||
return;
|
||||
}
|
||||
String fileName = rawName.endsWith(".java") ? rawName : rawName + ".java";
|
||||
int[] created = {0};
|
||||
int[] skipped = {0};
|
||||
WriteCommandAction.runWriteCommandAction(
|
||||
project,
|
||||
() -> {
|
||||
PsiDirectory psiDir = PsiManager.getInstance(project).findDirectory(folder);
|
||||
if (psiDir == null) {
|
||||
return;
|
||||
}
|
||||
if (psiDir.findFile(fileName) != null) {
|
||||
skipped[0]++;
|
||||
return;
|
||||
}
|
||||
PsiFileFactory factory = PsiFileFactory.getInstance(project);
|
||||
PsiFile psiFile =
|
||||
factory.createFileFromText(fileName, JavaLanguage.INSTANCE, src);
|
||||
psiDir.add(psiFile);
|
||||
created[0]++;
|
||||
});
|
||||
if (skipped[0] > 0) {
|
||||
Messages.showWarningDialog(
|
||||
project, "文件已存在,未覆盖: " + fileName, "Json 转 Java");
|
||||
return;
|
||||
}
|
||||
if (created[0] > 0) {
|
||||
Messages.showInfoMessage(project, "已生成: " + fileName, "Json 转 Java");
|
||||
}
|
||||
super.doOKAction();
|
||||
}
|
||||
|
||||
private static boolean isValidJavaIdentifier(String name) {
|
||||
if (name.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
if (!Character.isJavaIdentifierStart(name.charAt(0))) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 1; i < name.length(); i++) {
|
||||
if (!Character.isJavaIdentifierPart(name.charAt(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
package com.huangzj.protoplugin.json;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonPrimitive;
|
||||
import com.huangzj.protoplugin.mysql.JavaNames;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/** 将 JSON 对象推断为简单 Java Bean(含静态内部类与 {@link List} 字段)。 */
|
||||
public final class JsonToJavaGenerator {
|
||||
|
||||
private JsonToJavaGenerator() {}
|
||||
|
||||
public static String generate(String json, String rootClassName, String packageName)
|
||||
throws JsonParseException {
|
||||
JsonElement root = JsonParser.parseString(json);
|
||||
if (!root.isJsonObject()) {
|
||||
throw new JsonParseException("根节点必须是 JSON 对象 {}");
|
||||
}
|
||||
NameAllocator names = new NameAllocator();
|
||||
String safeRoot = names.unique(safeClassName(rootClassName));
|
||||
ClassModel model = buildClassModel(root.getAsJsonObject(), safeRoot, names);
|
||||
return render(model, packageName);
|
||||
}
|
||||
|
||||
private static String safeClassName(String raw) {
|
||||
if (raw == null || raw.isBlank()) {
|
||||
return "Generated";
|
||||
}
|
||||
String t = raw.trim();
|
||||
if (!Character.isJavaIdentifierStart(t.charAt(0))) {
|
||||
return "Generated";
|
||||
}
|
||||
for (int i = 1; i < t.length(); i++) {
|
||||
if (!Character.isJavaIdentifierPart(t.charAt(i))) {
|
||||
return "Generated";
|
||||
}
|
||||
}
|
||||
return t.substring(0, 1).toUpperCase(Locale.ROOT) + t.substring(1);
|
||||
}
|
||||
|
||||
private static ClassModel buildClassModel(JsonObject obj, String className, NameAllocator names) {
|
||||
ClassModel m = new ClassModel(className);
|
||||
for (Map.Entry<String, JsonElement> e : obj.entrySet()) {
|
||||
String key = e.getKey();
|
||||
String field = JavaNames.toFieldName(key);
|
||||
TypeRef tr = inferType(e.getValue(), key, names);
|
||||
m.fields.add(new FieldModel(field, tr.typeName, tr.comment));
|
||||
m.innerClasses.addAll(tr.newInners);
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
private static TypeRef inferType(JsonElement el, String keyHint, NameAllocator names) {
|
||||
List<ClassModel> inners = new ArrayList<>();
|
||||
if (el == null || el.isJsonNull()) {
|
||||
return new TypeRef("Object", " // JSON null,类型需手动调整", inners);
|
||||
}
|
||||
if (el.isJsonPrimitive()) {
|
||||
return new TypeRef(primitiveJavaType(el.getAsJsonPrimitive()), "", inners);
|
||||
}
|
||||
if (el.isJsonArray()) {
|
||||
JsonArray arr = el.getAsJsonArray();
|
||||
if (arr.size() == 0) {
|
||||
return new TypeRef("java.util.List<Object>", "", inners);
|
||||
}
|
||||
JsonElement first = arr.get(0);
|
||||
TypeRef elem = inferType(first, keyHint, names);
|
||||
inners.addAll(elem.newInners);
|
||||
return new TypeRef("java.util.List<" + elem.typeName + ">", "", inners);
|
||||
}
|
||||
if (el.isJsonObject()) {
|
||||
String inner =
|
||||
names.unique(JavaNames.toPascalCaseField(keyHint) + "Model");
|
||||
ClassModel nested = buildClassModel(el.getAsJsonObject(), inner, names);
|
||||
inners.add(nested);
|
||||
return new TypeRef(inner, "", inners);
|
||||
}
|
||||
return new TypeRef("Object", "", inners);
|
||||
}
|
||||
|
||||
private static String primitiveJavaType(JsonPrimitive p) {
|
||||
if (p.isBoolean()) {
|
||||
return "boolean";
|
||||
}
|
||||
if (p.isString()) {
|
||||
return "String";
|
||||
}
|
||||
if (p.isNumber()) {
|
||||
try {
|
||||
BigDecimal bd = p.getAsBigDecimal();
|
||||
if (bd.scale() <= 0) {
|
||||
try {
|
||||
long v = bd.longValueExact();
|
||||
if (v >= Integer.MIN_VALUE && v <= Integer.MAX_VALUE) {
|
||||
return "int";
|
||||
}
|
||||
return "long";
|
||||
} catch (ArithmeticException ex) {
|
||||
return "java.math.BigInteger";
|
||||
}
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
return "double";
|
||||
}
|
||||
return "String";
|
||||
}
|
||||
|
||||
private static String render(ClassModel root, String packageName) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (packageName != null && !packageName.isBlank()) {
|
||||
sb.append("package ").append(packageName.trim()).append(";\n\n");
|
||||
}
|
||||
if (needsListImport(root)) {
|
||||
sb.append("import java.util.List;\n\n");
|
||||
}
|
||||
emitClass(sb, root, 0);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static boolean needsListImport(ClassModel m) {
|
||||
for (FieldModel f : m.fields) {
|
||||
if (f.type.startsWith("java.util.List")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
for (ClassModel inner : m.innerClasses) {
|
||||
if (needsListImport(inner)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void emitClass(StringBuilder sb, ClassModel m, int indent) {
|
||||
String pad = " ".repeat(indent);
|
||||
sb.append(pad).append("public ");
|
||||
if (indent > 0) {
|
||||
sb.append("static ");
|
||||
}
|
||||
sb.append("class ").append(m.name).append(" {\n");
|
||||
for (FieldModel f : m.fields) {
|
||||
sb.append(pad)
|
||||
.append(" private ")
|
||||
.append(f.type)
|
||||
.append(" ")
|
||||
.append(f.name)
|
||||
.append(";")
|
||||
.append(f.comment)
|
||||
.append("\n");
|
||||
}
|
||||
if (!m.fields.isEmpty()) {
|
||||
sb.append("\n");
|
||||
}
|
||||
for (FieldModel f : m.fields) {
|
||||
String cap = capitalize(f.name);
|
||||
sb.append(pad).append(" public ").append(f.type).append(" get").append(cap).append("() {\n");
|
||||
sb.append(pad).append(" return ").append(f.name).append(";\n");
|
||||
sb.append(pad).append(" }\n\n");
|
||||
sb.append(pad)
|
||||
.append(" public void set")
|
||||
.append(cap)
|
||||
.append("(")
|
||||
.append(f.type)
|
||||
.append(" ")
|
||||
.append(f.name)
|
||||
.append(") {\n");
|
||||
sb.append(pad).append(" this.").append(f.name).append(" = ").append(f.name).append(";\n");
|
||||
sb.append(pad).append(" }\n\n");
|
||||
}
|
||||
TreeMap<String, ClassModel> innerByName = new TreeMap<>();
|
||||
for (ClassModel c : m.innerClasses) {
|
||||
innerByName.put(c.name, c);
|
||||
}
|
||||
for (ClassModel inner : innerByName.values()) {
|
||||
sb.append("\n");
|
||||
emitClass(sb, inner, indent + 1);
|
||||
}
|
||||
sb.append(pad).append("}\n");
|
||||
}
|
||||
|
||||
private static String capitalize(String s) {
|
||||
if (s == null || s.isEmpty()) {
|
||||
return s;
|
||||
}
|
||||
return Character.toUpperCase(s.charAt(0)) + s.substring(1);
|
||||
}
|
||||
|
||||
private static final class NameAllocator {
|
||||
private final Set<String> used = new HashSet<>();
|
||||
|
||||
String unique(String base) {
|
||||
String b = base == null || base.isEmpty() ? "Nested" : base;
|
||||
int i = 0;
|
||||
String c = b;
|
||||
while (used.contains(c)) {
|
||||
c = b + (++i);
|
||||
}
|
||||
used.add(c);
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
private static final class TypeRef {
|
||||
final String typeName;
|
||||
final String comment;
|
||||
final List<ClassModel> newInners;
|
||||
|
||||
TypeRef(String typeName, String comment, List<ClassModel> newInners) {
|
||||
this.typeName = typeName;
|
||||
this.comment = comment;
|
||||
this.newInners = newInners;
|
||||
}
|
||||
}
|
||||
|
||||
private static final class FieldModel {
|
||||
final String name;
|
||||
final String type;
|
||||
final String comment;
|
||||
|
||||
FieldModel(String name, String type, String comment) {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
this.comment = comment == null ? "" : comment;
|
||||
}
|
||||
}
|
||||
|
||||
private static final class ClassModel {
|
||||
final String name;
|
||||
final List<FieldModel> fields = new ArrayList<>();
|
||||
final List<ClassModel> innerClasses = new ArrayList<>();
|
||||
|
||||
ClassModel(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.huangzj.protoplugin.json;
|
||||
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import com.intellij.ui.components.JBTextArea;
|
||||
import com.intellij.util.ui.JBUI;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JPanel;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/** 展示 JSON 文本并支持一键复制。 */
|
||||
public final class ShowJsonResultDialog extends DialogWrapper {
|
||||
|
||||
private final JBTextArea textArea;
|
||||
|
||||
public ShowJsonResultDialog(Project project, String title, String json) {
|
||||
super(project);
|
||||
setTitle(title);
|
||||
textArea = new JBTextArea(json);
|
||||
textArea.setEditable(false);
|
||||
textArea.setCaretPosition(0);
|
||||
init();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @Nullable JComponent createCenterPanel() {
|
||||
JPanel panel = new JPanel(new BorderLayout());
|
||||
JBScrollPane scroll = new JBScrollPane(textArea);
|
||||
scroll.setPreferredSize(new Dimension(560, 360));
|
||||
panel.add(scroll, BorderLayout.CENTER);
|
||||
JPanel south = new JPanel(new FlowLayout(FlowLayout.LEFT));
|
||||
JButton copy = new JButton("复制到剪贴板");
|
||||
copy.addActionListener(
|
||||
e ->
|
||||
Toolkit.getDefaultToolkit()
|
||||
.getSystemClipboard()
|
||||
.setContents(new StringSelection(textArea.getText()), null));
|
||||
south.add(copy);
|
||||
panel.add(south, BorderLayout.SOUTH);
|
||||
panel.setBorder(JBUI.Borders.empty(8));
|
||||
return panel;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Action @Nullable [] createActions() {
|
||||
return new Action[] {getOKAction()};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.huangzj.protoplugin.memo;
|
||||
|
||||
/** 备忘录条目(字段需可被持久化组件序列化)。 */
|
||||
public class MemoItem {
|
||||
|
||||
public String id = "";
|
||||
public String title = "";
|
||||
public String content = "";
|
||||
public long updated = 0L;
|
||||
|
||||
public MemoItem() {}
|
||||
|
||||
public MemoItem(String id, String title, String content, long updated) {
|
||||
this.id = id;
|
||||
this.title = title;
|
||||
this.content = content;
|
||||
this.updated = updated;
|
||||
}
|
||||
|
||||
public String displayTitle() {
|
||||
if (title != null && !title.trim().isEmpty()) {
|
||||
return title.trim();
|
||||
}
|
||||
return "(无标题)";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,465 @@
|
||||
package com.huangzj.protoplugin.memo;
|
||||
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.ui.components.JBList;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import com.intellij.ui.components.JBTextArea;
|
||||
import com.intellij.ui.components.JBTextField;
|
||||
import com.intellij.util.ui.JBUI;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Font;
|
||||
import java.util.List;
|
||||
import javax.swing.DefaultListCellRenderer;
|
||||
import javax.swing.DefaultListModel;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingConstants;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.border.LineBorder;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public final class MemoPanel extends JPanel {
|
||||
|
||||
private final Project project;
|
||||
private final DefaultListModel<MemoItem> listModel = new DefaultListModel<>();
|
||||
private final JBList<MemoItem> list = new JBList<>(listModel);
|
||||
private final JBTextField titleField = new JBTextField();
|
||||
private final JBTextArea contentArea = new JBTextArea();
|
||||
private final JButton saveBtn = new JButton("保存");
|
||||
private final JButton newBtn = new JButton("新建");
|
||||
private final JButton deleteBtn = new JButton("删除");
|
||||
private final JLabel themeChooserLabel = new JLabel("界面风格");
|
||||
private final JComboBox<MemoUiTheme> themeCombo = new JComboBox<>(MemoUiTheme.values());
|
||||
private final JLabel titleLabel = new JLabel("标题");
|
||||
private final JLabel contentLabel = new JLabel("内容");
|
||||
private final JLabel flairLabel = new JLabel(" ", SwingConstants.CENTER);
|
||||
private final JPanel toolbar = new JPanel(new BorderLayout(8, 0));
|
||||
private final JPanel leftButtonBar = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 0));
|
||||
private final JPanel themeChooserBar = new JPanel(new FlowLayout(FlowLayout.RIGHT, 8, 0));
|
||||
private final JPanel topStack = new JPanel(new BorderLayout());
|
||||
private final JSplitPane split;
|
||||
private final JBScrollPane listScroll;
|
||||
private final JBScrollPane contentScroll;
|
||||
private final JPanel titleBlock = new JPanel(new BorderLayout(4, 4));
|
||||
private final JPanel contentBlock = new JPanel(new BorderLayout(4, 4));
|
||||
private final JPanel right = new JPanel(new BorderLayout(8, 8));
|
||||
|
||||
private boolean loadingSelection;
|
||||
private boolean themeComboSuppress;
|
||||
private MemoUiTheme currentTheme = MemoUiTheme.IDE_DEFAULT;
|
||||
private final Font defaultLabelFont;
|
||||
|
||||
public MemoPanel(@NotNull Project project) {
|
||||
super(new BorderLayout(8, 8));
|
||||
this.project = project;
|
||||
defaultLabelFont = titleLabel.getFont();
|
||||
setBorder(JBUI.Borders.empty(8));
|
||||
|
||||
leftButtonBar.setOpaque(false);
|
||||
leftButtonBar.add(newBtn);
|
||||
leftButtonBar.add(saveBtn);
|
||||
leftButtonBar.add(deleteBtn);
|
||||
|
||||
themeChooserBar.setOpaque(false);
|
||||
themeChooserBar.add(themeChooserLabel);
|
||||
themeChooserBar.add(themeCombo);
|
||||
|
||||
toolbar.setOpaque(false);
|
||||
toolbar.add(leftButtonBar, BorderLayout.WEST);
|
||||
toolbar.add(themeChooserBar, BorderLayout.EAST);
|
||||
|
||||
flairLabel.setOpaque(true);
|
||||
flairLabel.setFont(flairLabel.getFont().deriveFont(Font.PLAIN, 12f));
|
||||
|
||||
topStack.setOpaque(false);
|
||||
topStack.add(flairLabel, BorderLayout.NORTH);
|
||||
topStack.add(toolbar, BorderLayout.CENTER);
|
||||
add(topStack, BorderLayout.NORTH);
|
||||
|
||||
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
installListRenderer();
|
||||
|
||||
listScroll = new JBScrollPane(list);
|
||||
listScroll.setPreferredSize(new Dimension(200, 300));
|
||||
|
||||
contentArea.setLineWrap(true);
|
||||
contentArea.setWrapStyleWord(true);
|
||||
contentScroll = new JBScrollPane(contentArea);
|
||||
|
||||
titleBlock.setOpaque(false);
|
||||
titleBlock.add(titleLabel, BorderLayout.NORTH);
|
||||
titleBlock.add(titleField, BorderLayout.CENTER);
|
||||
|
||||
contentBlock.setOpaque(false);
|
||||
contentBlock.add(contentLabel, BorderLayout.NORTH);
|
||||
contentBlock.add(contentScroll, BorderLayout.CENTER);
|
||||
|
||||
right.setOpaque(false);
|
||||
right.add(titleBlock, BorderLayout.NORTH);
|
||||
right.add(contentBlock, BorderLayout.CENTER);
|
||||
titleField.setPreferredSize(new Dimension(200, 28));
|
||||
|
||||
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, listScroll, right);
|
||||
split.setResizeWeight(0.28);
|
||||
split.setOpaque(false);
|
||||
add(split, BorderLayout.CENTER);
|
||||
|
||||
MemoUiTheme initial = MemoProjectService.getInstance(project).getMemoTheme();
|
||||
themeComboSuppress = true;
|
||||
themeCombo.setSelectedItem(initial);
|
||||
themeComboSuppress = false;
|
||||
applyTheme(initial);
|
||||
|
||||
themeCombo.addActionListener(
|
||||
e -> {
|
||||
if (themeComboSuppress) {
|
||||
return;
|
||||
}
|
||||
MemoUiTheme t = (MemoUiTheme) themeCombo.getSelectedItem();
|
||||
if (t != null) {
|
||||
MemoProjectService.getInstance(project).setMemoTheme(t);
|
||||
applyTheme(t);
|
||||
}
|
||||
});
|
||||
|
||||
reloadListModel();
|
||||
|
||||
list.addListSelectionListener(
|
||||
new ListSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
if (e.getValueIsAdjusting()) {
|
||||
return;
|
||||
}
|
||||
loadSelectedIntoEditor();
|
||||
}
|
||||
});
|
||||
|
||||
newBtn.addActionListener(e -> createMemo());
|
||||
saveBtn.addActionListener(e -> saveCurrent());
|
||||
deleteBtn.addActionListener(e -> deleteCurrent());
|
||||
|
||||
titleField
|
||||
.getDocument()
|
||||
.addDocumentListener(
|
||||
new javax.swing.event.DocumentListener() {
|
||||
@Override
|
||||
public void insertUpdate(javax.swing.event.DocumentEvent e) {
|
||||
refreshSelectedTitleInList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUpdate(javax.swing.event.DocumentEvent e) {
|
||||
refreshSelectedTitleInList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changedUpdate(javax.swing.event.DocumentEvent e) {
|
||||
refreshSelectedTitleInList();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void installListRenderer() {
|
||||
list.setCellRenderer(
|
||||
new DefaultListCellRenderer() {
|
||||
@Override
|
||||
public Component getListCellRendererComponent(
|
||||
JList<?> jList,
|
||||
Object value,
|
||||
int index,
|
||||
boolean isSelected,
|
||||
boolean cellHasFocus) {
|
||||
super.getListCellRendererComponent(
|
||||
jList, value, index, isSelected, cellHasFocus);
|
||||
if (value instanceof MemoItem) {
|
||||
setText(((MemoItem) value).displayTitle());
|
||||
}
|
||||
if (currentTheme != MemoUiTheme.IDE_DEFAULT) {
|
||||
MemoThemeSpec spec = MemoThemeSpec.forTheme(currentTheme);
|
||||
setOpaque(true);
|
||||
if (isSelected) {
|
||||
setBackground(spec.listSelectedBg);
|
||||
setForeground(spec.listSelectedFg);
|
||||
} else {
|
||||
setBackground(spec.listBg);
|
||||
setForeground(spec.text);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void applyTheme(@NotNull MemoUiTheme theme) {
|
||||
currentTheme = theme;
|
||||
installListRenderer();
|
||||
list.repaint();
|
||||
|
||||
if (theme == MemoUiTheme.IDE_DEFAULT) {
|
||||
applyIdeTheme();
|
||||
return;
|
||||
}
|
||||
|
||||
MemoThemeSpec spec = MemoThemeSpec.forTheme(theme);
|
||||
Border softField =
|
||||
JBUI.Borders.compound(
|
||||
new LineBorder(spec.fieldBorder, 1, true),
|
||||
JBUI.Borders.empty(4, 6));
|
||||
|
||||
Color panelBg = spec.panelBg;
|
||||
setBackground(panelBg);
|
||||
topStack.setOpaque(true);
|
||||
topStack.setBackground(panelBg);
|
||||
toolbar.setBackground(panelBg);
|
||||
toolbar.setOpaque(true);
|
||||
leftButtonBar.setOpaque(true);
|
||||
leftButtonBar.setBackground(panelBg);
|
||||
themeChooserBar.setOpaque(true);
|
||||
themeChooserBar.setBackground(panelBg);
|
||||
themeChooserLabel.setForeground(spec.text);
|
||||
flairLabel.setBackground(panelBg);
|
||||
flairLabel.setForeground(spec.text);
|
||||
split.setBackground(panelBg);
|
||||
listScroll.setBackground(panelBg);
|
||||
listScroll.getViewport().setBackground(spec.listBg);
|
||||
list.setBackground(spec.listBg);
|
||||
list.setForeground(spec.text);
|
||||
right.setBackground(panelBg);
|
||||
titleBlock.setBackground(panelBg);
|
||||
contentBlock.setBackground(panelBg);
|
||||
titleLabel.setForeground(spec.text);
|
||||
contentLabel.setForeground(spec.text);
|
||||
|
||||
if (theme == MemoUiTheme.CUTE_CANDY) {
|
||||
flairLabel.setVisible(true);
|
||||
flairLabel.setText("✨ 今天也要甜甜哒~ 选一条备忘,把想法留下来吧 💕");
|
||||
titleLabel.setText("📝 标题");
|
||||
contentLabel.setText("💗 正文");
|
||||
titleLabel.setFont(defaultLabelFont.deriveFont(Font.BOLD, defaultLabelFont.getSize() + 1f));
|
||||
contentLabel.setFont(
|
||||
defaultLabelFont.deriveFont(Font.BOLD, defaultLabelFont.getSize() + 1f));
|
||||
} else {
|
||||
flairLabel.setVisible(false);
|
||||
flairLabel.setText(" ");
|
||||
titleLabel.setText("标题");
|
||||
contentLabel.setText("内容");
|
||||
titleLabel.setFont(defaultLabelFont);
|
||||
contentLabel.setFont(defaultLabelFont);
|
||||
}
|
||||
|
||||
styleTextField(titleField, spec, softField);
|
||||
styleTextArea(contentArea, contentScroll, spec, softField);
|
||||
|
||||
styleAccentButton(newBtn, spec);
|
||||
styleAccentButton(saveBtn, spec);
|
||||
styleAccentButton(deleteBtn, spec);
|
||||
|
||||
themeCombo.setBackground(spec.editorBg);
|
||||
themeCombo.setForeground(spec.text);
|
||||
|
||||
revalidate();
|
||||
repaint();
|
||||
}
|
||||
|
||||
private void applyIdeTheme() {
|
||||
Color panelBg = UIUtil.getPanelBackground();
|
||||
Color editorBg = UIUtil.getTextFieldBackground();
|
||||
Color fg = UIUtil.getTextFieldForeground();
|
||||
Color listBg = UIUtil.getListBackground();
|
||||
|
||||
setBackground(panelBg);
|
||||
topStack.setOpaque(false);
|
||||
topStack.setBackground(panelBg);
|
||||
toolbar.setBackground(panelBg);
|
||||
toolbar.setOpaque(false);
|
||||
leftButtonBar.setOpaque(false);
|
||||
themeChooserBar.setOpaque(false);
|
||||
themeChooserLabel.setForeground(UIUtil.getLabelForeground());
|
||||
flairLabel.setVisible(false);
|
||||
flairLabel.setText(" ");
|
||||
flairLabel.setBackground(panelBg);
|
||||
flairLabel.setForeground(UIUtil.getLabelForeground());
|
||||
split.setBackground(panelBg);
|
||||
listScroll.setBackground(panelBg);
|
||||
listScroll.getViewport().setBackground(listBg);
|
||||
list.setBackground(listBg);
|
||||
list.setForeground(UIUtil.getTreeForeground());
|
||||
right.setBackground(panelBg);
|
||||
titleBlock.setBackground(panelBg);
|
||||
contentBlock.setBackground(panelBg);
|
||||
titleLabel.setText("标题");
|
||||
contentLabel.setText("内容");
|
||||
titleLabel.setFont(defaultLabelFont);
|
||||
contentLabel.setFont(defaultLabelFont);
|
||||
titleLabel.setForeground(UIUtil.getLabelForeground());
|
||||
contentLabel.setForeground(UIUtil.getLabelForeground());
|
||||
|
||||
resetFieldLook(titleField, editorBg, fg);
|
||||
resetFieldLook(contentArea, editorBg, fg);
|
||||
contentScroll.getViewport().setBackground(editorBg);
|
||||
contentArea.setCaretColor(fg);
|
||||
titleField.setCaretColor(fg);
|
||||
|
||||
resetButton(newBtn);
|
||||
resetButton(saveBtn);
|
||||
resetButton(deleteBtn);
|
||||
|
||||
resetCombo(themeCombo);
|
||||
|
||||
revalidate();
|
||||
repaint();
|
||||
}
|
||||
|
||||
private static void resetFieldLook(javax.swing.text.JTextComponent c, Color bg, Color fg) {
|
||||
c.setOpaque(true);
|
||||
c.setBackground(bg);
|
||||
c.setForeground(fg);
|
||||
c.setBorder(
|
||||
JBUI.Borders.compound(
|
||||
JBUI.Borders.customLine(UIUtil.getBoundsColor(), 1),
|
||||
JBUI.Borders.empty(4, 6)));
|
||||
Color selBg = UIManager.getColor("TextArea.selectionBackground");
|
||||
if (selBg == null) {
|
||||
selBg = UIUtil.getListSelectionBackground();
|
||||
}
|
||||
Color selFg = UIManager.getColor("TextArea.selectionForeground");
|
||||
if (selFg == null) {
|
||||
selFg = UIUtil.getListSelectionForeground();
|
||||
}
|
||||
c.setSelectionColor(selBg);
|
||||
c.setSelectedTextColor(selFg);
|
||||
}
|
||||
|
||||
private static void resetButton(JButton b) {
|
||||
b.setOpaque(false);
|
||||
b.setBackground(null);
|
||||
b.setForeground(null);
|
||||
b.setBorder(JBUI.Borders.empty(4, 12));
|
||||
}
|
||||
|
||||
private static void resetCombo(JComboBox<?> combo) {
|
||||
combo.setOpaque(true);
|
||||
combo.setBackground(null);
|
||||
combo.setForeground(null);
|
||||
}
|
||||
|
||||
private static void styleTextField(JBTextField field, MemoThemeSpec spec, Border border) {
|
||||
field.setOpaque(true);
|
||||
field.setBackground(spec.editorBg);
|
||||
field.setForeground(spec.text);
|
||||
field.setBorder(border);
|
||||
field.setCaretColor(spec.text);
|
||||
field.setSelectedTextColor(spec.listSelectedFg);
|
||||
field.setSelectionColor(spec.listSelectedBg);
|
||||
}
|
||||
|
||||
private static void styleTextArea(
|
||||
JBTextArea area, JScrollPane scroll, MemoThemeSpec spec, Border border) {
|
||||
area.setOpaque(true);
|
||||
area.setBackground(spec.editorBg);
|
||||
area.setForeground(spec.text);
|
||||
area.setBorder(JBUI.Borders.empty());
|
||||
area.setCaretColor(spec.text);
|
||||
area.setSelectedTextColor(spec.listSelectedFg);
|
||||
area.setSelectionColor(spec.listSelectedBg);
|
||||
scroll.setBorder(border);
|
||||
scroll.getViewport().setBackground(spec.editorBg);
|
||||
}
|
||||
|
||||
private static void styleAccentButton(JButton b, MemoThemeSpec spec) {
|
||||
b.setOpaque(true);
|
||||
b.setBackground(spec.buttonBg);
|
||||
b.setForeground(spec.buttonFg);
|
||||
b.setBorder(
|
||||
JBUI.Borders.compound(
|
||||
new LineBorder(spec.accent, 1, true), JBUI.Borders.empty(5, 14)));
|
||||
b.setFocusPainted(false);
|
||||
}
|
||||
|
||||
private void reloadListModel() {
|
||||
listModel.clear();
|
||||
List<MemoItem> items = MemoProjectService.getInstance(project).getItems();
|
||||
for (MemoItem m : items) {
|
||||
listModel.addElement(m);
|
||||
}
|
||||
if (!items.isEmpty() && list.getSelectedIndex() < 0) {
|
||||
list.setSelectedIndex(0);
|
||||
}
|
||||
}
|
||||
|
||||
private void createMemo() {
|
||||
MemoItem m = MemoProjectService.getInstance(project).createMemo();
|
||||
listModel.addElement(m);
|
||||
list.setSelectedValue(m, true);
|
||||
titleField.requestFocusInWindow();
|
||||
}
|
||||
|
||||
private void saveCurrent() {
|
||||
MemoItem m = list.getSelectedValue();
|
||||
if (m == null) {
|
||||
return;
|
||||
}
|
||||
m.title = titleField.getText();
|
||||
m.content = contentArea.getText();
|
||||
m.updated = System.currentTimeMillis();
|
||||
list.repaint();
|
||||
}
|
||||
|
||||
private void deleteCurrent() {
|
||||
MemoItem m = list.getSelectedValue();
|
||||
if (m == null) {
|
||||
return;
|
||||
}
|
||||
int idx = list.getSelectedIndex();
|
||||
MemoProjectService.getInstance(project).removeById(m.id);
|
||||
listModel.removeElement(m);
|
||||
if (!listModel.isEmpty()) {
|
||||
int next = Math.min(idx, listModel.getSize() - 1);
|
||||
list.setSelectedIndex(Math.max(0, next));
|
||||
} else {
|
||||
clearEditor();
|
||||
}
|
||||
}
|
||||
|
||||
private void loadSelectedIntoEditor() {
|
||||
MemoItem m = list.getSelectedValue();
|
||||
loadingSelection = true;
|
||||
try {
|
||||
if (m == null) {
|
||||
clearEditor();
|
||||
} else {
|
||||
titleField.setText(m.title != null ? m.title : "");
|
||||
contentArea.setText(m.content != null ? m.content : "");
|
||||
}
|
||||
} finally {
|
||||
loadingSelection = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void clearEditor() {
|
||||
titleField.setText("");
|
||||
contentArea.setText("");
|
||||
}
|
||||
|
||||
private void refreshSelectedTitleInList() {
|
||||
if (loadingSelection) {
|
||||
return;
|
||||
}
|
||||
javax.swing.SwingUtilities.invokeLater(() -> list.repaint());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.huangzj.protoplugin.memo;
|
||||
|
||||
import com.intellij.openapi.components.PersistentStateComponent;
|
||||
import com.intellij.openapi.components.State;
|
||||
import com.intellij.openapi.components.Storage;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@State(name = "ProtoPluginMemos", storages = @Storage("protoPluginMemos.xml"))
|
||||
public final class MemoProjectService implements PersistentStateComponent<MemoProjectService.State> {
|
||||
|
||||
public static MemoProjectService getInstance(@NotNull Project project) {
|
||||
return project.getService(MemoProjectService.class);
|
||||
}
|
||||
|
||||
public static final class State {
|
||||
public List<MemoItem> items = new ArrayList<>();
|
||||
/** 见 {@link MemoUiTheme#getPersistenceId()} */
|
||||
public String memoThemeId = MemoUiTheme.IDE_DEFAULT.getPersistenceId();
|
||||
}
|
||||
|
||||
private State state = new State();
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public State getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadState(@NotNull State loaded) {
|
||||
this.state = loaded;
|
||||
if (this.state.items == null) {
|
||||
this.state.items = new ArrayList<>();
|
||||
}
|
||||
if (this.state.memoThemeId == null || this.state.memoThemeId.isEmpty()) {
|
||||
this.state.memoThemeId = MemoUiTheme.IDE_DEFAULT.getPersistenceId();
|
||||
}
|
||||
}
|
||||
|
||||
public List<MemoItem> getItems() {
|
||||
return state.items;
|
||||
}
|
||||
|
||||
public MemoItem createMemo() {
|
||||
MemoItem m = new MemoItem();
|
||||
m.id = UUID.randomUUID().toString();
|
||||
m.title = "";
|
||||
m.content = "";
|
||||
m.updated = System.currentTimeMillis();
|
||||
state.items.add(m);
|
||||
return m;
|
||||
}
|
||||
|
||||
public void removeById(@NotNull String id) {
|
||||
for (Iterator<MemoItem> it = state.items.iterator(); it.hasNext(); ) {
|
||||
MemoItem m = it.next();
|
||||
if (id.equals(m.id)) {
|
||||
it.remove();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public MemoItem findById(@NotNull String id) {
|
||||
for (MemoItem m : state.items) {
|
||||
if (id.equals(m.id)) {
|
||||
return m;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public MemoUiTheme getMemoTheme() {
|
||||
return MemoUiTheme.fromPersistenceId(state.memoThemeId);
|
||||
}
|
||||
|
||||
public void setMemoTheme(@NotNull MemoUiTheme theme) {
|
||||
state.memoThemeId = theme.getPersistenceId();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
package com.huangzj.protoplugin.memo;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
/** 非 IDE 默认主题下的色板(IDE 默认走 {@link com.intellij.util.ui.UIUtil})。 */
|
||||
final class MemoThemeSpec {
|
||||
|
||||
final Color panelBg;
|
||||
final Color editorBg;
|
||||
final Color text;
|
||||
final Color accent;
|
||||
final Color listBg;
|
||||
final Color listSelectedBg;
|
||||
final Color listSelectedFg;
|
||||
final Color buttonBg;
|
||||
final Color buttonFg;
|
||||
final Color fieldBorder;
|
||||
|
||||
private MemoThemeSpec(
|
||||
Color panelBg,
|
||||
Color editorBg,
|
||||
Color text,
|
||||
Color accent,
|
||||
Color listBg,
|
||||
Color listSelectedBg,
|
||||
Color listSelectedFg,
|
||||
Color buttonBg,
|
||||
Color buttonFg,
|
||||
Color fieldBorder) {
|
||||
this.panelBg = panelBg;
|
||||
this.editorBg = editorBg;
|
||||
this.text = text;
|
||||
this.accent = accent;
|
||||
this.listBg = listBg;
|
||||
this.listSelectedBg = listSelectedBg;
|
||||
this.listSelectedFg = listSelectedFg;
|
||||
this.buttonBg = buttonBg;
|
||||
this.buttonFg = buttonFg;
|
||||
this.fieldBorder = fieldBorder;
|
||||
}
|
||||
|
||||
static MemoThemeSpec forTheme(MemoUiTheme theme) {
|
||||
switch (theme) {
|
||||
case IDE_DEFAULT:
|
||||
throw new IllegalArgumentException("IDE 默认请走 UIUtil");
|
||||
case DARK_FOCUS:
|
||||
return new MemoThemeSpec(
|
||||
c(0x1E293B),
|
||||
c(0x0F172A),
|
||||
c(0xE2E8F0),
|
||||
c(0x22D3EE),
|
||||
c(0x334155),
|
||||
c(0x0E7490),
|
||||
c(0xECFEFF),
|
||||
c(0x22D3EE),
|
||||
c(0x0F172A),
|
||||
c(0x475569));
|
||||
case PAPER:
|
||||
return new MemoThemeSpec(
|
||||
c(0xF5F0E6),
|
||||
c(0xFFFBF5),
|
||||
c(0x3D3428),
|
||||
c(0x8B6914),
|
||||
c(0xEDE4D3),
|
||||
c(0xD4C4A8),
|
||||
c(0x2C2416),
|
||||
c(0x8B6914),
|
||||
c(0xFFFBF5),
|
||||
c(0xC4B59A));
|
||||
case OCEAN:
|
||||
return new MemoThemeSpec(
|
||||
c(0xE0F2FE),
|
||||
c(0xFFFFFF),
|
||||
c(0x0C4A6E),
|
||||
c(0x0284C7),
|
||||
c(0xF0F9FF),
|
||||
c(0xBAE6FD),
|
||||
c(0x0C4A6E),
|
||||
c(0x0284C7),
|
||||
c(0xFFFFFF),
|
||||
c(0x7DD3FC));
|
||||
case CUTE_CANDY:
|
||||
return new MemoThemeSpec(
|
||||
c(0xFFF5F9),
|
||||
c(0xFFFFFF),
|
||||
c(0x6B2D5C),
|
||||
c(0xFF6B9D),
|
||||
c(0xFFE4F0),
|
||||
c(0xFFC8E6),
|
||||
c(0x4A1942),
|
||||
c(0xFF8FAB),
|
||||
c(0xFFFFFF),
|
||||
c(0xFFB3D1));
|
||||
default:
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
|
||||
private static Color c(int rgb) {
|
||||
return new Color(rgb);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.huangzj.protoplugin.memo;
|
||||
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.wm.ToolWindow;
|
||||
import com.intellij.openapi.wm.ToolWindowFactory;
|
||||
import com.intellij.openapi.wm.ex.ToolWindowEx;
|
||||
import com.intellij.ui.content.ContentFactory;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public final class MemoToolWindowFactory implements ToolWindowFactory {
|
||||
|
||||
/** 与 {@code plugin.xml} 中 {@code <toolWindow id>} 一致 */
|
||||
public static final String TOOL_WINDOW_ID = "MyCustomMemo";
|
||||
|
||||
/** 侧边栏与 View → Tool Windows 中显示的名称 */
|
||||
public static final String TOOL_WINDOW_STRIPE_TITLE = "我的自定义备忘录";
|
||||
|
||||
@Override
|
||||
public void init(@NotNull ToolWindow toolWindow) {
|
||||
if (toolWindow instanceof ToolWindowEx ex) {
|
||||
ex.setStripeTitle(TOOL_WINDOW_STRIPE_TITLE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
|
||||
MemoPanel panel = new MemoPanel(project);
|
||||
var content =
|
||||
ContentFactory.getInstance().createContent(panel, TOOL_WINDOW_STRIPE_TITLE, false);
|
||||
toolWindow.getContentManager().addContent(content);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.huangzj.protoplugin.memo;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/** 备忘录工具窗口可选界面风格(持久化使用 {@link #persistenceId})。 */
|
||||
public enum MemoUiTheme {
|
||||
/** 跟随 IDE 浅色/深色主题 */
|
||||
IDE_DEFAULT("IDE 默认", "IDE"),
|
||||
/** 深色背景 + 青色点缀,适合长时间编辑 */
|
||||
DARK_FOCUS("深色专注", "DARK_FOCUS"),
|
||||
/** 米黄纸张、暖色文字,偏阅读向 */
|
||||
PAPER("护眼纸张", "PAPER"),
|
||||
/** 浅蓝面板 + 海蓝强调色 */
|
||||
OCEAN("海洋", "OCEAN"),
|
||||
/** 粉紫 pastel、柔和选区与装饰标签 */
|
||||
CUTE_CANDY("可爱糖果", "CUTE_CANDY");
|
||||
|
||||
private final String displayName;
|
||||
private final String persistenceId;
|
||||
|
||||
MemoUiTheme(String displayName, String persistenceId) {
|
||||
this.displayName = displayName;
|
||||
this.persistenceId = persistenceId;
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public String getPersistenceId() {
|
||||
return persistenceId;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static MemoUiTheme fromPersistenceId(String id) {
|
||||
if (id == null || id.isEmpty()) {
|
||||
return IDE_DEFAULT;
|
||||
}
|
||||
for (MemoUiTheme t : values()) {
|
||||
if (t.persistenceId.equals(id)) {
|
||||
return t;
|
||||
}
|
||||
}
|
||||
return IDE_DEFAULT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return displayName;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.huangzj.protoplugin.memo;
|
||||
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.wm.ToolWindow;
|
||||
import com.intellij.openapi.wm.ToolWindowManager;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public final class OpenMemoToolWindowAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void update(@NotNull AnActionEvent e) {
|
||||
e.getPresentation().setEnabled(e.getProject() != null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent e) {
|
||||
Project project = e.getProject();
|
||||
if (project == null) {
|
||||
return;
|
||||
}
|
||||
ToolWindow tw =
|
||||
ToolWindowManager.getInstance(project).getToolWindow(MemoToolWindowFactory.TOOL_WINDOW_ID);
|
||||
if (tw != null) {
|
||||
tw.show(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.huangzj.protoplugin.mysql;
|
||||
|
||||
/** JDBC 列元数据(用于生成实体字段)。 */
|
||||
public final class ColumnMeta {
|
||||
|
||||
private final String name;
|
||||
private final int sqlType;
|
||||
private final String typeName;
|
||||
private final int columnSize;
|
||||
private final int decimalDigits;
|
||||
private final boolean nullable;
|
||||
private final boolean autoIncrement;
|
||||
|
||||
public ColumnMeta(
|
||||
String name,
|
||||
int sqlType,
|
||||
String typeName,
|
||||
int columnSize,
|
||||
int decimalDigits,
|
||||
boolean nullable,
|
||||
boolean autoIncrement) {
|
||||
this.name = name;
|
||||
this.sqlType = sqlType;
|
||||
this.typeName = typeName != null ? typeName : "";
|
||||
this.columnSize = columnSize;
|
||||
this.decimalDigits = decimalDigits;
|
||||
this.nullable = nullable;
|
||||
this.autoIncrement = autoIncrement;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public int getSqlType() {
|
||||
return sqlType;
|
||||
}
|
||||
|
||||
public String getTypeName() {
|
||||
return typeName;
|
||||
}
|
||||
|
||||
public int getColumnSize() {
|
||||
return columnSize;
|
||||
}
|
||||
|
||||
public int getDecimalDigits() {
|
||||
return decimalDigits;
|
||||
}
|
||||
|
||||
public boolean isNullable() {
|
||||
return nullable;
|
||||
}
|
||||
|
||||
public boolean isAutoIncrement() {
|
||||
return autoIncrement;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.huangzj.protoplugin.mysql;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
/** 表名/列名到合法 Java 标识符的转换。 */
|
||||
public final class JavaNames {
|
||||
|
||||
private static final Set<String> KEYWORDS = new HashSet<>();
|
||||
|
||||
static {
|
||||
String[] k =
|
||||
("abstract assert boolean break byte case catch char class const "
|
||||
+ "continue default do double else enum extends final finally float "
|
||||
+ "for goto if implements import instanceof int interface long native "
|
||||
+ "new package private protected public return short static strictfp "
|
||||
+ "super switch synchronized this throw throws transient try void "
|
||||
+ "volatile while true false null record sealed permits yields")
|
||||
.split("\\s+");
|
||||
for (String s : k) {
|
||||
KEYWORDS.add(s);
|
||||
}
|
||||
}
|
||||
|
||||
private JavaNames() {}
|
||||
|
||||
public static String toClassNameFromTable(String tableName) {
|
||||
String pascal = toPascalCase(splitIdentifiers(tableName));
|
||||
return pascal.isEmpty() ? "Entity" : pascal;
|
||||
}
|
||||
|
||||
public static String toFieldName(String columnName) {
|
||||
String camel = toCamelCase(splitIdentifiers(columnName));
|
||||
if (camel.isEmpty()) {
|
||||
return "field";
|
||||
}
|
||||
camel = Character.toLowerCase(camel.charAt(0)) + camel.substring(1);
|
||||
return safeIdentifier(camel);
|
||||
}
|
||||
|
||||
public static String toPascalCaseField(String columnName) {
|
||||
String camel = toCamelCase(splitIdentifiers(columnName));
|
||||
if (camel.isEmpty()) {
|
||||
return "Field";
|
||||
}
|
||||
return Character.toUpperCase(camel.charAt(0)) + camel.substring(1);
|
||||
}
|
||||
|
||||
private static String safeIdentifier(String name) {
|
||||
if (KEYWORDS.contains(name.toLowerCase(Locale.ROOT))) {
|
||||
return name + "Value";
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
private static String[] splitIdentifiers(String raw) {
|
||||
if (raw == null || raw.isEmpty()) {
|
||||
return new String[0];
|
||||
}
|
||||
String s = raw.replace('`', ' ').trim();
|
||||
return s.split("[_\\s-]+");
|
||||
}
|
||||
|
||||
private static String toCamelCase(String[] parts) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String p : parts) {
|
||||
if (p == null || p.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
String low = p.toLowerCase(Locale.ROOT);
|
||||
if (sb.length() == 0) {
|
||||
sb.append(low);
|
||||
} else {
|
||||
if (low.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
sb.append(Character.toUpperCase(low.charAt(0)));
|
||||
if (low.length() > 1) {
|
||||
sb.append(low, 1, low.length());
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static String toPascalCase(String[] parts) {
|
||||
String camel = toCamelCase(parts);
|
||||
if (camel.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
return Character.toUpperCase(camel.charAt(0)) + camel.substring(1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
package com.huangzj.protoplugin.mysql;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DatabaseMetaData;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
/** 读取 MySQL 表名与列元数据。 */
|
||||
public final class JdbcMySqlMetadata {
|
||||
|
||||
private static volatile boolean driverLoaded;
|
||||
|
||||
private JdbcMySqlMetadata() {}
|
||||
|
||||
/**
|
||||
* IntelliJ 插件使用独立 ClassLoader 时,JDBC 4 的 SPI 往往不会自动注册 MySQL 驱动,
|
||||
* 会出现 “No suitable driver”。连接前显式加载驱动类可避免该问题。
|
||||
*/
|
||||
public static void ensureMySqlDriverLoaded() throws SQLException {
|
||||
if (driverLoaded) {
|
||||
return;
|
||||
}
|
||||
synchronized (JdbcMySqlMetadata.class) {
|
||||
if (driverLoaded) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
Class.forName("com.mysql.cj.jdbc.Driver");
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new SQLException(
|
||||
"未找到 MySQL JDBC 驱动类 com.mysql.cj.jdbc.Driver。"
|
||||
+ "请使用 Gradle 执行 buildPlugin 重新打包插件,并确认已依赖 mysql-connector-j。",
|
||||
e);
|
||||
}
|
||||
driverLoaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 简写地址须包含库名,例如 host:3306/dbname;否则元数据中的 catalog 为空,无法列出表。
|
||||
*/
|
||||
public static boolean hasDatabaseInUrl(String raw) {
|
||||
String url = normalizeJdbcUrl(raw);
|
||||
if (!url.startsWith("jdbc:mysql://")) {
|
||||
return true;
|
||||
}
|
||||
String rest = url.substring("jdbc:mysql://".length());
|
||||
int q = rest.indexOf('?');
|
||||
String pathPart = q >= 0 ? rest.substring(0, q) : rest;
|
||||
int slash = pathPart.indexOf('/');
|
||||
return slash >= 0 && slash < pathPart.length() - 1;
|
||||
}
|
||||
|
||||
public static String normalizeJdbcUrl(String raw) {
|
||||
String s = raw == null ? "" : raw.trim();
|
||||
if (s.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
if (s.startsWith("jdbc:mysql:")) {
|
||||
return s;
|
||||
}
|
||||
// host:port/db 或 host/db
|
||||
if (!s.contains("://")) {
|
||||
return "jdbc:mysql://" + s;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
public static Connection openConnection(String jdbcUrl, String user, String password)
|
||||
throws SQLException {
|
||||
ensureMySqlDriverLoaded();
|
||||
String url = normalizeJdbcUrl(jdbcUrl);
|
||||
Properties props = new Properties();
|
||||
if (user != null && !user.isEmpty()) {
|
||||
props.setProperty("user", user);
|
||||
}
|
||||
if (password != null) {
|
||||
props.setProperty("password", password);
|
||||
}
|
||||
return DriverManager.getConnection(url, props);
|
||||
}
|
||||
|
||||
public static List<String> listTableNames(Connection conn) throws SQLException {
|
||||
DatabaseMetaData md = conn.getMetaData();
|
||||
String catalog = conn.getCatalog();
|
||||
List<String> names = new ArrayList<>();
|
||||
try (ResultSet rs = md.getTables(catalog, null, "%", new String[] {"TABLE"})) {
|
||||
while (rs.next()) {
|
||||
String t = rs.getString("TABLE_NAME");
|
||||
if (t != null && !t.isEmpty()) {
|
||||
names.add(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
return names;
|
||||
}
|
||||
|
||||
public static List<ColumnMeta> listColumns(Connection conn, String tableName)
|
||||
throws SQLException {
|
||||
DatabaseMetaData md = conn.getMetaData();
|
||||
String catalog = conn.getCatalog();
|
||||
List<ColumnMeta> cols = new ArrayList<>();
|
||||
try (ResultSet rs = md.getColumns(catalog, null, tableName, "%")) {
|
||||
while (rs.next()) {
|
||||
String col = rs.getString("COLUMN_NAME");
|
||||
int dataType = rs.getInt("DATA_TYPE");
|
||||
String typeName = rs.getString("TYPE_NAME");
|
||||
int size = rs.getInt("COLUMN_SIZE");
|
||||
int digits = rs.getInt("DECIMAL_DIGITS");
|
||||
boolean nullable = rs.getInt("NULLABLE") == DatabaseMetaData.columnNullable;
|
||||
String ai = rs.getString("IS_AUTOINCREMENT");
|
||||
boolean autoInc = "YES".equalsIgnoreCase(ai);
|
||||
cols.add(new ColumnMeta(col, dataType, typeName, size, digits, nullable, autoInc));
|
||||
}
|
||||
}
|
||||
return cols;
|
||||
}
|
||||
|
||||
/** 列名 -> 是否主键(用于单列/复合主键)。 */
|
||||
public static Set<String> primaryKeyColumns(Connection conn, String tableName)
|
||||
throws SQLException {
|
||||
DatabaseMetaData md = conn.getMetaData();
|
||||
String catalog = conn.getCatalog();
|
||||
Map<String, Integer> order = new LinkedHashMap<>();
|
||||
try (ResultSet rs = md.getPrimaryKeys(catalog, null, tableName)) {
|
||||
while (rs.next()) {
|
||||
String col = rs.getString("COLUMN_NAME");
|
||||
int seq = rs.getInt("KEY_SEQ");
|
||||
if (col != null) {
|
||||
order.put(col, seq);
|
||||
}
|
||||
}
|
||||
}
|
||||
List<Map.Entry<String, Integer>> entries = new ArrayList<>(order.entrySet());
|
||||
entries.sort(Map.Entry.comparingByValue());
|
||||
Set<String> set = new LinkedHashSet<>();
|
||||
for (Map.Entry<String, Integer> e : entries) {
|
||||
set.add(e.getKey());
|
||||
}
|
||||
return set;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,307 @@
|
||||
package com.huangzj.protoplugin.mysql;
|
||||
|
||||
import java.sql.Types;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
/** 根据列元数据生成带 JPA 注解的实体源码(jakarta.persistence)。 */
|
||||
public final class JpaEntitySourceGenerator {
|
||||
|
||||
private JpaEntitySourceGenerator() {}
|
||||
|
||||
public static String generate(String packageName, String tableName, List<ColumnMeta> columns,
|
||||
Set<String> pkColumns) {
|
||||
String className = JavaNames.toClassNameFromTable(tableName);
|
||||
List<ColumnMeta> ordered = new ArrayList<>(columns);
|
||||
Set<String> pk = pkColumns != null ? pkColumns : Set.of();
|
||||
|
||||
boolean compositePk = pk.size() > 1;
|
||||
String pkClassName = className + "Pk";
|
||||
|
||||
StringBuilder imports = new StringBuilder();
|
||||
imports.append("import jakarta.persistence.Column;\n");
|
||||
imports.append("import jakarta.persistence.Entity;\n");
|
||||
imports.append("import jakarta.persistence.Table;\n");
|
||||
if (!pk.isEmpty()) {
|
||||
imports.append("import jakarta.persistence.Id;\n");
|
||||
}
|
||||
boolean needGenValue = false;
|
||||
if (pk.size() == 1) {
|
||||
String only = pk.iterator().next();
|
||||
ColumnMeta pkCol = findColumn(ordered, only);
|
||||
if (pkCol != null && pkCol.isAutoIncrement()) {
|
||||
imports.append("import jakarta.persistence.GeneratedValue;\n");
|
||||
imports.append("import jakarta.persistence.GenerationType;\n");
|
||||
needGenValue = true;
|
||||
}
|
||||
}
|
||||
if (compositePk) {
|
||||
imports.append("import jakarta.persistence.IdClass;\n");
|
||||
imports.append("import java.io.Serializable;\n");
|
||||
imports.append("import java.util.Objects;\n");
|
||||
}
|
||||
|
||||
Set<String> extraImports = new LinkedHashSet<>();
|
||||
for (ColumnMeta c : ordered) {
|
||||
collectTypeImport(c, extraImports);
|
||||
}
|
||||
for (String imp : extraImports) {
|
||||
imports.append("import ").append(imp).append(";\n");
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("package ").append(packageName).append(";\n\n");
|
||||
sb.append(imports).append("\n");
|
||||
sb.append("/**\n");
|
||||
sb.append(" * Generated from MySQL table: ").append(safeJavadoc(tableName)).append("\n");
|
||||
sb.append(" */\n");
|
||||
sb.append("@Entity\n");
|
||||
sb.append("@Table(name = \"").append(escapeJavaString(tableName)).append("\")\n");
|
||||
if (compositePk) {
|
||||
sb.append("@IdClass(").append(className).append(".").append(pkClassName).append(".class)\n");
|
||||
}
|
||||
sb.append("public class ").append(className).append(" {\n");
|
||||
if (pk.isEmpty()) {
|
||||
sb.append(" // TODO: 未从数据库元数据检测到主键,请手工补充 @Id 字段\n");
|
||||
}
|
||||
sb.append("\n");
|
||||
|
||||
for (ColumnMeta c : ordered) {
|
||||
boolean isPk = pk.contains(c.getName());
|
||||
String field = JavaNames.toFieldName(c.getName());
|
||||
String javaType = mapJavaType(c);
|
||||
sb.append(" ");
|
||||
if (isPk) {
|
||||
sb.append("@Id\n ");
|
||||
if (needGenValue && pk.size() == 1 && pk.contains(c.getName())) {
|
||||
sb.append("@GeneratedValue(strategy = GenerationType.IDENTITY)\n ");
|
||||
}
|
||||
}
|
||||
sb.append("@Column(name = \"").append(escapeJavaString(c.getName())).append("\"");
|
||||
if (!c.isNullable() && !isPk) {
|
||||
sb.append(", nullable = false");
|
||||
}
|
||||
if (c.getColumnSize() > 0 && isStringType(c)) {
|
||||
sb.append(", length = ").append(c.getColumnSize());
|
||||
}
|
||||
if (c.getDecimalDigits() > 0 && (javaType.equals("BigDecimal") || javaType.equals("Double"))) {
|
||||
sb.append(", precision = ").append(c.getColumnSize());
|
||||
sb.append(", scale = ").append(c.getDecimalDigits());
|
||||
}
|
||||
sb.append(")\n");
|
||||
sb.append(" private ").append(javaType).append(" ").append(field).append(";\n\n");
|
||||
}
|
||||
|
||||
// getters / setters
|
||||
for (ColumnMeta c : ordered) {
|
||||
String field = JavaNames.toFieldName(c.getName());
|
||||
String pascal = JavaNames.toPascalCaseField(c.getName());
|
||||
String javaType = mapJavaType(c);
|
||||
sb.append(" public ").append(javaType).append(" get").append(pascal).append("() {\n");
|
||||
sb.append(" return ").append(field).append(";\n");
|
||||
sb.append(" }\n\n");
|
||||
sb.append(" public void set").append(pascal).append("(").append(javaType).append(" ").append(field)
|
||||
.append(") {\n");
|
||||
sb.append(" this.").append(field).append(" = ").append(field).append(";\n");
|
||||
sb.append(" }\n\n");
|
||||
}
|
||||
|
||||
if (compositePk) {
|
||||
sb.append(generatePkClass(pkClassName, ordered, pk));
|
||||
}
|
||||
|
||||
sb.append("}\n");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static String generatePkClass(String pkClassName, List<ColumnMeta> columns, Set<String> pk) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(" /**\n");
|
||||
sb.append(" * Composite primary key.\n");
|
||||
sb.append(" */\n");
|
||||
sb.append(" public static class ").append(pkClassName).append(" implements Serializable {\n\n");
|
||||
for (ColumnMeta c : columns) {
|
||||
if (!pk.contains(c.getName())) {
|
||||
continue;
|
||||
}
|
||||
String field = JavaNames.toFieldName(c.getName());
|
||||
String javaType = mapJavaType(c);
|
||||
sb.append(" private ").append(javaType).append(" ").append(field).append(";\n");
|
||||
}
|
||||
sb.append("\n");
|
||||
for (ColumnMeta c : columns) {
|
||||
if (!pk.contains(c.getName())) {
|
||||
continue;
|
||||
}
|
||||
String field = JavaNames.toFieldName(c.getName());
|
||||
String pascal = JavaNames.toPascalCaseField(c.getName());
|
||||
String javaType = mapJavaType(c);
|
||||
sb.append(" public ").append(javaType).append(" get").append(pascal).append("() {\n");
|
||||
sb.append(" return ").append(field).append(";\n");
|
||||
sb.append(" }\n\n");
|
||||
sb.append(" public void set").append(pascal).append("(").append(javaType).append(" ")
|
||||
.append(field).append(") {\n");
|
||||
sb.append(" this.").append(field).append(" = ").append(field).append(";\n");
|
||||
sb.append(" }\n\n");
|
||||
}
|
||||
sb.append(" @Override\n");
|
||||
sb.append(" public boolean equals(Object o) {\n");
|
||||
sb.append(" if (this == o) return true;\n");
|
||||
sb.append(" if (o == null || getClass() != o.getClass()) return false;\n");
|
||||
sb.append(" ").append(pkClassName).append(" that = (").append(pkClassName).append(") o;\n");
|
||||
sb.append(" return ");
|
||||
boolean first = true;
|
||||
for (ColumnMeta c : columns) {
|
||||
if (!pk.contains(c.getName())) {
|
||||
continue;
|
||||
}
|
||||
String field = JavaNames.toFieldName(c.getName());
|
||||
if (!first) {
|
||||
sb.append("\n && ");
|
||||
} else {
|
||||
first = false;
|
||||
}
|
||||
sb.append("Objects.equals(").append(field).append(", that.").append(field).append(")");
|
||||
}
|
||||
if (first) {
|
||||
sb.append("true");
|
||||
}
|
||||
sb.append(";\n");
|
||||
sb.append(" }\n\n");
|
||||
sb.append(" @Override\n");
|
||||
sb.append(" public int hashCode() {\n");
|
||||
sb.append(" return Objects.hash(");
|
||||
first = true;
|
||||
for (ColumnMeta c : columns) {
|
||||
if (!pk.contains(c.getName())) {
|
||||
continue;
|
||||
}
|
||||
if (!first) {
|
||||
sb.append(", ");
|
||||
}
|
||||
first = false;
|
||||
sb.append(JavaNames.toFieldName(c.getName()));
|
||||
}
|
||||
sb.append(");\n");
|
||||
sb.append(" }\n");
|
||||
sb.append(" }\n\n");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static ColumnMeta findColumn(List<ColumnMeta> cols, String name) {
|
||||
for (ColumnMeta c : cols) {
|
||||
if (c.getName().equalsIgnoreCase(name)) {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void collectTypeImport(ColumnMeta c, Set<String> extraImports) {
|
||||
String t = mapJavaType(c);
|
||||
switch (t) {
|
||||
case "BigDecimal":
|
||||
extraImports.add("java.math.BigDecimal");
|
||||
break;
|
||||
case "LocalDate":
|
||||
extraImports.add("java.time.LocalDate");
|
||||
break;
|
||||
case "LocalTime":
|
||||
extraImports.add("java.time.LocalTime");
|
||||
break;
|
||||
case "LocalDateTime":
|
||||
extraImports.add("java.time.LocalDateTime");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isStringType(ColumnMeta c) {
|
||||
int st = c.getSqlType();
|
||||
return st == Types.CHAR
|
||||
|| st == Types.VARCHAR
|
||||
|| st == Types.LONGVARCHAR
|
||||
|| st == Types.NCHAR
|
||||
|| st == Types.NVARCHAR
|
||||
|| st == Types.LONGNVARCHAR;
|
||||
}
|
||||
|
||||
private static String mapJavaType(ColumnMeta c) {
|
||||
int st = c.getSqlType();
|
||||
String tn = c.getTypeName() != null ? c.getTypeName().toLowerCase(Locale.ROOT) : "";
|
||||
switch (st) {
|
||||
case Types.BIT:
|
||||
if (c.getColumnSize() == 1) {
|
||||
return "Boolean";
|
||||
}
|
||||
return "byte[]";
|
||||
case Types.TINYINT:
|
||||
if (c.getColumnSize() == 1 && (tn.contains("bool") || tn.contains("bit"))) {
|
||||
return "Boolean";
|
||||
}
|
||||
return "Integer";
|
||||
case Types.SMALLINT:
|
||||
return "Integer";
|
||||
case Types.INTEGER:
|
||||
return "Integer";
|
||||
case Types.BIGINT:
|
||||
return "Long";
|
||||
case Types.FLOAT:
|
||||
case Types.REAL:
|
||||
return "Float";
|
||||
case Types.DOUBLE:
|
||||
return "Double";
|
||||
case Types.NUMERIC:
|
||||
case Types.DECIMAL:
|
||||
return "BigDecimal";
|
||||
case Types.CHAR:
|
||||
case Types.VARCHAR:
|
||||
case Types.LONGVARCHAR:
|
||||
case Types.NCHAR:
|
||||
case Types.NVARCHAR:
|
||||
case Types.LONGNVARCHAR:
|
||||
return "String";
|
||||
case Types.DATE:
|
||||
return "LocalDate";
|
||||
case Types.TIME:
|
||||
case Types.TIME_WITH_TIMEZONE:
|
||||
return "LocalTime";
|
||||
case Types.TIMESTAMP:
|
||||
case Types.TIMESTAMP_WITH_TIMEZONE:
|
||||
return "LocalDateTime";
|
||||
case Types.BINARY:
|
||||
case Types.VARBINARY:
|
||||
case Types.LONGVARBINARY:
|
||||
case Types.BLOB:
|
||||
return "byte[]";
|
||||
case Types.BOOLEAN:
|
||||
return "Boolean";
|
||||
default:
|
||||
if (tn.contains("json")) {
|
||||
return "String";
|
||||
}
|
||||
if (tn.contains("geometry") || tn.contains("blob")) {
|
||||
return "byte[]";
|
||||
}
|
||||
return "String";
|
||||
}
|
||||
}
|
||||
|
||||
private static String escapeJavaString(String s) {
|
||||
if (s == null) {
|
||||
return "";
|
||||
}
|
||||
return s.replace("\\", "\\\\").replace("\"", "\\\"");
|
||||
}
|
||||
|
||||
private static String safeJavadoc(String s) {
|
||||
if (s == null) {
|
||||
return "";
|
||||
}
|
||||
return s.replace("*/", "* /");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,395 @@
|
||||
package com.huangzj.protoplugin.mysql;
|
||||
|
||||
import com.intellij.lang.java.JavaLanguage;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
|
||||
import com.intellij.openapi.progress.ProgressIndicator;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.progress.Task;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.DialogWrapper;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
||||
import com.intellij.openapi.ui.ValidationInfo;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiFileFactory;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.ui.components.JBScrollPane;
|
||||
import com.intellij.util.ui.JBUI;
|
||||
import com.huangzj.protoplugin.PackageInference;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Insets;
|
||||
import java.sql.Connection;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class MysqlEntityDialog extends DialogWrapper {
|
||||
|
||||
private final Project project;
|
||||
private final JTextField jdbcUrlField = new JTextField(40);
|
||||
private final JTextField userField = new JTextField(20);
|
||||
private final JPasswordField passwordField = new JPasswordField(20);
|
||||
private final JTextField filterField = new JTextField(20);
|
||||
private final TextFieldWithBrowseButton outputDirField = new TextFieldWithBrowseButton();
|
||||
private final JPanel tableListPanel = new JPanel();
|
||||
private final Map<String, javax.swing.JCheckBox> tableChecks = new LinkedHashMap<>();
|
||||
private List<String> loadedTables = Collections.emptyList();
|
||||
|
||||
public MysqlEntityDialog(@Nullable Project project, @Nullable VirtualFile presetFolder) {
|
||||
super(project);
|
||||
this.project = project;
|
||||
setTitle("mysql转Jpa");
|
||||
if (presetFolder != null) {
|
||||
outputDirField.setText(presetFolder.getPath());
|
||||
}
|
||||
FileChooserDescriptor desc = FileChooserDescriptorFactory.createSingleFolderDescriptor();
|
||||
desc.setTitle("选择实体类输出目录(通常为 .../src/main/java/...)");
|
||||
outputDirField.addBrowseFolderListener("选择目录", null, project, desc);
|
||||
|
||||
tableListPanel.setLayout(new BoxLayout(tableListPanel, BoxLayout.Y_AXIS));
|
||||
tableListPanel.setBorder(JBUI.Borders.empty(4));
|
||||
|
||||
filterField.getDocument()
|
||||
.addDocumentListener(
|
||||
new DocumentListener() {
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
applyFilter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
applyFilter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
applyFilter();
|
||||
}
|
||||
});
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JComponent createCenterPanel() {
|
||||
JPanel root = new JPanel(new BorderLayout(8, 8));
|
||||
|
||||
JPanel form = new JPanel(new GridBagLayout());
|
||||
GridBagConstraints gc = new GridBagConstraints();
|
||||
gc.insets = new Insets(4, 4, 4, 4);
|
||||
gc.anchor = GridBagConstraints.WEST;
|
||||
gc.fill = GridBagConstraints.HORIZONTAL;
|
||||
gc.weightx = 0;
|
||||
gc.gridx = 0;
|
||||
gc.gridy = 0;
|
||||
form.add(new JLabel("JDBC URL:"), gc);
|
||||
gc.gridx = 1;
|
||||
gc.weightx = 1;
|
||||
jdbcUrlField.setToolTipText("例: jdbc:mysql://127.0.0.1:3306/dbname?useSSL=false&serverTimezone=UTC");
|
||||
form.add(jdbcUrlField, gc);
|
||||
|
||||
gc.gridx = 0;
|
||||
gc.gridy = 1;
|
||||
gc.weightx = 0;
|
||||
form.add(new JLabel("用户名:"), gc);
|
||||
gc.gridx = 1;
|
||||
gc.weightx = 1;
|
||||
form.add(userField, gc);
|
||||
|
||||
gc.gridx = 0;
|
||||
gc.gridy = 2;
|
||||
gc.weightx = 0;
|
||||
form.add(new JLabel("密码:"), gc);
|
||||
gc.gridx = 1;
|
||||
gc.weightx = 1;
|
||||
form.add(passwordField, gc);
|
||||
|
||||
gc.gridx = 0;
|
||||
gc.gridy = 3;
|
||||
gc.weightx = 0;
|
||||
form.add(new JLabel("输出目录:"), gc);
|
||||
gc.gridx = 1;
|
||||
gc.weightx = 1;
|
||||
form.add(outputDirField, gc);
|
||||
|
||||
JLabel hint =
|
||||
new JLabel(
|
||||
"<html>提示:<b>必须包含库名</b>,例如 <code>host:3306/my_database</code> 或完整 JDBC URL。"
|
||||
+ "<br/>仅填 <code>host:3306</code> 无法列出表,且易导致连接异常。"
|
||||
+ "<br/>生成类使用 <code>jakarta.persistence</code> 注解。</html>");
|
||||
hint.setBorder(BorderFactory.createEmptyBorder(0, 0, 8, 0));
|
||||
JPanel top = new JPanel(new BorderLayout(0, 8));
|
||||
top.add(hint, BorderLayout.NORTH);
|
||||
top.add(form, BorderLayout.CENTER);
|
||||
root.add(top, BorderLayout.NORTH);
|
||||
|
||||
JPanel mid = new JPanel(new BorderLayout(4, 4));
|
||||
JPanel toolbar = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 0));
|
||||
JButton queryBtn = new JButton("查询表");
|
||||
queryBtn.addActionListener(e -> runQueryTables());
|
||||
toolbar.add(queryBtn);
|
||||
toolbar.add(new JLabel("搜索表名:"));
|
||||
toolbar.add(filterField);
|
||||
mid.add(toolbar, BorderLayout.NORTH);
|
||||
|
||||
JBScrollPane scroll = new JBScrollPane(tableListPanel);
|
||||
scroll.setPreferredSize(new Dimension(560, 260));
|
||||
mid.add(scroll, BorderLayout.CENTER);
|
||||
root.add(mid, BorderLayout.CENTER);
|
||||
|
||||
JPanel south = new JPanel(new FlowLayout(FlowLayout.RIGHT, 8, 0));
|
||||
JButton genBtn = new JButton("生成 Java 实体");
|
||||
genBtn.addActionListener(e -> runGenerateEntities());
|
||||
south.add(genBtn);
|
||||
root.add(south, BorderLayout.SOUTH);
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Action @NotNull [] createActions() {
|
||||
return new Action[] {getCancelAction()};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doCancelAction() {
|
||||
super.doCancelAction();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public JComponent getPreferredFocusedComponent() {
|
||||
return jdbcUrlField;
|
||||
}
|
||||
|
||||
private void runQueryTables() {
|
||||
ValidationInfo v = validateConnectionFields();
|
||||
if (v != null) {
|
||||
Messages.showErrorDialog(project, v.message, "校验失败");
|
||||
return;
|
||||
}
|
||||
ProgressManager.getInstance()
|
||||
.run(
|
||||
new Task.Backgroundable(project, "查询 MySQL 表", false) {
|
||||
@Override
|
||||
public void run(@NotNull ProgressIndicator indicator) {
|
||||
indicator.setIndeterminate(true);
|
||||
try (Connection conn =
|
||||
JdbcMySqlMetadata.openConnection(
|
||||
jdbcUrlField.getText().trim(),
|
||||
userField.getText().trim(),
|
||||
new String(passwordField.getPassword()))) {
|
||||
List<String> names = JdbcMySqlMetadata.listTableNames(conn);
|
||||
ApplicationManager.getApplication()
|
||||
.invokeLater(
|
||||
() -> {
|
||||
loadedTables = new ArrayList<>(names);
|
||||
rebuildTableChecks();
|
||||
Messages.showInfoMessage(
|
||||
project,
|
||||
"共读取 " + names.size() + " 张表。",
|
||||
"查询完成");
|
||||
});
|
||||
} catch (Exception ex) {
|
||||
String msg = ex.getMessage() != null ? ex.getMessage() : ex.toString();
|
||||
ApplicationManager.getApplication()
|
||||
.invokeLater(
|
||||
() ->
|
||||
Messages.showErrorDialog(
|
||||
project, msg, "连接或查询失败"));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void rebuildTableChecks() {
|
||||
tableChecks.clear();
|
||||
tableListPanel.removeAll();
|
||||
String q = filterField.getText().trim().toLowerCase();
|
||||
for (String t : loadedTables) {
|
||||
if (!q.isEmpty() && !t.toLowerCase().contains(q)) {
|
||||
continue;
|
||||
}
|
||||
javax.swing.JCheckBox cb = new javax.swing.JCheckBox(t, false);
|
||||
cb.putClientProperty("table", t);
|
||||
tableChecks.put(t, cb);
|
||||
tableListPanel.add(cb);
|
||||
tableListPanel.add(Box.createVerticalStrut(2));
|
||||
}
|
||||
tableListPanel.revalidate();
|
||||
tableListPanel.repaint();
|
||||
}
|
||||
|
||||
private void applyFilter() {
|
||||
if (loadedTables.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
Map<String, Boolean> selected = new LinkedHashMap<>();
|
||||
for (Map.Entry<String, javax.swing.JCheckBox> e : tableChecks.entrySet()) {
|
||||
selected.put(e.getKey(), e.getValue().isSelected());
|
||||
}
|
||||
rebuildTableChecks();
|
||||
for (Map.Entry<String, Boolean> e : selected.entrySet()) {
|
||||
javax.swing.JCheckBox cb = tableChecks.get(e.getKey());
|
||||
if (cb != null) {
|
||||
cb.setSelected(Boolean.TRUE.equals(e.getValue()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ValidationInfo validateConnectionFields() {
|
||||
String raw = jdbcUrlField.getText().trim();
|
||||
if (raw.isEmpty()) {
|
||||
return new ValidationInfo("请填写 JDBC URL 或 host:port/库名", jdbcUrlField);
|
||||
}
|
||||
if (!JdbcMySqlMetadata.hasDatabaseInUrl(raw)) {
|
||||
return new ValidationInfo(
|
||||
"请在地址中带上数据库名,例如 43.155.238.153:3306/your_db 或完整 jdbc:mysql://host:3306/your_db",
|
||||
jdbcUrlField);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private ValidationInfo validateOutputAndSelection() {
|
||||
String path = outputDirField.getText().trim();
|
||||
if (path.isEmpty()) {
|
||||
return new ValidationInfo("请选择输出目录", outputDirField);
|
||||
}
|
||||
VirtualFile dir = LocalFileSystem.getInstance().findFileByPath(path);
|
||||
if (dir == null || !dir.isDirectory()) {
|
||||
return new ValidationInfo("输出路径不是有效目录", outputDirField);
|
||||
}
|
||||
String pkg = PackageInference.inferPackage(dir);
|
||||
if (pkg.isEmpty()) {
|
||||
return new ValidationInfo(
|
||||
"无法推断 Java 包名:请选择位于 .../src/main/java/<包路径>/ 下的目录。", outputDirField);
|
||||
}
|
||||
List<String> sel = getSelectedTables();
|
||||
if (sel.isEmpty()) {
|
||||
return new ValidationInfo("请至少选择一张表(可先点击「查询表」)", outputDirField);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<String> getSelectedTables() {
|
||||
List<String> list = new ArrayList<>();
|
||||
for (javax.swing.JCheckBox cb : tableChecks.values()) {
|
||||
if (cb.isSelected()) {
|
||||
Object t = cb.getClientProperty("table");
|
||||
if (t instanceof String) {
|
||||
list.add((String) t);
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private void runGenerateEntities() {
|
||||
ValidationInfo v1 = validateConnectionFields();
|
||||
if (v1 != null) {
|
||||
Messages.showErrorDialog(project, v1.message, "校验失败");
|
||||
return;
|
||||
}
|
||||
ValidationInfo v2 = validateOutputAndSelection();
|
||||
if (v2 != null) {
|
||||
Messages.showErrorDialog(project, v2.message, "校验失败");
|
||||
return;
|
||||
}
|
||||
VirtualFile outDir = LocalFileSystem.getInstance().findFileByPath(outputDirField.getText().trim());
|
||||
String pkg = PackageInference.inferPackage(outDir);
|
||||
List<String> tables = getSelectedTables();
|
||||
|
||||
ProgressManager.getInstance()
|
||||
.run(
|
||||
new Task.Backgroundable(project, "生成 JPA 实体", false) {
|
||||
@Override
|
||||
public void run(@NotNull ProgressIndicator indicator) {
|
||||
indicator.setIndeterminate(false);
|
||||
Map<String, String> sources = new LinkedHashMap<>();
|
||||
try (Connection conn =
|
||||
JdbcMySqlMetadata.openConnection(
|
||||
jdbcUrlField.getText().trim(),
|
||||
userField.getText().trim(),
|
||||
new String(passwordField.getPassword()))) {
|
||||
int i = 0;
|
||||
for (String table : tables) {
|
||||
indicator.setFraction((double) i / Math.max(1, tables.size()));
|
||||
indicator.setText2(table);
|
||||
List<ColumnMeta> cols = JdbcMySqlMetadata.listColumns(conn, table);
|
||||
Set<String> pk = JdbcMySqlMetadata.primaryKeyColumns(conn, table);
|
||||
String src = JpaEntitySourceGenerator.generate(pkg, table, cols, pk);
|
||||
String className = JavaNames.toClassNameFromTable(table) + ".java";
|
||||
sources.put(className, src);
|
||||
i++;
|
||||
}
|
||||
indicator.setFraction(1.0);
|
||||
} catch (Exception ex) {
|
||||
String msg = ex.getMessage() != null ? ex.getMessage() : ex.toString();
|
||||
ApplicationManager.getApplication()
|
||||
.invokeLater(
|
||||
() ->
|
||||
Messages.showErrorDialog(
|
||||
project, msg, "读取表结构失败"));
|
||||
return;
|
||||
}
|
||||
ApplicationManager.getApplication()
|
||||
.invokeLater(
|
||||
() ->
|
||||
writeFilesOnEdt(
|
||||
outDir, pkg, sources));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void writeFilesOnEdt(
|
||||
VirtualFile outDir, String pkg, Map<String, String> sources) {
|
||||
if (project == null || outDir == null) {
|
||||
return;
|
||||
}
|
||||
int[] created = {0};
|
||||
int[] skipped = {0};
|
||||
WriteCommandAction.runWriteCommandAction(
|
||||
project,
|
||||
() -> {
|
||||
PsiDirectory psiDir = PsiManager.getInstance(project).findDirectory(outDir);
|
||||
if (psiDir == null) {
|
||||
return;
|
||||
}
|
||||
PsiFileFactory factory = PsiFileFactory.getInstance(project);
|
||||
for (Map.Entry<String, String> e : sources.entrySet()) {
|
||||
String name = e.getKey();
|
||||
if (psiDir.findFile(name) != null) {
|
||||
skipped[0]++;
|
||||
continue;
|
||||
}
|
||||
PsiFile psiFile =
|
||||
factory.createFileFromText(name, JavaLanguage.INSTANCE, e.getValue());
|
||||
psiDir.add(psiFile);
|
||||
created[0]++;
|
||||
}
|
||||
});
|
||||
Messages.showInfoMessage(
|
||||
project,
|
||||
"新建 " + created[0] + " 个实体文件,跳过已存在 " + skipped[0] + " 个。\n包名: " + pkg,
|
||||
"生成完成");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.huangzj.protoplugin.vcs;
|
||||
|
||||
import com.intellij.openapi.vcs.CheckinProjectPanel;
|
||||
import com.intellij.openapi.vcs.changes.CommitContext;
|
||||
import com.intellij.openapi.vcs.checkin.CheckinHandler;
|
||||
import com.intellij.openapi.vcs.checkin.CheckinHandlerFactory;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* 注册 {@link TimeSkewCommitCheckHandler}:以 {@link com.intellij.openapi.vcs.checkin.CommitCheck.ExecutionOrder#EARLY}
|
||||
* 执行时间校验,避免非模态提交在 LATE 阶段失败触发 Cancelled/文档恢复(表现为文件被回退)。
|
||||
*/
|
||||
public final class CommitTimeCheckinHandlerFactory extends CheckinHandlerFactory {
|
||||
|
||||
@Override
|
||||
public @NotNull CheckinHandler createHandler(
|
||||
@NotNull CheckinProjectPanel panel, @NotNull CommitContext commitContext) {
|
||||
return new TimeSkewCommitCheckHandler(panel.getProject());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.huangzj.protoplugin.vcs;
|
||||
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/** 通过 HTTP 响应头 Date 获取参考时间(UTC),用于与本机 {@link System#currentTimeMillis()} 对比。 */
|
||||
public final class TimeSkewChecker {
|
||||
|
||||
private static final int CONNECT_MS = 5_000;
|
||||
private static final int READ_MS = 5_000;
|
||||
|
||||
/** 国内可访问的站点,依次尝试 HEAD。 */
|
||||
private static final String[] HEAD_URLS = {
|
||||
"https://www.aliyun.com",
|
||||
"https://www.qq.com",
|
||||
"https://www.baidu.com",
|
||||
};
|
||||
|
||||
private TimeSkewChecker() {}
|
||||
|
||||
/**
|
||||
* @return 服务器认为的当前纪元毫秒;全部失败时返回 {@code null}(调用方宜放行提交)。
|
||||
*/
|
||||
@Nullable
|
||||
public static Long fetchReferenceEpochMillis() {
|
||||
for (String spec : HEAD_URLS) {
|
||||
Long t = tryHeadDate(spec);
|
||||
if (t != null && t > 0) {
|
||||
return t;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Long tryHeadDate(String spec) {
|
||||
HttpURLConnection c = null;
|
||||
try {
|
||||
URL url = new URL(spec);
|
||||
c = (HttpURLConnection) url.openConnection();
|
||||
c.setRequestMethod("HEAD");
|
||||
c.setInstanceFollowRedirects(true);
|
||||
c.setConnectTimeout(CONNECT_MS);
|
||||
c.setReadTimeout(READ_MS);
|
||||
c.setRequestProperty("User-Agent", "ProtoPlugin-TimeCheck/1.0");
|
||||
c.connect();
|
||||
long d = c.getDate();
|
||||
return d > 0 ? d : null;
|
||||
} catch (Exception ignored) {
|
||||
return null;
|
||||
} finally {
|
||||
if (c != null) {
|
||||
c.disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package com.huangzj.protoplugin.vcs
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.application.ModalityState
|
||||
import com.intellij.openapi.project.DumbAware
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.ui.Messages
|
||||
import com.intellij.openapi.vcs.checkin.CheckinHandler
|
||||
import com.intellij.openapi.vcs.checkin.CommitCheck
|
||||
import com.intellij.openapi.vcs.checkin.CommitInfo
|
||||
import com.intellij.openapi.vcs.checkin.CommitProblem
|
||||
import com.intellij.openapi.vcs.checkin.TextCommitProblem
|
||||
import java.util.concurrent.atomic.AtomicInteger
|
||||
import kotlin.math.abs
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
/**
|
||||
* 直接实现 [CommitCheck] 且顺序为 [CommitCheck.ExecutionOrder.EARLY],避免落在默认 [CheckinHandler] 的 LATE 阶段。
|
||||
*
|
||||
* 非模态提交里 LATE 失败会走 ABORTED → Cancelled,可能伴随文档/部分提交状态的恢复,表现为「文件被回退」;
|
||||
* EARLY 失败为 EARLY_FAILED → CommitChecksResult.Failed(),在跑完 MODIFICATION/saveAllDocuments 之前即中止,一般不触达该恢复路径。
|
||||
*/
|
||||
class TimeSkewCommitCheckHandler(private val project: Project?) : CheckinHandler(), CommitCheck, DumbAware {
|
||||
|
||||
companion object {
|
||||
const val MAX_SKEW_MS: Long = 60_000L
|
||||
}
|
||||
|
||||
override fun getExecutionOrder(): CommitCheck.ExecutionOrder = CommitCheck.ExecutionOrder.EARLY
|
||||
|
||||
override fun isEnabled(): Boolean = true
|
||||
|
||||
override suspend fun runCheck(commitInfo: CommitInfo): CommitProblem? {
|
||||
val reference =
|
||||
withContext(Dispatchers.IO) {
|
||||
try {
|
||||
TimeSkewChecker.fetchReferenceEpochMillis()
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
if (reference == null) {
|
||||
return null
|
||||
}
|
||||
val local = System.currentTimeMillis()
|
||||
if (abs(local - reference) <= MAX_SKEW_MS) {
|
||||
return null
|
||||
}
|
||||
|
||||
val app = ApplicationManager.getApplication()
|
||||
val picked =
|
||||
if (app.isDispatchThread) {
|
||||
showSkewDialog(project)
|
||||
} else {
|
||||
val choice = AtomicInteger(0)
|
||||
app.invokeAndWait(
|
||||
{ choice.set(showSkewDialog(project)) },
|
||||
ModalityState.defaultModalityState(),
|
||||
)
|
||||
choice.get()
|
||||
}
|
||||
|
||||
return if (picked == 0) {
|
||||
null
|
||||
} else {
|
||||
TextCommitProblem("已取消提交:系统时间与网络时间相差超过 1 分钟。")
|
||||
}
|
||||
}
|
||||
|
||||
private fun showSkewDialog(project: Project?): Int {
|
||||
val title = "系统时间可能不准确"
|
||||
val message =
|
||||
"""
|
||||
本机时间与网络标准时间相差超过 1 分钟,可能导致提交记录时间异常。
|
||||
|
||||
建议校准:Windows「设置 → 时间和语言 → 日期和时间」中开启自动设置时间。
|
||||
|
||||
「确定」:继续本次提交;「取消」:中止本次提交(本地修改保留)。
|
||||
""".trimIndent()
|
||||
return Messages.showDialog(
|
||||
project,
|
||||
message,
|
||||
title,
|
||||
arrayOf("确定", "取消"),
|
||||
0,
|
||||
Messages.getWarningIcon(),
|
||||
null,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<idea-plugin>
|
||||
<id>com.huangzj.protoPlugin</id>
|
||||
<name>Idea-Plugin</name>
|
||||
<vendor email="support@example.com" url="https://example.com">huangzj</vendor>
|
||||
|
||||
<description><![CDATA[
|
||||
Parse <code>service</code> / <code>rpc</code> from Protocol Buffers files and generate
|
||||
Spring <code>@Cmd</code> command classes (e.g. <code>AbstractTypedPbCommand</code>) similar to comm-framework.
|
||||
Also: JPA from MySQL, JSON sample from Java class, JSON to Java POJO, project memo tool window,
|
||||
and pre-commit system time vs network time check.
|
||||
]]></description>
|
||||
|
||||
<depends>com.intellij.modules.platform</depends>
|
||||
<depends>com.intellij.java</depends>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<checkinHandlerFactory implementation="com.huangzj.protoplugin.vcs.CommitTimeCheckinHandlerFactory"/>
|
||||
<projectService serviceImplementation="com.huangzj.protoplugin.memo.MemoProjectService"/>
|
||||
<!-- id 与 MemoToolWindowFactory.TOOL_WINDOW_ID 保持一致 -->
|
||||
<toolWindow id="MyCustomMemo"
|
||||
factoryClass="com.huangzj.protoplugin.memo.MemoToolWindowFactory"
|
||||
anchor="right"
|
||||
secondary="true"
|
||||
canCloseContents="false"/>
|
||||
<intentionAction>
|
||||
<language>JAVA</language>
|
||||
<className>com.huangzj.protoplugin.json.ClassToJsonIntention</className>
|
||||
<category>Idea-Plugin</category>
|
||||
<descriptionDirectoryName>ClassToJsonIntention</descriptionDirectoryName>
|
||||
</intentionAction>
|
||||
</extensions>
|
||||
|
||||
<actions>
|
||||
<action id="ProtoPlugin.GenerateCmdFromProto"
|
||||
class="com.huangzj.protoplugin.ProtoCmdGeneratorAction"
|
||||
text="Proto转Java"
|
||||
description="解析当前 .proto 中的 service/rpc,生成带 @Cmd 的 Java 命令类">
|
||||
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
|
||||
<add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
|
||||
<add-to-group group-id="ToolsMenu" anchor="last"/>
|
||||
</action>
|
||||
<action id="ProtoPlugin.GenerateJpaFromMysql"
|
||||
class="com.huangzj.protoplugin.MysqlEntityFromFolderAction"
|
||||
text="mysql转Jpa"
|
||||
description="连接 MySQL,勾选表并生成带 jakarta.persistence 注解的实体类到所选目录">
|
||||
<add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
|
||||
<add-to-group group-id="ToolsMenu" anchor="last"/>
|
||||
</action>
|
||||
<action id="ProtoPlugin.JsonToJava"
|
||||
class="com.huangzj.protoplugin.json.JsonToJavaAction"
|
||||
text="Json转java"
|
||||
description="输入 JSON 与类名,在选中目录生成 Java Bean 源文件">
|
||||
<add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
|
||||
<add-to-group group-id="ToolsMenu" anchor="last"/>
|
||||
</action>
|
||||
<action id="ProtoPlugin.GenerateClassJson"
|
||||
class="com.huangzj.protoplugin.json.GenerateClassJsonEditorAction"
|
||||
text="生成类JSON(默认值)"
|
||||
description="根据光标所在类的字段生成带默认值的 JSON(与类名处意图相同)">
|
||||
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
|
||||
</action>
|
||||
<action id="ProtoPlugin.OpenMemo"
|
||||
class="com.huangzj.protoplugin.memo.OpenMemoToolWindowAction"
|
||||
text="我的自定义备忘录"
|
||||
description="打开「我的自定义备忘录」工具窗口(按项目保存)">
|
||||
<add-to-group group-id="ToolsMenu" anchor="last"/>
|
||||
</action>
|
||||
</actions>
|
||||
</idea-plugin>
|
||||
@@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<body>
|
||||
在类名上调用:确认后根据当前类的字段生成带默认值的 JSON,并在可复制的弹窗中展示。
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user