如何开启 Native
- 修改代码,各种 Nio 都改成 Epoll 就行了,但是改完之后的代码只能运行在 Linux 上(前两天升级 Win10 后机器变砖了,然后就装了 Ubuntu,开发用 Ubuntu 还真挺好的):
- NioServerSocketChannel -> EpollServerSocketChannel;
- NioEventLoopGroup -> EpollEventLoopGroup;
- 准备好 Native 库,自己 build;
- Netty 也自带了一些库;
源码分析 Native 库(.so)的加载逻辑
- 先尝试加载
java.library.path
:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib; - 如果加载不到,会尝试去 Netty jar 包(~/.m2/...)中的
META-INF/native/
加载; - 总之就是各种多系统支持的逻辑、各种找 Native 库在哪里的逻辑,完了最终调的是 JDK 的 API:
java.lang.System#load
或java.lang.System#loadLibrary
;
Native 相关的参数
- io.netty.transport.noNative
- io.netty.native.workdir:如果是在
META-INF/native/
中加载,则需要一个临时目录存加载到的 Native 库; - io.netty.native.deleteLibAfterLoading:在 JVM 退出的时候把临时文件删掉;
Linux 下开启 Native 的常见问题
- 准备的 Native 库文件是 64 位的,但系统是 32 位的;
- 拷贝出来的临时 Native 库文件没有可执行权限;
- 解决方案一:
mount -o remount,exec /tmp
; - 解决方案二:直接换到一个有权限的目录,设置系统参数
-Dio.netty.native.workdir=[path]
;
- 解决方案一: