37 StringTable垃圾回收
字符串常量也可以被垃圾回收。
1、设置虚拟机参数。
底层类似于哈希表实现,数组+链表
桶,buckets
38 StringTable调优
调整hashtable桶的个数
39 调优
intern的应用
40 调优
41 直接内存
不属于java虚拟机的内存,属于操作系统内存。
主要用于NIO操作,数据读写的缓冲区。
分配回收成本高,读写性能高。
directBuffer()
读写大文件性能很高。
42 基本使用
磁盘文件,
系统内存 系统缓冲区
java堆内存 byte[]
使用directbuffer后
在操作系统划分一块缓冲区,java和磁盘都可以共享的。减少了缓冲区的一次复制。
43 直接内存-内存溢出
分配的内存,不受java虚拟机垃圾回收。
是否内存溢出?
会导致内存溢出。
direct buffer memory
44 直接内存-释放原理
不受虚拟机内存管理,是否会被回收?
不被java管理
使用工具任务管理器。
进程对内存的占用情况
45 直接内存-释放原理
直接内存的分配和释放通过unsafe方法管理
必须主动调用
unsafe.freeMemory(base);
46 释放原理
cleaner=Cleaner.create(this,new Deallocator(base,size,cap));
借助了java的虚引用的机制。
47 禁用显式回收对象
byteBuffer内部,使用了cleaner虚引用监测byteBuffer对象,一旦byteBuffer对象被垃圾回收,又refererenceHandler线程通过Cleaner的clean方法调用freeMemory释放直接内存。
使代码中的system.gc()无效。