`
qianshangding
  • 浏览: 124679 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

并行编程(2) - sum.msic.Unsafe 二

阅读更多

整理了几个以前从网上记录sum.msic.Unsafe类的示例,供大家参考:


package com.fish.unsafe;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import sun.misc.Unsafe;

/**
 * @version 1.0
 * @author Fish
 */
public class UnsafeTest {
	public static Unsafe unsafe;

	@Before
	public void init() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		// 通过反射获取rt.jar下的Unsafe类
		Field field = Unsafe.class.getDeclaredField("theUnsafe");
		field.setAccessible(true);
		unsafe = (Unsafe) field.get(null);
	}

	/**
	 * allocateInstance初始化对象不调用构造方法
	 * 
	 * @Description:
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testAllocateInstance() throws InstantiationException, IllegalAccessException {
		UnsafeClass un = new UnsafeClass(); // constructor
		System.out.println(un.a()); // prints 1
		UnsafeClass uu2 = UnsafeClass.class.newInstance(); // reflection
		System.out.println(uu2.a()); // prints 1
		UnsafeClass uu3 = (UnsafeClass) unsafe.allocateInstance(UnsafeClass.class); // unsafe
		System.out.println(uu3.a());// prints 0
	}

	/**
	 * 修改private变量的值
	 * 
	 * @Description:
	 * @throws NoSuchFieldException
	 * @throws SecurityException
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testObjectFieldOffset() {
		try {
			UnsafeClass un = new UnsafeClass();
			System.out.println(un.isEqual());
			Field f = un.getClass().getDeclaredField("a");
			unsafe.putInt(un, unsafe.objectFieldOffset(f), 42); // memory
			System.out.println(un.isEqual()); // true, access granted
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 获取对象的大小
	 * @Description: 
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testSizeof() {
		UnsafeClass un = new UnsafeClass();
		System.out.println(sizeOf1(un));
	}

	public static long sizeOf1(Object object) {
		HashSet<Field> fields = new HashSet<Field>();
		Class<?> c = object.getClass();
		while (c != Object.class) {
			for (Field f : c.getDeclaredFields()) {
				if ((f.getModifiers() & Modifier.STATIC) == 0) {
					fields.add(f);
				}
			}
			c = c.getSuperclass();
		}
		// get offset
		long maxSize = 0;
		for (Field f : fields) {
			long offset = unsafe.objectFieldOffset(f);
			if (offset > maxSize) {
				maxSize = offset;
			}
		}
		return ((maxSize / 8) + 1) * 8; // padding
	}

	/**
	 * 浅拷贝:该方法可以用来拷贝任何类型的对象,动态计算它的大小。
	 * 
	 * @Description:
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testShallowCopy() {
		List<String> list = new ArrayList<String>();
		list.add("123A");
		list.add("123B");
		list.add("123C");
		long size = sizeOf1(list);
		long start = toAddress(list);
		long address = unsafe.allocateMemory(size);
		unsafe.copyMemory(start, address, size);
		System.out.println(fromAddress(address));
	}

	private static long normalize(int value) {
		if (value >= 0)
			return value;
		return (~0L >>> 32) & value;
	}

	public static long toAddress(Object obj) {
		Object[] array = new Object[] { obj };
		long baseOffset = unsafe.arrayBaseOffset(Object[].class);
		return normalize(unsafe.getInt(array, baseOffset));
	}

	static Object fromAddress(long address) {
		Object[] array = new Object[] { null };
		long baseOffset = unsafe.arrayBaseOffset(Object[].class);
		unsafe.putLong(array, baseOffset, address);
		return array[0];
	}

	/**
	 * 密码隐藏:通常我们会将用完的密码设置为null,但是在设置为null到GC垃圾回收该对象,是有一定的时间。在这段时间内,该对象还存在于内存中,
	 * 就在这段时间内,很可能被黑客利用
	 * 
	 * @Description:
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testPassword() {
		String password = new String("l00k@myHor$e");
		String fake = new String(password.replaceAll(".", "?"));
		System.out.println(password); // l00k@myHor$e
		System.out.println(fake); // ????????????
		unsafe.copyMemory(fake, 0L, null, toAddress(password), sizeOf1(password));
		System.out.println(password); // ????????????
		System.out.println(fake); // ????????????
	}

	 /**
	 * 动态创建类
	 * @Description:
	 * @author Fish
	 * @date 2015年6月24日
	 */
	 @Test
	 public void testDynamicClasses() {
		 try {
			 File f = new File("D:\\A.class");
			 FileInputStream input = new FileInputStream(f);
			 byte[] content = new byte[(int) f.length()];
			 input.read(content);
			 input.close();
                         <span style="color:#FF0000;">// unsafe.defineClass(null, content, 0, content.length);该方法在JDK8找不到</span>
                        Class<?> c = unsafe.defineClass(null, content, 0, content.length);
			 c.getMethod("a").invoke(c.newInstance(), null); // 1
		 } catch (FileNotFoundException e) {
			 e.printStackTrace();
		 } catch (IOException e) {
			 e.printStackTrace();
		 }
	 }

	/**
	 * 大数组:这种方式的内存分配不在堆上,且不受GC管理,所以必须小心Unsafe.freeMemory()的使用
	 * @Description: 
	 * @author Fish
	 * @date 2015年6月24日
	 */
	@Test
	public void testBigArray() {
		long SUPER_SIZE = (long) Integer.MAX_VALUE * 2;
		SuperArray array = new SuperArray(SUPER_SIZE);
		System.out.println("Array size:" + array.size()); // 4294967294
		int sum = 0;
		for (int i = 0; i < 100; i++) {
			array.set((long) Integer.MAX_VALUE + i, (byte) 3);
			sum += array.get((long) Integer.MAX_VALUE + i);
		}
		System.out.println("Sum of 100 elements:" + sum); // 300
	}

}

class SuperArray {
	private final static int BYTE = 1;

	private long size;

	private long address;

	public SuperArray(long size) {
		this.size = size;
		address = UnsafeTest.unsafe.allocateMemory(size * BYTE);
	}

	public void set(long i, byte value) {
		UnsafeTest.unsafe.putByte(address + i * BYTE, value);
	}

	public int get(long idx) {
		return UnsafeTest.unsafe.getByte(address + idx * BYTE);
	}

	public long size() {
		return size;
	}
}

class UnsafeClass {
	private long a;

	public UnsafeClass() {
		this.a = 1;
	}

	public long a() {
		return this.a;
	}

	public boolean isEqual() {
		return 42 == a;
	}
}



分享到:
评论

相关推荐

    一篇看懂Java中的Unsafe类

    在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间研究了下,下面这篇文章主要给大家介绍了关于Java中Unsafe类的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧

    MSIC10.9.2.rar

    MSIC10.9.2.rar

    MSIC.zip_MSIC_MSIC FOR DELPHI20_MSIC delphi_delphi XML_mitec_usb

    非常全面的计算机资源管理分析器,以xml的数据格式产生报告

    MSIC.zip_MSI_Overview_NTDDK.d_delphix_d7_msi_Machine.dcu_update

    MSIC, source code for delphi

    msic同步接收

    c#接收MSIC同步包

    C语言头文件 MSI C语言头文件 MSI

    C语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言头文件 MSIC语言...

    andrpod TAB

    tbPlayMusic = (ToggleButton) findViewById(R.id.tb_msic); mediaPlayer = MediaPlayer.create(this, R.raw.nishiwodeyan);//指定了播放源 tbPlayMusic.setOnCheckedChangeListener(new CompoundButton....

    stm32f10xx.h

    Cortex-M4 Device Peripheral Access Layer Header File. This file contains all the peripheral register's definitions, bits definitions and memory mapping for STM32F4xx devices

    STM32库文件相关

    2. core_cm3.h 实现内核的寄存器映射,NVIC,SYSTICK等 3. stm32f1xx.h 存放外设初始化结构体,及初始化函数声明 4. stm32f1xx.c 存放外设库函数 5. core.cm3 / msic 存放ARM的CM3内核库函数包含NVIC等,新库...

    Diamond帝盟S100声卡驱动for windows xp

    Microsoft Direct Msic 8.1支持;支持DLS 1.0,2.0;内置全新的Diamond FreeCtrl(TM) 1.5工具(包括Info tools 和Api controller),和Diamond Winamp MP3-EAX插件,提供了超越Diamond 7100VXD版的的功能!

    通过喷砂技术获得的高性能三相边界,用于混合电位型氧化锆基NO2传感器

    与其他传感器相比,使用80μmSiC处理的YSZ基板的传感器在850°C时对NO2的信号最大,其对100 ppm NO2的响应比基于传感器的传感器高约1.08、1.21和1.5倍在分别用60μmSiC,40μmSiC和光滑的YSZ衬底喷砂处理过的YSZ...

    Delphi Aes加密控件 MSICS_Trial硬件信息控件

    delphi Aes 加密控件 MSICS_Trial 硬件信息控件 获取本地硬件序列号的2个插件。

    3种模式的按键驱动(cdev misc platform).rar

    mini241o 按键的3种驱动 字符设备 混杂设备 platform驱动

    BASE64Encode编码,jar包(源代码打包)

    BASE64Encode 编码,在andorid没有这个编码,这里面有打成jar包,可以导进去。用源代码打包的。手懒不愿意自己弄得话,可以下载导进去。里面附带着源代码,也可将源代码开进去直接使用,希望能帮助大家。

    一种低功耗测试图形的生成方法 (2013年)

    通过设计一种可配置SIC计数器和种子生成电路,证明了该方法中任意的2个 MSIC图形在任何情况下都是相异的。以国际基准测试电路ISCAS’89为对象,在nangate 45 nm工艺上的仿真实验表明,基于该方法的测试生成电路的...

    KeePass Password Safe 2

    ctf中不太常用的一个工具 但有的题会用到 KeePass Password Safe是一款优秀的密码管理工具,实际上可能还不仅仅是密码管理工具,重要的文件也可以保存在这款软件中

    甲骨论-Undo表空间管理

    甲骨论-08-Undo表空间管理 本章详细介绍了undo表空间的工作原理以及与undo相关的数据字典

Global site tag (gtag.js) - Google Analytics