1 public class TestNIO {
2 /**
3 * 测试堆内存缓冲区
4 */
5 @Test
6 public void test1HeapByteBuffer(){
7 int size = 1024 * 1024 * 450 ;
8 ByteBuffer buf = ByteBuffer.allocate(size);
9 System.out.println(buf.capacity());
10 buf = null ;
11 System.gc(); //OK
12 System.out.println("kkk");
13 }
14
15 /**
16 * 测试堆内存缓冲区
17 * @throws Exception
18 */
19 @Test
20 public void test1DirectByteBuffer() throws Exception{
21
22 int size = 1024 * 1024 * 1024 * 1 ;
23 ByteBuffer buf = ByteBuffer.allocateDirect(size);
24
25 //通过反射,回收离堆内存
26 Class clazz = Class.forName("java.nio.DirectByteBuffer");
27 Method m = clazz.getDeclaredMethod("cleaner");
28 m.setAccessible(true);
29 Object cleaner = m.invoke(buf);
30
31 Class cleanerClazz = cleaner.getClass();
32 Method m2 = cleanerClazz.getDeclaredMethod("clean");
33 m2.setAccessible(true);
34 m2.invoke(cleaner);
35
36 System.out.println(buf.get(1000));
37 System.gc();
38 System.out.println("dd");
39 }
40 /**
41 * 测试垃圾回收
42 */
43 @Test
44 public void testGC(){
45 int size = Integer.MAX_VALUE;
46 byte[] buf = new byte[size];
47 byte[] buf2 = buf ;
48 List<byte[]> list = new ArrayList<byte[]>();
49 list.add(buf2);
50 buf = null ;
51 System.gc(); //进行垃圾回收
52 buf2 = null ;
53 System.gc(); //进行垃圾回收
54 System.out.println("xxx");
55 list.clear(); //清空集合
56 System.gc(); //进行垃圾回收
57 System.out.println("xxx");
58 }
59
60 /**
61 * 测试垃圾回收
62 */
63 @Test
64 public void testChannel() throws Exception{
65 FileInputStream fis = new FileInputStream("d:/a.txt");
66 FileChannel srcFC = fis.getChannel();
67
68 FileOutputStream fos = new FileOutputStream("d:/b.txt");
69 FileChannel destFC = fos.getChannel();
70
71 //定义缓冲区
72 ByteBuffer buf = ByteBuffer.allocate(11);
73 while(srcFC.read(buf) != -1){
74 buf.flip();
75 destFC.write(buf);
76 buf.clear();
77 }
78 fis.close();
79 fos.close();
80 }
81 }