You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/05/08 07:53:53 UTC
[2/4] tajo git commit: TAJO-1523 ClassSize should consider compressed
oops
TAJO-1523 ClassSize should consider compressed oops
Signed-off-by: Hyunsik Choi <hy...@apache.org>
Closes #508
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/2b4c1610
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/2b4c1610
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/2b4c1610
Branch: refs/heads/index_support
Commit: 2b4c1610d2e60dfc9c50fbfdac22e12870c17163
Parents: fab6390
Author: navis.ryu <na...@apache.org>
Authored: Sat Apr 4 16:56:05 2015 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Thu May 7 15:30:08 2015 -0700
----------------------------------------------------------------------
.../java/org/apache/tajo/util/ClassSize.java | 18 ++++++++++---
.../java/org/apache/tajo/util/UnsafeUtil.java | 28 ++++++++++++++++++++
2 files changed, 42 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/2b4c1610/tajo-common/src/main/java/org/apache/tajo/util/ClassSize.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/ClassSize.java b/tajo-common/src/main/java/org/apache/tajo/util/ClassSize.java
index 708eae9..ab2fdf5 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/ClassSize.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/ClassSize.java
@@ -22,6 +22,7 @@ package org.apache.tajo.util;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import sun.misc.Unsafe;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
@@ -141,10 +142,19 @@ public class ClassSize {
*/
static {
//Default value is set to 8, covering the case when arcModel is unknown
- if (is32BitJVM()) {
- REFERENCE = 4;
- } else {
- REFERENCE = 8;
+ switch (UnsafeUtil.ADDRESS_MODE) {
+ case MEM_32BIT:
+ REFERENCE = 4;
+ break;
+ case MEM_64BIT:
+ REFERENCE = 8;
+ break;
+ case MEM_64BIT_COMPRESSED_OOPS:
+ REFERENCE = 4;
+ break;
+ default:
+ REFERENCE = is32BitJVM() ? 4 : 8;
+ break;
}
OBJECT = 2 * REFERENCE;
http://git-wip-us.apache.org/repos/asf/tajo/blob/2b4c1610/tajo-common/src/main/java/org/apache/tajo/util/UnsafeUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/UnsafeUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/UnsafeUtil.java
index 9d6b9b3..ff6072e 100644
--- a/tajo-common/src/main/java/org/apache/tajo/util/UnsafeUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/util/UnsafeUtil.java
@@ -28,6 +28,21 @@ import java.nio.ByteBuffer;
public class UnsafeUtil {
public static final Unsafe unsafe;
+ // copied from
+ // http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object
+ public static enum AddressMode {
+ /** Unknown address mode. Size calculations may be unreliable. */
+ UNKNOWN,
+ /** 32-bit address mode using 32-bit references. */
+ MEM_32BIT,
+ /** 64-bit address mode using 64-bit references. */
+ MEM_64BIT,
+ /** 64-bit address mode using 32-bit compressed references. */
+ MEM_64BIT_COMPRESSED_OOPS
+ }
+
+ public static final AddressMode ADDRESS_MODE;
+
// offsets
public static final int ARRAY_BOOLEAN_BASE_OFFSET;
public static final int ARRAY_BYTE_BASE_OFFSET;
@@ -83,6 +98,19 @@ public class UnsafeUtil {
ARRAY_FLOAT_INDEX_SCALE = unsafe.arrayIndexScale(float[].class);
ARRAY_DOUBLE_INDEX_SCALE = unsafe.arrayIndexScale(double[].class);
ARRAY_OBJECT_INDEX_SCALE = unsafe.arrayIndexScale(Object[].class);
+
+ int addressSize = unsafe.addressSize();
+ int referenceSize = unsafe.arrayIndexScale(Object[].class);
+
+ if (addressSize == 4) {
+ ADDRESS_MODE = AddressMode.MEM_32BIT;
+ } else if (addressSize == 8 && referenceSize == 8) {
+ ADDRESS_MODE = AddressMode.MEM_64BIT;
+ } else if (addressSize == 8 && referenceSize == 4) {
+ ADDRESS_MODE = AddressMode.MEM_64BIT_COMPRESSED_OOPS;
+ } else {
+ ADDRESS_MODE = AddressMode.UNKNOWN;
+ }
}
public static int alignedSize(int size) {