2019秋招百度与阿里二面面经难点总结2(后续)

10.怎么判断哪些对象是垃圾

(1)引用计数法

原理: 给每一个对象添加一个引用计数器,每当有一个地方引用它时,就将引用计数器加1.当引用失效时就将其减去1. 任何时刻引用计数器的值如果等于零,那么就判定对象是可以回收的。优点:实现简单,判断效率高,在大部分情况下他都是一个很不错的算法。python语言就是使用这个算法进行垃圾判定的。引用计数器法被广泛用于进行内存管理;。

缺陷: 至于主流的java虚拟机(java语言以及C#语言)都没有选择使用引用计算数法来进行判定回收对象和管理内存,其中最主要的原因就是其无法处理特殊的情况也就是对象之间进行循环引用问题(例如AB,BA问题),也就是两个对象互相引用着对方,因此他们两个的引用计算器的值都不为零。于是引用计算法就遇到了困难,无法通知GC垃圾回收器回收他们。

(2)可达性分析算法

概述:商业性的开发语言Java以及C#语言都是通过可达性分析算法来判断对象是否存活。这个方法就是通过一系列的GC-Roots的对象作为起始点。然后我们从这些节点开始向下搜索,搜索走过的路径就是就叫做引用链。当一个对象到GC-Roots没有任何引用链(用图论的话说就是从GC-Roots到这个对象不可达)时,就证明此对象是不可用的。即使几个引用之间存在关联关系但是,但是他们到GC-Roots是不可达的,所以他们将会被判定为是可回收的对象。

(3)GC-Roots对象包括以下几种:

1.虚拟机栈(栈帧中的本地变量表)中引用的对象。

2.方法区中类静态属性引用的对象。

3.方法区中常量引用的对象。

4.本地方栈中的JNI(一般是native方法(本地方法))引用的对象

11.用过oracle吗,比较一下MySQL和Oracle吧

区别:

Oracle 是基于用户的,通过用户去标识数据库,每个数据库中有一些表。

MySQL一个用户可以有多个库,每个库有很多表。Oracle和MySQL的SQL语法有区别,Oracle总体来说语法比较严格,而且它没有limit的关键字,分页较为麻烦。

初此之外它们的默认隔离级别不同,Oracle时读已提交,MySQL是可重复读。

12.创建线程池有哪几种方式?

①. newFixedThreadPool(int nThreads) 创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。

②. newCachedThreadPool() 创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。

③. newSingleThreadExecutor() 这是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。

④. newScheduledThreadPool(int corePoolSize) 创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

13.有数据库优化的经验吗?说说你的优化方案吧

我觉得数据库优化分为以下五个点:

1.建表过程中对表的设计和字段的处理方面要合理。不要给字段过多宽裕的空间,如果表会膨胀较大,就尽量不要用外键,可以在后端中抽象出一层去保证数据的完整性。

2.索引优化,要根据表的实际使用情况选择要不要使用索引,比如修改次数远多于查询的表就不适合用索引,维护索引带来的开销会大于使用索引带来的优势。

3.SQL语句的优化,可以使用EXPLAIN关键字分析SQL语句执行的性能并去改善。还可以开启慢查询筛选出执行时间比较长的SQL语句进行优化,同时可以开启查询缓存。

4.数据库表的拆分,可以根据业务选择的横向拆分或者纵向拆分。

5.redis缓存,通过缓存去分担MySQL的查询压力。

14.synchronized 和 Lock 有什么区别?

首先synchronized是java内置关键字,在jvm层面,Lock是个java类;synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可);Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

15.你认为SpringIOC容器有缺点吗?

我们都知道在项目很大很复杂时,会在IOC容器中添加很多的依赖,整个项目则是依赖IOC容器。因此在局部测试时也要初始化IOC容器以及其中的依赖,但是这些依赖很多是测试时不需要的,这样往往测试的复杂性和性能开销会变大。

16.说一下堆栈的区别?堆和栈的区别

堆栈空间分配区别:1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

堆栈缓存方式区别:1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。堆:内存中,存储的是引用数据类型,引用数据类型无法确定大小,堆实际上是一个在内存中使用到内存中零散空间的链表结构的存储空间,堆的大小由引用类型的大小直接决定,引用类型的大小的变化直接影响到堆的变化栈:是内存中存储值类型的,大小为2M,超出则会报错,内存溢出

三、堆栈数据结构区别:堆(数据结构):堆可以被看成是一棵树,如:堆排序;栈(数据结构):一种先进后出的数据结构。

17.Spring集成其他框架是怎么实现的

这个因为对其他的不太熟悉所以我拿ORM框来举例回答的,我们都知道不论是hibernate还是mybatis在Spring中都能很好的得到集成。因为这里Spring有一个ORM接入模板,这个模板主要使用了模板方法的设计模式。而我们使用的各个ORM框架都重写模板里面的钩子方法,接下来spring 通过调用模版方法直接就能使用到不同的ORM框架。

18.Redis 常见的性能问题有哪些?

该如何解决?1.master写内存快照,seve命令调度rdbsave函数,会阻塞主线程的工程,当快照比较大的时候对性能的影响是非常大的,会间断性暂停服务 。所以master最好不要写内存快照。2.master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响master重启时的恢复速度。master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个slave开启AOF备份数据,策略每秒为同步一次。3.master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂的服务暂停现象。4.redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,slave和master最好在同一个局域网内。

19.Redis 如何做内存优化?

1,使用对象共享池优化小整数对象。

2,数据优先使用整数,比字符串更节省空间。3,操作优化。尽量避免字符串的追加操作,因为字符串存在预分配机制。追加操作后字符串对象会分配一倍的容量作为于预留空间。4,编码优化。list,hash,set,zset尽可能使用ziplist编码。好处是内存下降,坏处是操作变慢。一般大小不超过1000。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tronhon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值