2020阿里测开二面

阿里测开二面题目:

本地方法栈中出现异常的怎么有什么解决方法。

本地方法:简单地讲,一个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 limitJava对应用程序可以分配的最大数组大小有限制。不同平台限制有所不同,但通常在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)

发布了55 篇原创文章 · 获赞 17 · 访问量 4978

猜你喜欢

转载自blog.csdn.net/weixin_43698704/article/details/105532800