11<template >
22 <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 >
80110 </div >
81111 </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 >
90122 </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+
108134 </div >
109135 </div >
110136
@@ -748,133 +774,21 @@ const handleLogicChange = (logic: { id: string; enabled: boolean }) => {
748774 padding : 20px ;
749775}
750776
751- .memory-config-panel {
777+ .jvm- memory-visualizer .form-row {
752778 background : white ;
753779 padding : 20px ;
754780 border-radius : 8px ;
755781 box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
756782 margin-bottom : 20px ;
757783}
758784
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-
850785.memory-visualization {
851- width : 70% ;
852- margin : 0 ;
853786 padding : 20px ;
854787 background : white ;
855788 border-radius : 8px ;
856789 box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
857790}
858791
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-
878792.survivor-spaces {
879793 display : flex ;
880794 gap : 20px ;
@@ -893,8 +807,7 @@ const handleLogicChange = (logic: { id: string; enabled: boolean }) => {
893807}
894808
895809.operation-history {
896- width : 30% ;
897- margin : 0 ;
810+ margin-left : 20px ;
898811 background : white ;
899812 padding : 20px ;
900813 border-radius : 8px ;
@@ -906,7 +819,7 @@ const handleLogicChange = (logic: { id: string; enabled: boolean }) => {
906819 list-style : none ;
907820 padding : 0 ;
908821 margin : 0 ;
909- height : 500 px ;
822+ height : 535 px ;
910823 overflow-y : auto ;
911824 font-size : 13px ;
912825}
0 commit comments