1
1
<template >
2
2
<div class =" jvm-memory-visualizer" >
3
- <!-- 内存配置区域 -->
4
- <a-form :model =" jvmArgs" layout =" inline" class =" memory-config-panel" >
5
- <a-form-item field =" value" label =" JVM 参数:" style =" flex : 1 ;" :help =" jvmArgs.error" >
6
- <a-input v-model =" jvmArgs.value" placeholder =" 例如: -Xms512m -Xmx1024m" />
7
- </a-form-item >
8
- <a-form-item >
9
- <a-button @click =" showArgsHelp" style =" margin : 0 10px " >参数说明</a-button >
10
- </a-form-item >
11
- <a-form-item >
12
- <a-button @click =" restartJvm" class =" restart-button" :loading =" isRestarting" >重启 JVM</a-button >
13
- </a-form-item >
14
- <a-form-item >
15
- <a-button @click =" showLogicTable" >内存管理逻辑</a-button >
16
- </a-form-item >
17
- </a-form >
18
-
19
- <!-- 对象创建表单 -->
20
- <a-form ref =" newObjectFormRef" layout =" inline" :model =" newObject" class =" control-panel" >
21
- <a-form-item field =" name" label =" 对象名称:" style =" flex : 1 ;" >
22
- <a-input v-model =" newObject.name" placeholder =" 输入对象名称" />
23
- </a-form-item >
24
- <a-form-item field =" size" label =" 对象大小:" style =" flex : 1 ;" >
25
- <a-input-number v-model =" newObject.size" :min =" 1" placeholder =" 输入对象大小" />
26
- <a-select v-model =" newObject.unit" style =" margin-left : 10px ; width : 100px ;" >
27
- <a-option value =" B" >B</a-option >
28
- <a-option value =" KB" >KB</a-option >
29
- <a-option value =" MB" >MB</a-option >
30
- </a-select >
31
- </a-form-item >
32
- <a-form-item field =" isGarbageCollectable" >
33
- <a-switch v-model =" newObject.isGarbageCollectable" >
34
- <template #checked >可回收</template >
35
- <template #unchecked >不可回收</template >
36
- </a-switch >
37
- </a-form-item >
38
- <a-form-item >
39
- <a-dropdown trigger =" hover" @click =" createObject" :disabled =" !isValidObject || isRestarting" >
40
- <a-button >创建对象</a-button >
41
- <template #content >
42
- <a-doption @click =" createObjects(5)" >5 个对象</a-doption >
43
- <a-doption @click =" createObjects(10)" >10 个对象</a-doption >
44
- </template >
45
- </a-dropdown >
46
- </a-form-item >
47
- </a-form >
48
-
49
- <!-- 内存区域可视化 -->
50
- <div class =" memory-container" >
51
- <div class =" memory-visualization" >
52
- <h2 >堆内存</h2 >
53
- <div class =" memory-regions" >
54
- <!-- 新生代 -->
55
- <div class =" young-gen" >
56
- <h3 >新生代 ({{ formatBytes(youngGenSize) }})</h3 >
57
-
58
- <!-- Eden区 -->
59
- <MemorySpace class =" eden-space" space-name =" Eden Space" :total-size =" edenSize"
60
- :used-size =" getSpaceUsed(MEMORY_SPACE.EDEN)"
61
- :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.EDEN)"
62
- :getObjectStyle =" getObjectStyle" @toggleGarbageCollectable =" toggleGarbageCollectable" >
63
- </MemorySpace >
64
-
65
- <!-- Survivor区 -->
66
- <div class =" survivor-spaces" >
67
- <MemorySpace class =" survivor-space" space-name =" Survivor 0"
68
- :space-desc =" currentFromSpace === MEMORY_SPACE.SURVIVOR_0 ? 'From区' : 'To区'"
69
- :total-size =" survivorSize" :used-size =" getSpaceUsed(MEMORY_SPACE.SURVIVOR_0)"
70
- :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.SURVIVOR_0)"
71
- :getObjectStyle =" getObjectStyle" @toggleGarbageCollectable =" toggleGarbageCollectable" >
72
- </MemorySpace >
73
-
74
- <MemorySpace class =" survivor-space" space-name =" Survivor 1"
75
- :space-desc =" currentFromSpace === MEMORY_SPACE.SURVIVOR_1 ? 'From区' : 'To区'"
76
- :total-size =" survivorSize" :used-size =" getSpaceUsed(MEMORY_SPACE.SURVIVOR_1)"
77
- :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.SURVIVOR_1)"
78
- :getObjectStyle =" getObjectStyle" @toggleGarbageCollectable =" toggleGarbageCollectable" >
79
- </MemorySpace >
3
+ <a-space direction =" vertical" :size =" 16" style =" display : block ;" >
4
+ <a-row class =" form-row" >
5
+ <a-col :span =" 24" >
6
+ <!-- 内存配置区域 -->
7
+ <a-form :model =" jvmArgs" layout =" inline" class =" memory-config-panel" >
8
+ <a-form-item field =" value" label =" JVM 参数:" style =" flex : 1 ;" :help =" jvmArgs.error" >
9
+ <a-input v-model =" jvmArgs.value" placeholder =" 例如: -Xms512m -Xmx1024m" />
10
+ </a-form-item >
11
+ <a-form-item >
12
+ <a-button @click =" showArgsHelp" style =" margin : 0 10px " >参数说明</a-button >
13
+ </a-form-item >
14
+ <a-form-item >
15
+ <a-button @click =" restartJvm" class =" restart-button" :loading =" isRestarting" >重启
16
+ JVM</a-button >
17
+ </a-form-item >
18
+ <a-form-item >
19
+ <a-button @click =" showLogicTable" >内存管理逻辑</a-button >
20
+ </a-form-item >
21
+ </a-form >
22
+ </a-col >
23
+ </a-row >
24
+ <a-row class =" form-row" >
25
+ <a-col :span =" 24" >
26
+ <!-- 对象创建表单 -->
27
+ <a-form ref =" newObjectFormRef" layout =" inline" :model =" newObject" class =" control-panel" >
28
+ <a-form-item field =" name" label =" 对象名称:" style =" flex : 1 ;" >
29
+ <a-input v-model =" newObject.name" placeholder =" 输入对象名称" />
30
+ </a-form-item >
31
+ <a-form-item field =" size" label =" 对象大小:" style =" flex : 1 ;" >
32
+ <a-input-number v-model =" newObject.size" :min =" 1" placeholder =" 输入对象大小" />
33
+ <a-select v-model =" newObject.unit" style =" margin-left : 10px ; width : 100px ;" >
34
+ <a-option value =" B" >B</a-option >
35
+ <a-option value =" KB" >KB</a-option >
36
+ <a-option value =" MB" >MB</a-option >
37
+ </a-select >
38
+ </a-form-item >
39
+ <a-form-item field =" isGarbageCollectable" >
40
+ <a-switch v-model =" newObject.isGarbageCollectable" >
41
+ <template #checked >可回收</template >
42
+ <template #unchecked >不可回收</template >
43
+ </a-switch >
44
+ </a-form-item >
45
+ <a-form-item >
46
+ <a-dropdown trigger =" hover" @click =" createObject"
47
+ :disabled =" !isValidObject || isRestarting" >
48
+ <a-button >创建对象</a-button >
49
+ <template #content >
50
+ <a-doption @click =" createObjects(5)" >5 个对象</a-doption >
51
+ <a-doption @click =" createObjects(10)" >10 个对象</a-doption >
52
+ </template >
53
+ </a-dropdown >
54
+ </a-form-item >
55
+ </a-form >
56
+ </a-col >
57
+ </a-row >
58
+ <a-row class =" memory-container" >
59
+ <!-- 内存区域可视化 -->
60
+ <a-col :span =" 16" >
61
+ <div class =" memory-visualization" >
62
+ <h2 >堆内存</h2 >
63
+ <div class =" memory-regions" >
64
+ <!-- 新生代 -->
65
+ <div class =" young-gen" >
66
+ <h3 >新生代 ({{ formatBytes(youngGenSize) }})</h3 >
67
+
68
+ <!-- Eden区 -->
69
+ <MemorySpace class =" eden-space" space-name =" Eden Space" :total-size =" edenSize"
70
+ :used-size =" getSpaceUsed(MEMORY_SPACE.EDEN)"
71
+ :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.EDEN)"
72
+ :getObjectStyle =" getObjectStyle"
73
+ @toggleGarbageCollectable =" toggleGarbageCollectable" >
74
+ </MemorySpace >
75
+
76
+ <!-- Survivor区 -->
77
+ <div class =" survivor-spaces" >
78
+ <MemorySpace class =" survivor-space" space-name =" Survivor 0"
79
+ :space-desc =" currentFromSpace === MEMORY_SPACE.SURVIVOR_0 ? 'From区' : 'To区'"
80
+ :total-size =" survivorSize" :used-size =" getSpaceUsed(MEMORY_SPACE.SURVIVOR_0)"
81
+ :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.SURVIVOR_0)"
82
+ :getObjectStyle =" getObjectStyle"
83
+ @toggleGarbageCollectable =" toggleGarbageCollectable" >
84
+ </MemorySpace >
85
+
86
+ <MemorySpace class =" survivor-space" space-name =" Survivor 1"
87
+ :space-desc =" currentFromSpace === MEMORY_SPACE.SURVIVOR_1 ? 'From区' : 'To区'"
88
+ :total-size =" survivorSize" :used-size =" getSpaceUsed(MEMORY_SPACE.SURVIVOR_1)"
89
+ :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.SURVIVOR_1)"
90
+ :getObjectStyle =" getObjectStyle"
91
+ @toggleGarbageCollectable =" toggleGarbageCollectable" >
92
+ </MemorySpace >
93
+ </div >
94
+ </div >
95
+ <!-- 老年代 -->
96
+ <div class =" old-gen" >
97
+ <h3 >老年代 ({{ formatBytes(oldGenSize) }})</h3 >
98
+ <MemorySpace class =" old-gen" space-name =" Old Gen" :total-size =" oldGenSize"
99
+ :used-size =" getSpaceUsed(MEMORY_SPACE.OLD_GEN)"
100
+ :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.OLD_GEN)"
101
+ :getObjectStyle =" getObjectStyle"
102
+ @toggleGarbageCollectable =" toggleGarbageCollectable" >
103
+ </MemorySpace >
104
+ </div >
105
+ </div >
106
+ <div class =" memory-info" >
107
+ <p >总容量: {{ formatBytes(heapSize) }}</p >
108
+ <p >已使用: {{ formatBytes(usedHeapSize) }}</p >
109
+ <p >剩余空间: {{ formatBytes(heapSize - usedHeapSize) }}</p >
80
110
</div >
81
111
</div >
82
- <!-- 老年代 -->
83
- <div class =" old-gen" >
84
- <h3 >老年代 ({{ formatBytes(oldGenSize) }})</h3 >
85
- <MemorySpace class =" old-gen" space-name =" Old Gen" :total-size =" oldGenSize"
86
- :used-size =" getSpaceUsed(MEMORY_SPACE.OLD_GEN)"
87
- :heapObjects =" heapObjects.filter(o => o.space === MEMORY_SPACE.OLD_GEN)"
88
- :getObjectStyle =" getObjectStyle" @toggleGarbageCollectable =" toggleGarbageCollectable" >
89
- </MemorySpace >
112
+ </a-col >
113
+ <!-- 运行日志 -->
114
+ <a-col :span =" 8" >
115
+ <div class =" operation-history" >
116
+ <h2 >运行日志</h2 >
117
+ <ul >
118
+ <li v-for =" (log, index) in operationLogs" :key =" index" >
119
+ {{ log }}
120
+ </li >
121
+ </ul >
90
122
</div >
91
- </div >
92
- <div class =" memory-info" >
93
- <p >总容量: {{ formatBytes(heapSize) }}</p >
94
- <p >已使用: {{ formatBytes(usedHeapSize) }}</p >
95
- <p >剩余空间: {{ formatBytes(heapSize - usedHeapSize) }}</p >
96
- </div >
97
- </div >
98
-
99
- <!-- 运行日志 -->
100
- <div class =" operation-history" >
101
- <h2 >运行日志</h2 >
102
- <ul >
103
- <li v-for =" (log, index) in operationLogs" :key =" index" >
104
- {{ log }}
105
- </li >
106
- </ul >
107
- </div >
123
+ </a-col >
124
+ </a-row >
125
+ </a-space >
126
+ </div >
127
+
128
+ <div class =" jvm-memory-visualizer" >
129
+
130
+ <div class =" memory-container" >
131
+
132
+
133
+
108
134
</div >
109
135
</div >
110
136
@@ -748,133 +774,21 @@ const handleLogicChange = (logic: { id: string; enabled: boolean }) => {
748
774
padding : 20px ;
749
775
}
750
776
751
- .memory-config-panel {
777
+ .jvm- memory-visualizer .form-row {
752
778
background : white ;
753
779
padding : 20px ;
754
780
border-radius : 8px ;
755
781
box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
756
782
margin-bottom : 20px ;
757
783
}
758
784
759
- .config-group {
760
- display : flex ;
761
- gap : 20px ;
762
- flex-wrap : wrap ;
763
- }
764
-
765
- .config-item {
766
- flex : 1 ;
767
- min-width : 200px ;
768
- }
769
-
770
- .config-item label {
771
- display : block ;
772
- margin-bottom : 5px ;
773
- }
774
-
775
- .config-item .size-input-group {
776
- display : flex ;
777
- align-items : center ;
778
- gap : 10px ;
779
- }
780
-
781
- .config-item input {
782
- flex : 1 ;
783
- padding : 8px ;
784
- border : 1px solid #ddd ;
785
- border-radius : 4px ;
786
- }
787
-
788
- .config-item .unit {
789
- width : 30px ;
790
- color : #666 ;
791
- }
792
-
793
- .control-panel {
794
- background : white ;
795
- padding : 20px ;
796
- border-radius : 8px ;
797
- box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
798
- margin-bottom : 20px ;
799
- display : flex ;
800
- flex-wrap : wrap ;
801
- gap : 20px ;
802
- }
803
-
804
- .memory-container {
805
- display : flex ;
806
- gap : 20px ;
807
- width : 100% ;
808
- }
809
-
810
- .form-group {
811
- flex : 1 ;
812
- }
813
-
814
- .form-group label {
815
- display : block ;
816
- margin-bottom : 5px ;
817
- }
818
-
819
- .form-group input {
820
- width : 100% ;
821
- padding : 8px ;
822
- padding-right : 0px ;
823
- border : 1px solid #ddd ;
824
- border-radius : 4px ;
825
- }
826
-
827
- .error-message {
828
- color : #dc3545 ;
829
- font-size : 0.875em ;
830
- margin-top : 5px ;
831
- }
832
-
833
- .size-input-group {
834
- display : flex ;
835
- gap : 10px ;
836
- }
837
-
838
- .size-input-group input {
839
- flex : 1 ;
840
- }
841
-
842
- .size-input-group select {
843
- width : 80px ;
844
- padding : 8px ;
845
- border : 1px solid #ddd ;
846
- border-radius : 4px ;
847
- background-color : white ;
848
- }
849
-
850
785
.memory-visualization {
851
- width : 70% ;
852
- margin : 0 ;
853
786
padding : 20px ;
854
787
background : white ;
855
788
border-radius : 8px ;
856
789
box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
857
790
}
858
791
859
- .memory-regions {
860
- margin : 20px 0 ;
861
- width : 100% ;
862
- }
863
-
864
- .young-gen ,
865
- .old-gen {
866
- background : #fff ;
867
- border-radius : 8px ;
868
- margin-bottom : 20px ;
869
- box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.05 );
870
- width : 100% ;
871
- }
872
-
873
- .eden-space ,
874
- .survivor-space {
875
- margin : 10px 0 ;
876
- }
877
-
878
792
.survivor-spaces {
879
793
display : flex ;
880
794
gap : 20px ;
@@ -893,8 +807,7 @@ const handleLogicChange = (logic: { id: string; enabled: boolean }) => {
893
807
}
894
808
895
809
.operation-history {
896
- width : 30% ;
897
- margin : 0 ;
810
+ margin-left : 20px ;
898
811
background : white ;
899
812
padding : 20px ;
900
813
border-radius : 8px ;
@@ -906,7 +819,7 @@ const handleLogicChange = (logic: { id: string; enabled: boolean }) => {
906
819
list-style : none ;
907
820
padding : 0 ;
908
821
margin : 0 ;
909
- height : 500 px ;
822
+ height : 535 px ;
910
823
overflow-y : auto ;
911
824
font-size : 13px ;
912
825
}
0 commit comments