| /******************************************************************************** |
| * 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 |
| ********************************************************************************/ |
| package org.eclipse.jifa.worker.route.heapdump; |
| |
| import org.eclipse.jifa.common.vo.PageView; |
| import org.eclipse.jifa.common.request.PagingRequest; |
| import org.eclipse.jifa.common.util.PageViewBuilder; |
| import org.eclipse.jifa.worker.route.ParamKey; |
| import org.eclipse.jifa.worker.route.RouteMeta; |
| import org.eclipse.jifa.worker.support.Analyzer; |
| import org.eclipse.jifa.worker.support.heapdump.HeapDumpSupport; |
| import org.eclipse.jifa.worker.vo.heapdump.HeapObject; |
| import io.vertx.core.Future; |
| import org.eclipse.mat.snapshot.ISnapshot; |
| import org.eclipse.mat.snapshot.model.IObject; |
| |
| import static org.eclipse.jifa.common.util.Assertion.ASSERT; |
| |
| class ObjectListRoute extends HeapBaseRoute { |
| |
| private static void fill(Future<PageView<HeapObject>> future, ISnapshot snapshot, int src, int[] objId, |
| PagingRequest pagingRequest, boolean outbound) { |
| future.complete(PageViewBuilder.build(objId, pagingRequest, id -> { |
| try { |
| HeapObject o = new HeapObject(); |
| IObject object = snapshot.getObject(id); |
| o.setObjectId(id); |
| o.setLabel(object.getDisplayName()); |
| o.setShallowSize(object.getUsedHeapSize()); |
| o.setRetainedSize(object.getRetainedHeapSize()); |
| o.setObjectType(HeapObject.Type.typeOf(object)); |
| o.setGCRoot(snapshot.isGCRoot(id)); |
| o.setHasOutbound(true); |
| o.setHasInbound(true); |
| o.setPrefix(HeapDumpSupport.prefix(snapshot, outbound ? src : id, outbound ? id : src)); |
| o.setSuffix(HeapDumpSupport.suffix(snapshot, id)); |
| return o; |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| })); |
| } |
| |
| @RouteMeta(path = "/outbounds") |
| void outbounds(Future<PageView<HeapObject>> future, @ParamKey("file") String file, PagingRequest pagingRequest, |
| @ParamKey("objectId") int objectId) throws Exception { |
| |
| ASSERT.isTrue(objectId >= 0, "Object id must be greater than or equal to 0"); |
| |
| ISnapshot snapshot = Analyzer.getOrOpenSnapshotContext(file).getSnapshot(); |
| int[] objId = snapshot.getOutboundReferentIds(objectId); |
| fill(future, snapshot, objectId, objId, pagingRequest, true); |
| } |
| |
| @RouteMeta(path = "/inbounds") |
| void inbounds(Future<PageView<HeapObject>> future, @ParamKey("file") String file, PagingRequest pagingRequest, |
| @ParamKey("objectId") int objectId) throws Exception { |
| |
| ASSERT.isTrue(objectId >= 0, "Object id must be greater than or equal to 0"); |
| |
| ISnapshot snapshot = Analyzer.getOrOpenSnapshotContext(file).getSnapshot(); |
| int[] objId = snapshot.getInboundRefererIds(objectId); |
| fill(future, snapshot, objectId, objId, pagingRequest, false); |
| } |
| } |