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