作者回复: Directbytebuffer是通过Unsafe类来分配本地内存的,实际上调用了C语言中的allocate来分配内存,是属于用户空间的。
base = unsafe.allocateMemory(size);
从用户空间到内核空间中需要有一次数据拷贝,应用程序不能直接操作内核空间。知乎上也有人问了这个问题:
https://www.zhihu.com/question/269052579/answer/354173816
作者回复: 这是HotSpot VM层面保证的,具体来说就是HotSpot不是什么时候都能GC的,需要JVM中各个线程都处在“safepoint”时才能GC, 本地内存到JVM 堆的拷贝过程中是没有“safepoint”的,所以不会GC,至于什么是“safepoint”,你可以搜索一下。
作者回复: 对的
作者回复: 是内核缓冲区向应用程序本地内存的拷贝
作者回复: 文中没有说明,展开会收不住,你可以搜索hotspot vm的safepoint是怎么回事
作者回复: 如果web应用使用tls通信,对性能响应时间要求比较高,而用户又愿意花时间去配置APR,推荐APR。
NIO和NIO2其实差别不是很大,如果硬要区分,NIO适合处理比较轻的,数据传输量比较少的请求,AIO适合比较重,数据传输量比较大的请求。
这是因为NIO本质还是同步,数据从用户空间和内核空间之间的拷贝还是阻塞的。
作者回复: 服务没有启动完成的时候,不要把流量送过来。
作者回复: 没有关系的,mmap是将文件映射到用户进程的虚拟地址空间,进程向这个地址读写内存,内核负责将数据同步到磁盘文件,考虑在答疑篇详细说说
作者回复: JVM为了跟操作系统打交道,必须调用操作系统提供的API,而每个操作系统提供的API都不同,所以必须针对不同的操作系统实现不同的JVM,这样位于JVM之上的Java字节码才可以实现跨平台。
作者回复: 跟GC的实现有关,GC有多种算法,有的需要移动对象,有的不需要,如果不需要移动对象就没有问题。
作者回复: unix环境高级编程