blob: 45c9012494589d0013cf4391c27452c5913cac84 [file] [log] [blame]
<!--
Copyright (c) 2020 Contributors to the Eclipse Foundation
See the NOTICE file(s) distributed with this work for additional
information regarding copyright ownership.
This program and the accompanying materials are made available under the
terms of the Eclipse Public License 2.0 which is available at
http://www.eclipse.org/legal/epl-2.0
SPDX-License-Identifier: EPL-2.0
-->
<template xmlns:v-contextmenu="http://www.w3.org/1999/xhtml">
<div>
<v-contextmenu ref="contextmenu">
<v-contextmenu-submenu :title="$t('jifa.heap.ref.object.label')"
v-if="selectedBigObject && selectedBigObject.objectId >=0">
<v-contextmenu-item
@click="$emit('outgoingRefsOfObj', selectedBigObject.objectId, selectedBigObject.label)">
{{$t('jifa.heap.ref.object.outgoing')}}
</v-contextmenu-item>
<v-contextmenu-item
@click="$emit('incomingRefsOfObj', selectedBigObject.objectId, selectedBigObject.label)">
{{$t('jifa.heap.ref.object.incoming')}}
</v-contextmenu-item>
</v-contextmenu-submenu>
<v-contextmenu-submenu :title="$t('jifa.heap.ref.type.label')"
v-if="this.selectedBigObject && this.selectedBigObject.objectId >=0">
<v-contextmenu-submenu :title="$t('jifa.heap.ref.type.label')">
<v-contextmenu-item
@click="$emit('outgoingRefsOfClass', contextMenuTargetObjectId, contextMenuTargetObjectLabel)">
{{$t('jifa.heap.ref.type.outgoing')}}
</v-contextmenu-item>
<v-contextmenu-item
@click="$emit('incomingRefsOfClass', selectedBigObject.objectId, selectedBigObject.label())">
{{$t('jifa.heap.ref.type.incoming')}}
</v-contextmenu-item>
</v-contextmenu-submenu>
</v-contextmenu-submenu>
<v-contextmenu-item divider v-if="selectedBigObject && selectedBigObject.objectId >=0"></v-contextmenu-item>
<v-contextmenu-item
v-if="selectedBigObject && selectedBigObject.objectId >=0"
@click="$emit('pathToGCRootsOfObj', selectedBigObject.objectId, selectedBigObject.label)">
{{$t('jifa.heap.pathToGCRoots')}}
</v-contextmenu-item>
</v-contextmenu>
<el-collapse v-model="activeNames" style="width: 100%;">
<el-collapse-item v-loading="loading" :title="$t('jifa.heap.basicInformation')" name="1">
<el-table v-loading="loading"
:data="details"
:show-header="false"
:highlight-current-row="false"
stripe
:cell-style='cellStyle'
height="280px"
>
<el-table-column prop="key" width="300px">
</el-table-column>
<el-table-column prop="value">
</el-table-column>
</el-table>
</el-collapse-item>
<el-collapse-item v-loading="loading" title='Biggest Objects by Retained Size' name="2">
<doughnut-chart :chart-data="chartData" :options="chartOptions" v-contextmenu:contextmenu></doughnut-chart>
<p style='margin-top: 20px; margin-bottom: -20px; font-size: 13px; font-weight: 500; color: #606266;'>
{{selectedBigObject ? buildSelectedBigObjectInfo() : $t("jifa.heap.usedHeapSize") + ': '
+toSizeString(totalSize)}}
</p>
</el-collapse-item>
</el-collapse>
</div>
</template>
<script>
import DoughnutChart from '../charts/DoughnutChart'
import axios from 'axios'
import {heapDumpService, toCountString, toSizeString} from '../../util'
import {formatDate} from 'element-ui/src/utils/date-util'
import {a2rgb, PIE_COLORS, REMAINDER_COLOR} from "./ColorHelper";
export default {
props: ['file'],
components: {
DoughnutChart
},
methods: {
toSizeString,
selectBigObject(event, elements) {
if (elements.length > 0) {
let index = elements[0]._index
this.selectedBigObject = this.bigObjects[index]
this.$emit("setSelectedObjectId", this.selectedBigObject.objectId)
} else {
this.selectedBigObject = null
}
},
buildSelectedBigObjectInfo() {
let obj = this.selectedBigObject
return obj.label + ' [' + toSizeString(obj.value) + ', '
+ ((obj.value) / this.totalSize * 100).toPrecision(3) + '%]'
}
},
data() {
return {
loading: false,
activeNames: ['1', '2'],
details: null,
totalSize: 0,
selectedBigObject: null,
cellStyle: {padding: '8px'},
bigObjects: [],
chartData: {},
chartOptions: {
legend: false,
responsive: true,
maintainAspectRatio: false,
pieceLabel: {
mode: 'percentage',
precision: 1
},
animation: {
// animateScale: true,
// easing: 'linear'
},
onClick: this.selectBigObject
}
};
},
created() {
this.loading = true
axios.get(heapDumpService(this.file, 'details')).then(resp => {
this.$emit("setGenerationInfoAvailable", resp.data.generationInfoAvailable)
this.totalSize = resp.data.usedHeapSize
this.details = [
{
key: this.$t("jifa.heap.usedHeapSize"),
value: toSizeString(resp.data.usedHeapSize)
},
{
key: this.$t("jifa.heap.numberOfClasses"),
value: toCountString(resp.data.numberOfClasses)
},
{
key: this.$t("jifa.heap.numberOfObjects"),
value: toCountString(resp.data.numberOfObjects)
},
{
key: this.$t("jifa.heap.numberOfClassLoaders"),
value: toCountString(resp.data.numberOfClassLoaders)
},
{
key: this.$t("jifa.heap.numberOfGCRoots"),
value: toCountString(resp.data.numberOfGCRoots)
},
{
key: this.$t("jifa.heap.heapCreationDate"),
value: formatDate(new Date(resp.data.creationDate), 'yyyy-MM-dd HH:mm:ss')
},
{
key: this.$t("jifa.heap.OSBit"),
value: resp.data.identifierSize === 8 ? '64 bit' : '32 bit'
},
]
axios.get(heapDumpService(this.file, 'biggestObjects')).then(resp => {
this.bigObjects = resp.data;
let labels = []
let data = []
for (let i = 0; i < resp.data.length; i++) {
labels.push(this.bigObjects[i].label)
data.push(this.bigObjects[i].value)
}
let color = []
for (let i = 0; i < resp.data.length - 1; i++) {
color.push(a2rgb(PIE_COLORS[i % PIE_COLORS.length]))
}
if (this.bigObjects[this.bigObjects.length - 1].objectId === -1
|| this.bigObjects[this.bigObjects.length - 1].label === 'Remainder') {
color.push(a2rgb(REMAINDER_COLOR))
} else {
color.push(a2rgb((this.bigObjects.length - 1) % PIE_COLORS.length))
}
this.chartData = {
labels: labels,
datasets: [
{
backgroundColor: color,
data: data,
}
]
}
this.loading = false
}).catch(() => {
this.chartData = {}
})
})
}
};
</script>