vivo春招java一面面经

vivo春招java一面面经

  1. TCP与UDP区别 ☑️
  2. OSI五层模型 ☑️
  3. JVM内存划分 ☑️
  4. new一个对象发生了什么(创建对象过程)☑️
  5. .class文件是放在那的(方法区)☑️
  6. OOM 发生场景和out of memory ✖️
  7. 操作系统内存管理 ✖️
  8. 数据库数据放在哪里(b+树的结构,为什么用b+树)
  9. Spring IOC☑️ (如何创建bean,如何启动)
  10. hashmap 为什么会产生死锁☑️
  11. (如何解决)讲到了concurrentHashmap,jdk1.8的优化
  12. jdk1.8 锁粒度 sychronize锁在哪 ✖️
  13. redis分布式锁 ☑️(简历写到了),如何实现redis锁。讲到了setnx,getset以及如何解决多个对象获取一个
  14. netty 简述 ☑️(channel group,eventloopgroup,多路复用异步IO)
  15. netty 零拷贝 ✖️

oom

OOM定义—out ofmemory,内存溢出,一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当该对象占用的内存无法被回收时,就容易造成内存泄露。多个内存泄漏最终会导致内存溢出,即OOM
最常见的OOM情况有以下三种:
java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。
java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
java.lang.StackOverflowError ------> 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。
解决方法:
1、及时回收资源,采用finally来回收
2、weakreference采用软引用的方式让gc回收
按照JVM规范,除了程序计数器不会抛出OOM外,其他各个内存区域都可能会抛出OOM


零拷贝 零拷贝的应用程序要求内核(kernel)直接将数据从磁盘文件拷贝到套接字(Socket),而无须通过应用程序。零拷贝不仅提高了应用程序的性能,而且减少了内核和用户模式见上下文切换。

在这里插入图片描述
从图中可以看出文件经历了4次copy过程:

1.首先,调用read方法,文件从user模式拷贝到了kernel模式;(用户模式->内核模式的上下文切换,在内部发送sys_read() 从文件中读取数据,存储到一个内核地址空间缓存区中)

2.之后CPU控制将kernel模式数据拷贝到user模式下;(内核模式-> 用户模式的上下文切换,read()调用返回,数据被存储到用户地址空间的缓存区中)

3.调用write时候,先将user模式下的内容copy到kernel模式下的socket的buffer中(用户模式->内核模式,数据再次被放置在内核缓存区中,send()套接字调用)

4.最后将kernel模式下的socket buffer的数据copy到网卡设备中;(send套接字调用返回)

优化后的zero-copy
改进后的处理过程如下:

将文件拷贝到kernel buffer中;(DMA引擎将文件内容copy到内核缓存区)

向socket buffer中追加当前要发生的数据在kernel buffer中的位置和偏移量;

根据socket buffer中的位置和偏移量直接将kernel buffer的数据copy到网卡设备(protocol engine)中;

从图中看到,linux 2.1内核中的 “数据被copy到socket buffer”的动作,在Linux2.4 内核做了优化,取而代之的是只包含关于数据的位置和长度的信息的描述符被追加到了socket buffer 缓冲区中。DMA引擎直接把数据从内核缓冲区传输到协议引擎(protocol engine),从而消除了最后一次CPU copy。经过上述过程,数据只经过了2次copy就从磁盘传送出去了。这个才是真正的Zero-Copy(这里的零拷贝是针对kernel来讲的,数据在kernel模式下是Zero-Copy)。
在这里插入图片描述

参考文章
java oom
netty深入理解系列-Netty零拷贝的实现原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默终止

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值