节省内存的一些技巧
1.能用基本类型尽量用基本类型,就不要去用包装类型了,包装类明显占用的空间更大,之前有说到,包装类除了值,还带了一些信息,比如hash之些的对象头,还有引用地址
2.一些类定义的属性变量,就直接在这个类里面定义,不要跑到引用的地方去一个一个的重新定义。
3.创建一些需要提前设置好大小的东西的时候,先去看下装进来的东西有多少(如果不知道就去猜),然后把这个值set进去。比如hashmap的丢弃原数组暴力扩容不如先设置好适合的大小。 不过如果改了jvm的这个负载因子0.75,这些地方还根据0.75判断,就凉凉咯
4.zero-copy 将数据组合到一起,而不是内存的复制
5.内存池:1.循环利用
2.省的用一次创建一次,开始的时候直接给你全部都创好(感觉这样的话会拖慢启动速度,而且也要维护这些东西。。。。)
3.支持并发:一下子可以拿好多个
堆外内存:直接受操作系统管理(而不是虚拟机),jvm只是拿一个引用
好处是1.增大了空间(原来你只有个jvm的,现在你又多了个)
2.减少辣鸡回收。辣鸡回收会让其它的工作暂停
3.堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。
缺点是1.难管:因为操作系统管的,所以不容易控制,
2.创建慢
3.不容易排查(内存溢出的时候)
堆外内存和非堆内存是不一样的,非堆是比如栈一类的,还是在jvm内部。堆外在外面
这章可以看出,netty在某些方面并不是最优的,不同的场景或许有更好的选择,或许没有
展开
作者回复: “netty在某些方面并不是最优的”,肯定的,不然这15年来就不会一直在持续优化改进了,所以可怕的不是已经做到最好,而是一直还在改进,哈哈