Java学习笔记

2017/04/08 diary

Java多处理器多线程伪共享

没有竞争的类对象分配到同一个cacheline,造成不必要的内存竞争。

ConcurrentHashMap分段锁

  • Segment[]
  • HashEntry[] -> HashEntry

Java内存映射文件

内存映射文件特别适合于对大文件的操作(读写时间短),JAVA中的限制是最大不得超过 Integer.MAX_VALUE,即2G左右

内存映射文件属于JVM中的直接缓冲区(属于JVM堆外内存),不受JVM堆内存大小的限制。

内存映射文件的区域并不在JVM GC的回收范围内,因为它本身就不属于堆区,卸载这部分区域只能通过系统调用 unmap()来实现 (Linux)中,而 JAVA API 只提供了 FileChannel.map 的形式创建内存映射区域,却没有提供对应的 unmap(),要卸载这部分区域比较麻烦。

Java内存映射文件跟ByteBuffer.allocateDirect还不太一样。

Java Direct Memory

直接内存DirectMemory的大小默认为 -Xmx 的JVM堆的最大值,但是并不受其限制,而是由JVM参数 MaxDirectMemorySize单独控制。

DirectMemory的内存只有在 JVM执行 full gc 的时候才会被回收,那么如果在其上分配过大的内存空间,那么也将出现 OutofMemoryError,即便 JVM 堆中的很多内存处于空闲状态。

Search

    Table of Contents