You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/03/09 10:27:22 UTC

[07/50] [abbrv] ignite git commit: IGNITE-2726 Added missing off heap metrics for Visor Console.

IGNITE-2726 Added missing off heap metrics for Visor Console.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/c3f51685
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/c3f51685
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/c3f51685

Branch: refs/heads/ignite-1786
Commit: c3f5168555d94d1fe7bbc9cf32685ede48941638
Parents: 436c17e
Author: AKuznetsov <ak...@gridgain.com>
Authored: Mon Feb 29 11:31:58 2016 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Mon Feb 29 11:31:58 2016 +0700

----------------------------------------------------------------------
 .../ignite/internal/visor/cache/VisorCache.java |   2 +-
 .../cache/VisorCacheAggregatedMetrics.java      | 113 ++++++++++++++-----
 .../internal/visor/cache/VisorCacheMetrics.java |  88 +++++++--------
 .../cache/VisorCacheMetricsCollectorTask.java   |  21 +++-
 .../visor/cache/VisorCacheMetricsV2.java        |  66 +++++++++++
 .../internal/visor/cache/VisorCacheV2.java      |   2 +-
 .../commands/cache/VisorCacheCommand.scala      |  30 +++--
 7 files changed, 238 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/c3f51685/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
index 9115c0c..7cd0669 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCache.java
@@ -215,7 +215,7 @@ public class VisorCache implements Serializable {
         offHeapAllocatedSize = ca.offHeapAllocatedSize();
         offHeapEntriesCnt = ca.offHeapEntriesCount();
         partitions = ca.affinity().partitions();
-        metrics = VisorCacheMetrics.from(ignite, cacheName);
+        metrics = new VisorCacheMetrics().from(ignite, cacheName);
 
         estimateMemorySize(ignite, ca, sample);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c3f51685/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
index fba8a0d..0cba24b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheAggregatedMetrics.java
@@ -44,14 +44,23 @@ public class VisorCacheAggregatedMetrics implements Serializable {
     /** Node IDs with cache metrics. */
     private final Map<UUID, VisorCacheMetrics> metrics = new HashMap<>();
 
-    /** Minimum number of elements in the cache. */
-    private transient Integer minSize;
+    /** Minimum number of elements in heap. */
+    private transient Long minHeapSize;
 
-    /** Average number of elements in the cache. */
-    private transient Double avgSize;
+    /** Average number of elements in heap. */
+    private transient Double avgHeapSize;
 
-    /** Maximum number of elements in the cache. */
-    private transient Integer maxSize;
+    /** Maximum number of elements in heap. */
+    private transient Long maxHeapSize;
+
+    /** Minimum number of elements in off heap. */
+    private transient Long minOffHeapSize;
+
+    /** Average number of elements in off heap. */
+    private transient Double avgOffHeapSize;
+
+    /** Maximum number of elements in off heap. */
+    private transient Long maxOffHeapSize;
 
     /** Minimum hits of the owning cache. */
     private transient Long minHits;
@@ -148,47 +157,99 @@ public class VisorCacheAggregatedMetrics implements Serializable {
     }
 
     /**
-     * @return Minimum number of elements in the cache.
+     * @return Minimum number of elements in heap.
+     */
+    public long minimumHeapSize() {
+        if (minHeapSize == null) {
+            minHeapSize = Long.MAX_VALUE;
+
+            for (VisorCacheMetrics metric : metrics.values())
+                minHeapSize = Math.min(minHeapSize, metric.keySize());
+        }
+
+        return minHeapSize;
+    }
+
+    /**
+     * @return Average number of elements in heap.
+     */
+    public double averageHeapSize() {
+        if (avgHeapSize == null) {
+            avgHeapSize = 0.0d;
+
+            for (VisorCacheMetrics metric : metrics.values())
+                avgHeapSize += metric.keySize();
+
+            avgHeapSize /= metrics.size();
+        }
+
+        return avgHeapSize;
+    }
+
+    /**
+     * @return Maximum number of elements in heap.
+     */
+    public long maximumHeapSize() {
+        if (maxHeapSize == null) {
+            maxHeapSize = Long.MIN_VALUE;
+
+            for (VisorCacheMetrics metric : metrics.values())
+                maxHeapSize = Math.max(maxHeapSize, metric.keySize());
+        }
+
+        return maxHeapSize;
+    }
+
+    /**
+     * @param metric Metrics to process.
+     * @return Off heap entries count.
+     */
+    private long offHeapEntriesCount(VisorCacheMetrics metric) {
+        return metric instanceof VisorCacheMetricsV2 ? ((VisorCacheMetricsV2) metric).offHeapEntriesCount() : 0;
+    }
+
+    /**
+     * @return Minimum number of elements in off heap.
      */
-    public int minimumSize() {
-        if (minSize == null) {
-            minSize = Integer.MAX_VALUE;
+    public long minimumOffHeapSize() {
+        if (minOffHeapSize == null) {
+            minOffHeapSize = Long.MAX_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                minSize = Math.min(minSize, metric.keySize());
+                minOffHeapSize = Math.min(minOffHeapSize, offHeapEntriesCount(metric));
         }
 
-        return minSize;
+        return minOffHeapSize;
     }
 
     /**
-     * @return Average number of elements in the cache.
+     * @return Average number of elements in off heap.
      */
-    public double averageSize() {
-        if (avgSize == null) {
-            avgSize = 0.0d;
+    public double averageOffHeapSize() {
+        if (avgOffHeapSize == null) {
+            avgOffHeapSize = 0.0d;
 
             for (VisorCacheMetrics metric : metrics.values())
-                avgSize += metric.keySize();
+                avgOffHeapSize += offHeapEntriesCount(metric);
 
-            avgSize /= metrics.size();
+            avgOffHeapSize /= metrics.size();
         }
 
-        return avgSize;
+        return avgOffHeapSize;
     }
 
     /**
-     * @return Maximum number of elements in the cache.
+     * @return Maximum number of elements in off heap in the cache.
      */
-    public int maximumSize() {
-        if (maxSize == null) {
-            maxSize = Integer.MIN_VALUE;
+    public long maximumOffHeapSize() {
+        if (maxOffHeapSize == null) {
+            maxOffHeapSize = Long.MIN_VALUE;
 
             for (VisorCacheMetrics metric : metrics.values())
-                maxSize = Math.max(maxSize, metric.keySize());
+                maxOffHeapSize = Math.max(maxOffHeapSize, offHeapEntriesCount(metric));
         }
 
-        return maxSize;
+        return maxOffHeapSize;
     }
 
     /**
@@ -460,4 +521,4 @@ public class VisorCacheAggregatedMetrics implements Serializable {
     @Override public String toString() {
         return S.toString(VisorCacheAggregatedMetrics.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/c3f51685/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
index 2844c12..1a88813 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetrics.java
@@ -170,66 +170,64 @@ public class VisorCacheMetrics implements Serializable {
      * @param cacheName Cache name.
      * @return Data transfer object for given cache metrics.
      */
-    public static VisorCacheMetrics from(IgniteEx ignite, String cacheName) {
-        VisorCacheMetrics cm = new VisorCacheMetrics();
-
+    public VisorCacheMetrics from(IgniteEx ignite, String cacheName) {
         GridCacheProcessor cacheProcessor = ignite.context().cache();
 
         IgniteCache<Object, Object> c = cacheProcessor.jcache(cacheName);
 
-        cm.name = cacheName;
-        cm.mode = cacheProcessor.cacheMode(cacheName);
-        cm.sys = cacheProcessor.systemCache(cacheName);
+        name = cacheName;
+        mode = cacheProcessor.cacheMode(cacheName);
+        sys = cacheProcessor.systemCache(cacheName);
 
         CacheMetrics m = c.metrics();
 
-        cm.size = m.getSize();
-        cm.keySize = m.getKeySize();
+        size = m.getSize();
+        keySize = m.getKeySize();
 
-        cm.reads = m.getCacheGets();
-        cm.writes = m.getCachePuts() + m.getCacheRemovals();
-        cm.hits = m.getCacheHits();
-        cm.misses = m.getCacheMisses();
+        reads = m.getCacheGets();
+        writes = m.getCachePuts() + m.getCacheRemovals();
+        hits = m.getCacheHits();
+        misses = m.getCacheMisses();
 
-        cm.txCommits = m.getCacheTxCommits();
-        cm.txRollbacks = m.getCacheTxRollbacks();
+        txCommits = m.getCacheTxCommits();
+        txRollbacks = m.getCacheTxRollbacks();
 
-        cm.avgTxCommitTime = m.getAverageTxCommitTime();
-        cm.avgTxRollbackTime = m.getAverageTxRollbackTime();
+        avgTxCommitTime = m.getAverageTxCommitTime();
+        avgTxRollbackTime = m.getAverageTxRollbackTime();
 
-        cm.puts = m.getCachePuts();
-        cm.removals = m.getCacheRemovals();
-        cm.evictions = m.getCacheEvictions();
+        puts = m.getCachePuts();
+        removals = m.getCacheRemovals();
+        evictions = m.getCacheEvictions();
 
-        cm.avgReadTime = m.getAverageGetTime();
-        cm.avgPutTime = m.getAveragePutTime();
-        cm.avgRemovalTime = m.getAverageRemoveTime();
+        avgReadTime = m.getAverageGetTime();
+        avgPutTime = m.getAveragePutTime();
+        avgRemovalTime = m.getAverageRemoveTime();
 
-        cm.readsPerSec = perSecond(m.getAverageGetTime());
-        cm.putsPerSec = perSecond(m.getAveragePutTime());
-        cm.removalsPerSec = perSecond(m.getAverageRemoveTime());
-        cm.commitsPerSec = perSecond(m.getAverageTxCommitTime());
-        cm.rollbacksPerSec = perSecond(m.getAverageTxRollbackTime());
+        readsPerSec = perSecond(m.getAverageGetTime());
+        putsPerSec = perSecond(m.getAveragePutTime());
+        removalsPerSec = perSecond(m.getAverageRemoveTime());
+        commitsPerSec = perSecond(m.getAverageTxCommitTime());
+        rollbacksPerSec = perSecond(m.getAverageTxRollbackTime());
 
-        cm.qryMetrics = VisorCacheQueryMetrics.from(c.queryMetrics());
+        qryMetrics = VisorCacheQueryMetrics.from(c.queryMetrics());
 
-        cm.dhtEvictQueueCurrSize = m.getDhtEvictQueueCurrentSize();
-        cm.txThreadMapSize = m.getTxThreadMapSize();
-        cm.txXidMapSize = m.getTxXidMapSize();
-        cm.txCommitQueueSize = m.getTxCommitQueueSize();
-        cm.txPrepareQueueSize = m.getTxPrepareQueueSize();
-        cm.txStartVerCountsSize = m.getTxStartVersionCountsSize();
-        cm.txCommittedVersionsSize = m.getTxCommittedVersionsSize();
-        cm.txRolledbackVersionsSize = m.getTxRolledbackVersionsSize();
-        cm.txDhtThreadMapSize = m.getTxDhtThreadMapSize();
-        cm.txDhtXidMapSize = m.getTxDhtXidMapSize();
-        cm.txDhtCommitQueueSize = m.getTxDhtCommitQueueSize();
-        cm.txDhtPrepareQueueSize = m.getTxDhtPrepareQueueSize();
-        cm.txDhtStartVerCountsSize = m.getTxDhtStartVersionCountsSize();
-        cm.txDhtCommittedVersionsSize = m.getTxDhtCommittedVersionsSize();
-        cm.txDhtRolledbackVersionsSize = m.getTxDhtRolledbackVersionsSize();
+        dhtEvictQueueCurrSize = m.getDhtEvictQueueCurrentSize();
+        txThreadMapSize = m.getTxThreadMapSize();
+        txXidMapSize = m.getTxXidMapSize();
+        txCommitQueueSize = m.getTxCommitQueueSize();
+        txPrepareQueueSize = m.getTxPrepareQueueSize();
+        txStartVerCountsSize = m.getTxStartVersionCountsSize();
+        txCommittedVersionsSize = m.getTxCommittedVersionsSize();
+        txRolledbackVersionsSize = m.getTxRolledbackVersionsSize();
+        txDhtThreadMapSize = m.getTxDhtThreadMapSize();
+        txDhtXidMapSize = m.getTxDhtXidMapSize();
+        txDhtCommitQueueSize = m.getTxDhtCommitQueueSize();
+        txDhtPrepareQueueSize = m.getTxDhtPrepareQueueSize();
+        txDhtStartVerCountsSize = m.getTxDhtStartVersionCountsSize();
+        txDhtCommittedVersionsSize = m.getTxDhtCommittedVersionsSize();
+        txDhtRolledbackVersionsSize = m.getTxDhtRolledbackVersionsSize();
 
-        return cm;
+        return this;
     }
 
     /**
@@ -516,4 +514,4 @@ public class VisorCacheMetrics implements Serializable {
     @Override public String toString() {
         return S.toString(VisorCacheMetrics.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/c3f51685/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
index abed7db..4dd1e28 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.compute.ComputeJobResult;
 import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
 import org.apache.ignite.internal.processors.cache.IgniteCacheProxy;
@@ -30,6 +31,7 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
 import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -77,9 +79,13 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiT
      */
     private static class VisorCacheMetricsCollectorJob
         extends VisorJob<IgniteBiTuple<Boolean, Collection<String>>, Collection<VisorCacheMetrics>> {
+
         /** */
         private static final long serialVersionUID = 0L;
 
+        /** */
+        private static final IgniteProductVersion V2_SINCE = IgniteProductVersion.fromString("1.5.8");
+
         /**
          * Create job with given argument.
          *
@@ -114,7 +120,18 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiT
                 if (ca.context().started()) {
                     String cacheName = ca.getName();
 
-                    VisorCacheMetrics cm = VisorCacheMetrics.from(ignite, cacheName);
+                    boolean compatibilityMode = false;
+
+                    for (ClusterNode node : ignite.cluster().nodes()) {
+                        if (node.version().compareToIgnoreTimestamp(V2_SINCE) < 0) {
+                            compatibilityMode = true;
+
+                            break;
+                        }
+                    }
+
+                    VisorCacheMetrics cm = (compatibilityMode ? new VisorCacheMetrics() : new VisorCacheMetricsV2())
+                            .from(ignite, cacheName);
 
                     if ((allCaches || cacheNames.contains(cacheName)) && (showSysCaches || !cm.system()))
                         res.add(cm);
@@ -129,4 +146,4 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<IgniteBiT
             return S.toString(VisorCacheMetricsCollectorJob.class, this);
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/c3f51685/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsV2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsV2.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsV2.java
new file mode 100644
index 0000000..2376db0
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsV2.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.cache;
+
+import org.apache.ignite.cache.CacheMetrics;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
+import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
+
+/**
+ * Data transfer object for {@link CacheMetrics}.
+ */
+public class VisorCacheMetricsV2 extends VisorCacheMetrics {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Memory size allocated in off-heap. */
+    private long offHeapAllocatedSize;
+
+    /** Number of cache entries stored in off-heap memory. */
+    private long offHeapEntriesCount;
+
+    /** {@inheritDoc} */
+    @Override
+    public VisorCacheMetrics from(IgniteEx ignite, String cacheName) {
+        super.from(ignite, cacheName);
+
+        GridCacheProcessor cacheProcessor = ignite.context().cache();
+
+        GridCacheAdapter<Object, Object> c = cacheProcessor.internalCache(cacheName);
+
+        offHeapAllocatedSize = c.offHeapAllocatedSize();
+        offHeapEntriesCount = c.offHeapEntriesCount();
+
+        return this;
+    }
+
+    /**
+     * @return Memory size allocated in off-heap.
+     */
+    public long offHeapAllocatedSize() {
+        return offHeapAllocatedSize;
+    }
+
+    /**
+     * @return Number of cache entries stored in off-heap memory.
+     */
+    public long offHeapEntriesCount() {
+        return offHeapEntriesCount;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/c3f51685/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheV2.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheV2.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheV2.java
index 6b6aba2..61551cc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheV2.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheV2.java
@@ -41,7 +41,7 @@ public class VisorCacheV2 extends VisorCache {
         if (c != null && c instanceof VisorCacheV2) {
             GridCacheAdapter ca = ignite.context().cache().internalCache(cacheName);
 
-            // Cache was not started.
+            // Process only started caches.
             if (ca != null && ca.context().started())
                 ((VisorCacheV2)c).near = ca.context().isNear();
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/c3f51685/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
----------------------------------------------------------------------
diff --git a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
index 13b4e32..b6812c3 100644
--- a/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
+++ b/modules/visor-console/src/main/scala/org/apache/ignite/visor/commands/cache/VisorCacheCommand.scala
@@ -316,7 +316,7 @@ class VisorCacheCommand {
 
             val sumT = VisorTextTable()
 
-            sumT #= ("Name(@)", "Mode", "Nodes", "Entries", "Hits", "Misses", "Reads", "Writes")
+            sumT #= ("Name(@)", "Mode", "Nodes", "Entries (Heap / Off heap)", "Hits", "Misses", "Reads", "Writes")
 
             sortAggregatedData(aggrData, sortType.getOrElse("cn"), reversed).foreach(
                 ad => {
@@ -328,9 +328,12 @@ class VisorCacheCommand {
                         ad.mode(),
                         ad.nodes.size(),
                         (
-                            "min: " + ad.minimumSize,
-                            "avg: " + formatDouble(ad.averageSize),
-                            "max: " + ad.maximumSize
+                            "min: " + (ad.minimumHeapSize() + ad.minimumOffHeapSize()) +
+                                " (" + ad.minimumHeapSize() + " / " + ad.minimumOffHeapSize() + ")",
+                            "avg: " + formatDouble(ad.averageHeapSize() + ad.averageOffHeapSize()) +
+                                " (" + formatDouble(ad.averageHeapSize()) + " / " + formatDouble(ad.averageOffHeapSize()) + ")",
+                            "max: " + (ad.maximumHeapSize() + ad.maximumOffHeapSize()) +
+                                " (" + ad.maximumHeapSize() + " / " + ad.maximumOffHeapSize() + ")"
                             ),
                         (
                             "min: " + ad.minimumHits,
@@ -382,7 +385,13 @@ class VisorCacheCommand {
 
                     csT += ("Name(@)", cacheNameVar)
                     csT += ("Nodes", m.size())
-                    csT += ("Size Min/Avg/Max", ad.minimumSize + " / " + formatDouble(ad.averageSize) + " / " + ad.maximumSize)
+                    csT += ("Total size Min/Avg/Max", (ad.minimumHeapSize() + ad.minimumOffHeapSize()) + " / " +
+                        formatDouble(ad.averageHeapSize() + ad.averageOffHeapSize()) + " / " +
+                        (ad.maximumHeapSize() + ad.maximumOffHeapSize()))
+                    csT += ("  Heap size Min/Avg/Max", ad.minimumHeapSize() + " / " +
+                        formatDouble(ad.averageHeapSize()) + " / " + ad.maximumHeapSize())
+                    csT += ("  Off heap size Min/Avg/Max", ad.minimumOffHeapSize() + " / " +
+                        formatDouble(ad.averageOffHeapSize()) + " / " + ad.maximumOffHeapSize())
 
                     val ciT = VisorTextTable()
 
@@ -617,7 +626,7 @@ class VisorCacheCommand {
 
         val sumT = VisorTextTable()
 
-        sumT #= ("#", "Name(@)", "Mode", "Size")
+        sumT #= ("#", "Name(@)", "Mode", "Size (Heap / Off heap)")
 
         sortedAggrData.indices.foreach(i => {
             val ad = sortedAggrData(i)
@@ -630,9 +639,12 @@ class VisorCacheCommand {
                 mkCacheName(ad.name()),
                 ad.mode(),
                 (
-                    "min: " + ad.minimumSize,
-                    "avg: " + formatDouble(ad.averageSize),
-                    "max: " + ad.maximumSize
+                    "min: " + (ad.minimumHeapSize() + ad.minimumOffHeapSize()) +
+                        " (" + ad.minimumHeapSize() + " / " + ad.minimumOffHeapSize() + ")",
+                    "avg: " + formatDouble(ad.averageHeapSize() + ad.averageOffHeapSize()) +
+                        " (" + formatDouble(ad.averageHeapSize()) + " / " + formatDouble(ad.averageOffHeapSize()) + ")",
+                    "max: " + (ad.maximumHeapSize() + ad.maximumOffHeapSize()) +
+                        " (" + ad.maximumHeapSize() + " / " + ad.maximumOffHeapSize() + ")"
                 ))
         })