java堆外内存为何比java堆更适合用来进行网络IO操作

java执行socket.write对java堆内的数组数据进行网络IO操作时,其实分两步进行:

1.把java堆的数据拷贝到C堆内存中(对Java来说就是堆外内存,只是这个内存不归java管理)
2.把C内存中的数据发送到内核内存中,进行网络IO操作

疑问: 为何jvm不直接把数据从java堆发送到内核内存中进行网络IO操作,而要先把数据拷贝到C堆内存中

答案是:进行网络IO操作时其实底层调用的是c的函数write,该函数对应的字节数组的地址不能够变化,如果使用的java堆内的地址的话,由于gc的影响,有可能从新生带移动到了老年代,导致地址变化,所以不能够使用这个java堆内存作为底层write函数的地址,而必须申请另外的c内存地址并把数据拷贝过去

展开阅读全文
©️2020 CSDN 皮肤主题: 1024 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值