阿里测开二面题目:
本地方法栈中出现异常的怎么有什么解决方法。
本地方法:简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。
本地方法是由其它语言编写的,编译成和处理器相关的机器代码。
本地方法保存在动态链接库中,即.dll(windows系统)文件中,格式是各个平台专有的
使用本地方法来提高性能的做法不值得提倡:因为本地语言不是安全的,现在jvm也越来越快。
从历史上看,本地方法主要有三种用途。他们提供了“访问特定与平台的机制”的能力,比如访问注册表和文件锁。他们还提供了访问遗留代码块的能力,从而可以访问遗留数据。最后,本地方法可以通过本地语言,编写应用程序中注重性能的部分,以提高系统的性能。
jvm理解
五大分区,新生代老年代,垃圾收集器等等
oom异常怎么排查,怎么预防。
可看一看这篇博客:https://blog.csdn.net/pbuzhidaol/article/details/72871898 异常排查指南
java.lang.OutOfMemoryError:Java heap space对oom,内存泄漏或者
流量/数据量峰值。解决方案:增加内存,找内存泄漏主要原因。- java.lang.OutOfMemoryError:GC overhead limit exceeded,默认超过98%的时间用来做GC却回收了不到2%的内存时将会抛出此错误。解决方案:增加内存空间。
java.lang.OutOfMemoryError: PermGen space
错误就表明持久代所在区域的内存已被耗尽。错误的原因是:太多的类或者太大的类被加载到permanent generation
(持久代)。java.lang.OutOfMemoryError:Metaspace
主要原因:太多的类或太大的类加载到元空间。解决方法:增加空间或删除参数,对内存不做限制java.lang.OutOfMemoryError:Unable to create new native thread。原因:
不能的创建并启动新的线程。当代码运行时,很快达到OS的线程数限制。-
java.lang.OutOfMemoryError:Requested array size exceeds VM limit
Java对应用程序可以分配的最大数组大小有限制。不同平台限制有所不同,但通常在1到21亿个元素之间。 -
java.lang.OutOfMemoryError:Out of swap space:
在JVM请求的总内存大于可用物理内存的情况下,操作系统会将内存中的数据交换到磁盘上去。Out of swap space?
表示交换空间也将耗尽,并且由于缺少物理内存和交换空间,再次尝试分配内存也将失败。 -
Out of memory:Kill process or sacrifice child:当可用虚拟虚拟内存(包括交换空间)消耗到让整个操作系统面临风险时,就会产生
Out of memory:Kill process or sacrifice child
错误。在这种情况下,OOM Killer会选择“流氓进程”并杀死它扫描二维码关注公众号,回复: 11067902 查看本文章
OOM分析
1.可以使用软引用SoftReference
要dump堆的内存镜像,可以采用如下两种方式:
- 设置JVM参数-XX:+HeapDumpOnOutOfMemoryError,设定当发生OOM时自动dump出堆信息。不过该方法需要JDK5以上版本。
- 使用JDK自带的jmap命令。"jmap -dump:format=b,file=heap.bin <pid>" 其中pid可以通过jps获取。
dump堆内存信息后,需要对dump出的文件进行分析,从而找到OOM的原因。常用的工具有:
- mat: eclipse memory analyzer, 基于eclipse RCP的内存分析工具。详细信息参见:http://www.eclipse.org/mat/,推荐使用。
- jhat:JDK自带的java heap analyze tool,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言OQL,分析相关的应用后,可以通过http://localhost:7000来访问分析结果。不推荐使用,因为在实际的排查过程中,一般是先在生产环境 dump出文件来,然后拉到自己的开发机器上分析,所以,不如采用高级的分析工具比如前面的mat来的高效。
ThreadLocal的理解
ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
- 在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。
- 线程间数据隔离
- 进行事务操作,用于存储线程事务信息。
- 数据库连接,Session会话管理
(1)每个Thread维护着一个ThreadLocalMap的引用
(2)ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储
(3)ThreadLocal创建的副本是存储在自己的threadLocals中的,也就是自己的ThreadLocalMap。
(4)ThreadLocalMap的键值为ThreadLocal对象,而且可以有多个threadLocal变量,因此保存在map中
(5)在进行get之前,必须先set,否则会报空指针异常,当然也可以初始化一个,但是必须重写initialValue()方法。
(6)ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value。
对spring事务的理解
谈一下对继承与多态的理解。实际运用多态的例子。
继承:
使用继承可以有效实现代码复用,避免重复代码的出现。
当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。
多态:
一般做法是:写一个方法,它只接收父类作为参数,编写的代码只与父类打交道。调用这个方法时,实例化不同的子类对象(new 一个对象)。
更具体的说:
(1)、子类重写父类的方法。使子类具有不同的方法实现。
(2)、把父类类型作为参数类型,该父类及其子类对象作为参数转入。
(3)、运行时,根据实际创建的对象类型动态决定使用那个方法。
设计模式的了解。
单例模式
代理模式
mysql什么时候会进行全表扫描而不通过索引具体例子
1.索引失效:用in/not in或者用is null /is not null,或者使用like去通配以开头,进行运算>/+等,进行类型转换,使用or等方式
2.当 通过索引访问数据的常备的成本 大于单独访问数据的成本的时候 ,优化器 倾向于 访问全表扫描。会看索引表中得数据量大小。
粗略而又简化的说 io成本 = 访问索引块的成本 IC +数据块的成本 DC ,当 通过索引访问数据的常备的成本 大于单独访问数据的成本的时候
mysql优化的经验,mysql实现事务的原理。
实现事务的原理:
- 四大隔离,
- 行级锁和表级锁。
- cas比较并交换的协议
- 日志记录存储,可以回滚。
算法题是链表反转,比较链表反转头插和递归法。
递归法。时间复杂度O(N),空间复杂度O(N)递归栈也是消耗空间的。
头插法。时间复杂度O(n)空间复杂度O(1)
栈方法。时间复杂度o(n),空间复杂度o(n)