java基础10道题(第四弹)

31.什么是多线程?在哪里应用过?

线程就是可执行的代码段,线程要服务于进程,一个进程有好多个线程,main方法就是主线程,多个线程同时执行就是多线程,线程池就是把准备好的线程放到线程池里,如果处理请求需要调用线程的时候,就从线程池里去调用,用完以后再放回到线程池里,这样就防止高并发节省资源,我们目前开发中没有涉及到过多线程,其实我个人理解用多线程无非是为了提高代码的执行效率提高客户的体验,解决高并发,但是项目里如果多线程使用的多的话,后期的代码维护这一块也不怎么好维护,我们现在在解决这些高并发都是建议使用中间件来解决,redis啦,activeMQ啦,还有solr等等, 然后把这几个中间件的原理说一下…就能巧妙的避免开这个多线程的问题啦…

32.有没有遇到过内存溢出,内存泄漏?

开发的时候遇到过,其实内存溢出指的是jvm内存溢出,通过调整堆,栈的大小来解决。代码中出现死循环或递归调用也会造成内存溢出,一般我们去调整一下他的内存大小就行,配置一下tomcat里的一个参数就能调整,一般造成内存溢出的原因是什么? 一方面有可能是代码中有长时间没有关闭的连接,或者是用IO读取完文件以后没有及时关闭,原来再使用hibernate的时候就遇到过内存溢出,就是因为没有及时的去关闭缓存造成的,还有就是代码问题,比如说写了死循环,程序出问题,递归自己调用自己的时候代码写的有问题都有可能造成内存溢出.我感觉内存泄漏和内存溢出差不多.

33.说一下GC垃圾回收过程

我们Java中的垃圾回收都是自动的,我们很少几乎不去手动的干预,我就是先说一下这个JVM中的的堆内存结构,他主要分为新生代和老年代,新生代就是用来存放刚被new出来的对象,一般情况下占堆的1/3空间,还有就是新生代中又分为3个区具体我也记不清是哪三个区了 反正老年代里存放咱们整个应用程序中生命周期长的内存对象,我原来再网上看过,我们的JVM垃圾回收算法我记得差不多有4种,标记清除法,复制算法,标记整理算法,分代收集算法,我就了解其中的两种,比如说 说清楚其中的两个就行,都说出来就有点太假了,根本不可能记不住那么多

第一种就是标记-清除法
分为:标记,请除
标记阶段:直接在内存里标记无用的对象,然后清除阶段直接回收被标记的对象;
缺点:形成内存碎片,一些大的对象无法找到足够的空间而触发新的垃圾收集动作。
第二种:复制算法:
将内存划分为大小相等的两块,当一块的内存用完了,就把还存活的对象复制到另外一块上面,然后将之前的那块清理掉
缺点:浪费内存太多(对老年代的使用,效率低)
第三种:标记-整理算法
将存活的对象都向一端移动,然后直接清理掉这端边界以外的内存
第四种:分代收集算法:(当前商业虚拟机都采用这个)
根据对象的存活中期的不同将内存划分为几块,一般Java堆分为新生代和老年代
新生代:用复制算法 老年代用标记整理算法进行回收

34.jvm内存分析? 解释下堆和栈? 解释下虚拟机?

我原来学java的时候知道JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块内存地址,它主要由年轻代和老年代还有持久代组成,所有new出来的对象都存储在该区域. 栈就是暂存数据的地方,每个线程包含一个栈区,栈存放在一级缓存中,存取速度较快,栈中只保存基础数据类型的对象和自定义对象的引用.每个栈中的数据都是私有的,其他栈不能访问。方法区存放了要加载的类的信息(如类名、修饰符等)、静态变量、构造函数、final定义的常量、类中的字段和方法等信息。
声明并创建对象
8.访问属性

35.redis持久化方式有几种?

有RDB和AOF这两种,RDB是一种快照的方式来存储的,这也是redis的默认的持久化方式,每隔一段对数据进行一次存储,默认是15S,这个也可以通过配置文件里修改,这种存储方式性能比较高
还有一种是AOF是即时性的持久化方式,只要数据发生改变都会保存到硬盘一份,这种方式对数据的保存完整性比较高,但是性能比较差。而RDB存在的问题主要是服务器宕机或者断电,会造成数据丢失

36.使用redis有没有遇到过缓存穿透和缓存雪崩?

有遇到过,穿透就是,因为 redis都是按照key去缓存查询,如果不存在对应的value,就应该去数据库查找。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力,这就叫“缓存雪崩”。解决办法是,对查询结果为空的情况也进行缓存,并且给缓存设置不同的有效期。当然redis容灾的最有效的方法还是搭建集群。在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

37.能说一下redis集群吗?

Redis本身就支持集群操作redis_cluster,另外redis还支持主从复制,以前的老版本中有一个哨兵模式,在主服务器宕机时,从服务器可以自动转换为主服务器。我们公司搭建的redis集群是用的ruby脚本配合搭建的,我们一共搭建了6台服务器,3主3备,他们之间通信的原理是有一个乒乓协议进行通信的,他们判断一个节点的状态是用投票选举机制判断的,半数以上判断一个接口是宕机了的话,备用节点就会启动,对,我再给你说下一他们往里存储数据的机制吧,其实这个redis搭建好集群以后每个节点都存放着一个hash槽,每次往里存储数据的时候,redis都会根据存储进来的key值算出一个hash值,通过这个hash值可以判断到底应该存储到哪一个哈希槽中,取的时候也是这么取的,这就是我了解的redis集群.

38.ActiveMQ消息发送失败解决方案?在使用activeMQueue的时候有没有遇到过什么问题?

第一种用数据库配合着解决:
怎么配合呢咱们这边不是发送的商品的ID么,在发送之前把ID记录在数据库里面去,然后设置一个状态字段,0代表这个消息发送中,然后监听端进行消费,消费成功后把这个字段在改为1.然后就是几种突发情况,第一种情况比如说突然断电了然后我的消息首先是记录在数据库里面了,然后他的那个状态是不是为0啊,然后我们有一个用quartz写的定时器,每隔5分钟会去数据库跑个批然后把状态为0的数据,再重新发送一遍消息,直到消费成功为止.
第二种解决:
在发送消息的时候设置提交的方式,改成手动提交的方式,在后台改成commit状态改成手动方式,如果发送成功的话,然后commit手动提交方式。

39.ActiveMQ使用场景

对于ActiveMQ在我们开发中,用它来降低过我们的项目耦合度,主要应用到这么几个场景,比如,我们的项目现在都是分布式的,咱们不可能在一个模块中实现所有的功能,就拿商品管理模块来说,当对商品做添加,修改,删除操作时,其他模块也有可能有相关连的变化,比如前台模块中的搜索,商品信息变了,索引库中内容也应该有相应的变化,这个时候呢,我们就需要用到一个通信机制,那ActiveMQ这种类型的框架我们就恰好需要的,可以在商品操作时,发送一个消息说我商品信息改变了,当然需要指明哪一个商品发生了变化,发送对应的商品id就行,在前台模块中,我们配置一个消息接收端,当接收到消息时,对索引库做下修改就行。
当然,除了商品添加同步更新索引库,像商品详情模块,在商品审核通过以后,想消息队列中发送了一个商品id到消息队列中,pageService工程中有一个监听类,可以生成相应的静态页面,还有订单模块也有用到过,当执行生成订单,进行银行扣款,扣款成功,减库存啊,这种类型的操作,都可以通过ActiveMQ发生消息来实行同步操作。

40.什么是读写分离?

这个我们项目中使用MyCat来做的,在mycat里配置好主库和从库,做增删改的时候是对主库进行操作,查询的时候是对从库进行操作,其实mysql本身从5.6以后的版本就带主从复制的功能了,他们是利用mysql里的log文件进行的数据同步.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值