static long dataSize(O o) { return dataSize(o, new IdentityHashMap); } static long dataSize(Object o, IdentityHashMap seen) { if (o == null || seen.containsKey(o)) return 0; seen.put(o, Boolean.TRUE); long size = 12; // HotSpot header size Class c = o.getClass(); if (c.isArray()) { size += 4; // array size field int n = Array.getLength(o); size += n * dataSize_arrayElementSize(c.getComponentType()); if (!c.getComponentType().isPrimitive()) for (int i = 0; i < n; i++) size += dataSize(Array.get(o, i), seen); } else while (c != null) { Field[] fields = c.getDeclaredFields(); for (Field field : fields) { if ((field.getModifiers() & Modifier.STATIC) != 0) continue; if (field.getType().isPrimitive()) size += dataSize_primitiveSize(field.getType()); else { size += 4; // pointer Object value = null; try { field.setAccessible(true); value = field.get(o); } catch (IllegalAccessException e) { throw new RuntimeException(e); } size += dataSize(value, seen); } } c = c.getSuperclass(); } return size; } static long dataSize_primitiveSize(Class type) { if (type == boolean.class) return 4; if (type == int.class) return 4; if (type == long.class) return 8; if (type == float.class) return 4; if (type == short.class) return 4; if (type == char.class) return 4; if (type == byte.class) return 4; if (type == double.class) return 8; throw fail("woot? " + type); } static long dataSize_arrayElementSize(Class type) { if (type == boolean.class) return 1; if (type == int.class) return 4; if (type == long.class) return 8; if (type == float.class) return 4; if (type == short.class) return 2; if (type == char.class) return 2; if (type == byte.class) return 1; if (type == double.class) return 8; ret 4; // pointers }
Began life as a copy of #1000524 Took information from http://www.slideshare.net/cnbailey/memory-efficient-java This should be correct for 32bit VMs.
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1002038 |
| Snippet name: | dataSize function |
| Eternal ID of this version: | #1002038/1 |
| Text MD5: | eedf60ad07aec2ab9dd14781fd01aedd |
| Author: | stefan |
| Category: | |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2015-12-15 00:24:22 |
| Source code size: | 2168 bytes / 64 lines |
| Pitched / IR pitched: | No / Yes |
| Views / Downloads: | 892 / 1138 |
| Referenced in: | #1002427 - Accellerating 629 (SPIKE) #1006654 - Standard functions list 2 (LIVE, continuation of #761) #3000382 - Answer for ferdie (>> t = 1, f = 0) #3000383 - Answer for funkoverflow (>> t=1, f=0 okay) |