01
场景和需求
在Linux系统下, 没有第三方的集成开发工具(如IDEA), 如何下载Jar包, 以及如何运行.java文件.
解决步骤 首先在你的系统上已经配置好了maven环境和Java环境.
如何配置此处就不介绍了, 属于基础操作
此处以下载netty为例
在官网 https://mvnrepository.com/ 查找需要下载的依赖包的groupId等, 比如本篇以下载4.1.63.Final版本netty为例
代码语言:javascript复制<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.63.Final</version>
</dependency>
于是, 使用mvn命令下载
代码语言:javascript复制mvn dependency:get -DremoteRepositories=http://repo1.maven.org/maven2/ -DgroupId=io.netty -DartifactId=netty-all -Dversion=4.1.63.Final
稍等片刻, 就会下载成功.
源文件内容
代码语言:javascript复制// Allocator.java
package com.infuq;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.buffer.PooledUnsafeDirectByteBuf;
public class Allocator {
public static void main(String[] args) {
PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
// 申请堆外空间
PooledUnsafeDirectByteBuf byteBuf = (PooledUnsafeDirectByteBuf) allocator.directBuffer(2048);
// 内存地址
long address = byteBuf.memoryAddress();
System.out.println("Address:0x" Long.toHexString(address));
}
}
目录结构如下
编译Java源文件
代码语言:javascript复制// Linux系统
javac -d . -classpath ".:./lib/*" Allocator.java
// Windows系统
javac -d . -classpath ".;./lib/*" Allocator.java
编译之后的目录结构
执行
代码语言:javascript复制// Linux系统
java -classpath ".:./lib/*" com.infuq.Allocator
// Windows系统
java -classpath ".;./lib/*" com.infuq.Allocator
这里需要说明一点的是, 在使用javac和java命令的时候, 在指定-classpath, 如果是Linux系统, 那么使用:分隔目录, 如果是Windows系统, 那么使用;分隔目录.
以上就是本篇要说的主要内容, 顺便再说下, 代码本身的含义是Netty申请一个堆外空间, 并打印地址.
在Netty之线程唤醒wakeup文章中, 提到了如何追踪系统调用. 在这里也使用strace命令追踪下Netty底层调用的内存分配的系统调用是哪个.
打印的内容是Address:0x7fab46fff010
使用grep搜索这个地址0x7fab46fff010
除了正常的打印之外, 并没有看到多余的内存申请的系统调用方法
使用grep搜索0x7fab46f(减少了0x7fab46fff010最后面的5个数字), 结果如下
使用的系统调用是mmap申请内存空间.
但是mmap返回的地址是0x7fab46fff000.
而Netty返回给应用的地址是0x7fab46fff010. 相差0x10, 这并不是巧合, 是什么原因呢? 在后面讲解Netty内存分配的时候细说.