import java.util.ArrayList;
import java.util.List;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
class HelloWorld
{
static final Unsafe unsafe = getUnsafe();
static final boolean is64bit = true;
private static class OBJ {
int one;
public OBJ() {
this.one = 1;
this.two = "two";
}
}
public static void do_it(OBJ o) {
System.
out.
println("o.two is: " + o.
two); }
public static void main
(String[] args
) {
List<OBJ> list = new ArrayList<>();
list.add(new OBJ());
list.add(new OBJ());
list.add(new OBJ());
OBJ x = list.get(2);
printAddresses("Address x", x);
for (int idx = 0; idx < 1000000; idx++) {
list.add(new OBJ());
}
OBJ x2 = list.get(2);
x2.two = "haha";
printAddresses("Address x", x);
do_it(x);
}
public static void printAddresses
(String label,
Object...
objects) { System.
out.
print(label
+ ": 0x"); long last = 0;
int offset = unsafe.arrayBaseOffset(objects.getClass());
int scale = unsafe.arrayIndexScale(objects.getClass());
switch (scale) {
case 4:
long factor = is64bit ? 8 : 1;
final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor;
last = i1;
for (int i = 1; i < objects.length; i++) {
final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor;
if (i2 > last)
System.
out.
print(", +" + Long.
toHexString(i2
- last
)); else
System.
out.
print(", -" + Long.
toHexString( last
- i2
)); last = i2;
}
break;
case 8:
throw new AssertionError("Not supported");
}
}
private static Unsafe getUnsafe() {
try {
Field theUnsafe
= Unsafe.
class.
getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true);
return (Unsafe) theUnsafe.get(null);
throw new AssertionError(e);
}
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBzdW4ubWlzYy5VbnNhZmU7CmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKCmNsYXNzIEhlbGxvV29ybGQKewogIAogIHN0YXRpYyBmaW5hbCBVbnNhZmUgdW5zYWZlID0gZ2V0VW5zYWZlKCk7CiAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXM2NGJpdCA9IHRydWU7IAogIAogIHByaXZhdGUgc3RhdGljIGNsYXNzIE9CSiB7CiAgICBpbnQgb25lOwogICAgU3RyaW5nIHR3bzsKICAgIAogICAgcHVibGljIE9CSigpIHsKICAgICAgdGhpcy5vbmUgPSAxOwogICAgICB0aGlzLnR3byA9ICJ0d28iOwogICAgfQogIH0KICAKICBwdWJsaWMgc3RhdGljIHZvaWQgZG9faXQoT0JKIG8pIHsKICAJU3lzdGVtLm91dC5wcmludGxuKCJvLnR3byBpczogIiArIG8udHdvKTsgCiAgfQogIAogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCiAgewogICAgCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0Iik7CiAgICAKICAgIExpc3Q8T0JKPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICBsaXN0LmFkZChuZXcgT0JKKCkpOwogICAgbGlzdC5hZGQobmV3IE9CSigpKTsKICAgIGxpc3QuYWRkKG5ldyBPQkooKSk7CiAgICAKICAgIE9CSiB4ID0gbGlzdC5nZXQoMik7CiAgICAKICAgIHByaW50QWRkcmVzc2VzKCJBZGRyZXNzIHgiLCB4KTsKICAgIAogICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgMTAwMDAwMDsgaWR4KyspIHsKICAgIAlsaXN0LmFkZChuZXcgT0JKKCkpOyAgICAKICAgIH0KICAgIAogICAgT0JKIHgyID0gbGlzdC5nZXQoMik7CiAgICB4Mi50d28gPSAiaGFoYSI7CiAgICAKICAgIHByaW50QWRkcmVzc2VzKCJBZGRyZXNzIHgiLCB4KTsKICAgIAogICAgZG9faXQoeCk7CiAgICAKICB9CiAgCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRBZGRyZXNzZXMoU3RyaW5nIGxhYmVsLCBPYmplY3QuLi4gb2JqZWN0cykgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnQobGFiZWwgKyAiOiAweCIpOwogICAgICAgIGxvbmcgbGFzdCA9IDA7CiAgICAgICAgaW50IG9mZnNldCA9IHVuc2FmZS5hcnJheUJhc2VPZmZzZXQob2JqZWN0cy5nZXRDbGFzcygpKTsKICAgICAgICBpbnQgc2NhbGUgPSB1bnNhZmUuYXJyYXlJbmRleFNjYWxlKG9iamVjdHMuZ2V0Q2xhc3MoKSk7CiAgICAgICAgc3dpdGNoIChzY2FsZSkgewogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBsb25nIGZhY3RvciA9IGlzNjRiaXQgPyA4IDogMTsKICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgaTEgPSAodW5zYWZlLmdldEludChvYmplY3RzLCBvZmZzZXQpICYgMHhGRkZGRkZGRkwpICogZmFjdG9yOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChMb25nLnRvSGV4U3RyaW5nKGkxKSk7CiAgICAgICAgICAgICAgICBsYXN0ID0gaTE7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGkyID0gKHVuc2FmZS5nZXRJbnQob2JqZWN0cywgb2Zmc2V0ICsgaSAqIDQpICYgMHhGRkZGRkZGRkwpICogZmFjdG9yOwogICAgICAgICAgICAgICAgICAgIGlmIChpMiA+IGxhc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgKyIgKyBMb25nLnRvSGV4U3RyaW5nKGkyIC0gbGFzdCkpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAtIiArIExvbmcudG9IZXhTdHJpbmcoIGxhc3QgLSBpMikpOwogICAgICAgICAgICAgICAgICAgIGxhc3QgPSBpMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIk5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICB9CiAgCiAgICBwcml2YXRlIHN0YXRpYyBVbnNhZmUgZ2V0VW5zYWZlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEZpZWxkIHRoZVVuc2FmZSA9IFVuc2FmZS5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJ0aGVVbnNhZmUiKTsKICAgICAgICAgICAgdGhlVW5zYWZlLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgICAgIHJldHVybiAoVW5zYWZlKSB0aGVVbnNhZmUuZ2V0KG51bGwpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKICAgICAgICB9CiAgICB9Cn0K