java相关技术问答(二)

String为什么是final的

  1. 首先是为了安全性,final表示不可变,不可被继承,不能修改其方法保证安全
  2. 在多线程环境下,final类型的String保证线程安全
  3. String支持字符串常量池,相同字符串可以指向相同地址

cas原理讲下

  1. cas算法包含三个参数,v需要更新的变量,e预期值,n新的值
  2. 进入cas算法时,会先记录更新变量值,然后进入compareAndSwap方法,判断v是否等于e,相等说明v值没有被改变,那v值更新成n值

线程池线程数配置多少合适?

  1. 需要根据所执行的任务类别来区分
  2. 分为cpu密集型和IO密集型
  3. cpu密集型线程数和cpu数量相同
  4. io密集型,表示任务中需要执行像数据库操作,磁盘操作这类io阻塞等待的操作
  5. 这个时候,有公式来算出最佳执行线程=(线程io阻塞时间/io运行时间+1)*cpu数

为什么redis单线程还这么快

  1. redis虽然是单线程,但他的操作完全是在内存进行的,内存的速度比IO快很多,可以有效提高cpu的利用率

ThreadPoolExecutor中有哪些参数

  1. 核心线程数
  2. 最大线程数
  3. 最大空闲时间
  4. 单位
  5. 阻塞队列
  6. 超出队列任务处理

jdk7和jdk8特性

  1. jdk7可以使用switch字符串了
  2. jdk7 try-catch资源块,可以自动释放
  3. jdk8 lambda表达式 函数式编程
  4. jdk8 接口可以实现默认方法了

防盗链方法

  1. 判断请求头refered,不是自己的域名,重定向到别的页面
  2. 使用nginx,nginx可以设置哪些域名可以访问哪些资源,其他域名访问都会跳到错误页面

跨域问题解决方案

  1. 首先常用方法,添加请求头head,可以设置哪些域名允许跨域
  2. jsonp,前端技术,只支持get求情
  3. 使用网关,像nginx
  4. 使用httpClient转一道,rpc调用

java中的队列常用哪些

  1. ArrayBlockingQueue
  2. LinkedBlockingQueue
  3. DelayQueue
  4. PriorityBlockingQueue

Class.forName和classloader的区别

  1. Class.forName 只会加载类信息,不会执行类中的static块
  2. classloader除了加载类,还会执行static块

让你优化系统,你会做哪些

  1. 首选如果条件允许,tomcat集群部署,使用nginx做负载均衡和反向代理,分担压力
  2. 这可能会带来问题,比如该tomcat应用不支持集群部署,里面存在定时任务,不允许重复执行,还有session共享问题等等。
  3. 所以在集群前先解决上述问题,使用单独的分布式任务调度系统管理所有定时任务,系统代码该优化的优化,接口需要保证幂等性
  4. 随着集群化,并发量qps肯定能上来。接下来可以并发执行的优化还有数据库方面
  5. 开启慢查询,对用时比较长的语句进行explain,对该加索引的地方加上索引,能优化的地方优化。字段能用not null的地方用not null 因为is null的判断可能引起索引失效
  6. group by默认会进行排序,若不需要使用order by null禁用排序
  7. 还有后端缓存也是一大块,使用好缓存可以减少大量数据库io操作,可以增大qps,可以使用redis作为缓存,
  8. 前端动静分离,cdn加速
  9. 当然如果能有服务器操作权限,也可以适当的进行JVM调优

Redis和Memcached整体对比

  1. redis在单核的性能上高于mecached,memcached可以多核处理
  2. redis在单纯key-value存储上,memcached利用率更高,但redis使用hash结构的key-value则利用率比mecached高
  3. redis支持更丰富的数据操作,list,set,zset,string,hash
  4. redis可持久化数据

强引用,软引用,弱引用,虚引用

  1. 强引用 最普遍引用,对象引用存在永远不会被垃圾收集器回收
  2. 软引用和内存相关,软引用对象内存不足时清除
  3. 弱引用,短时间可取到对象,二次垃圾回收时清除
  4. 虚引用,假的引用,没有实际引用对象。多用于检测对象是否从内存中移除

hashMap在jdk1.7和1.8的区别

  1. 1.8在链表的基础上加入了红黑树,当链表长度超过8,链表结构将变成红黑树模式,降低时间复杂度
  2. 但要使用这个优势,key必须时间比较接口compare

死锁,活锁和饥饿

  1. 死锁,两个以上线程竞争资源导致都得不到资源
  2. 活锁,两个线程互相谦让资源导致都得不到资源
  3. 饥饿,一条线程一直等着另一条线程一直持有资源

redis中穿透与雪崩的预防及解决

  1. 穿透,同一个不存在数据的请求多次发起,由于缓存找不到数据,每次会请求数据库,导致缓存穿透
    • 可以通过缓存不存在的值,存入null值,访问到时返回null值处理方法
  2. 雪崩,大量缓存在同一时间失效,请求都访问数据库
    • 并发压力通过加锁或队列,当缓存失效时,对某个key只允许一条线程访问,其他等待
    • 缓存失效时间设置不同,尽量均匀分布
    • 加二级缓存,二级缓存失效时间大于一级缓存可以做到一级缓存失效,二级缓存可以起到作用
    • 如果能知道某个时间点会存在大量并发,可以设计手动reload,重新加载缓存

ES和solr对比

  1. ES自带分布式不需要其他依赖组件,solr需要依赖如zookeeper
  2. ES接近实时搜索,效率比solr高
  3. ES节点故障自动分配其他节点
  4. 对已有数据进行搜索时,solr更快;实时建立索引,ES更快

给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

  1. 方案一
    1. 50亿64字节大概在320G,明细全部加载内存不够
    2. 首先的想法肯定是分批对比,如何分,先a文件通过对每个url hash(url)%1000 得到的数代表文件编号,每个文件大概300M
    3. 再b文件同样的方式分割出相同数量1000个文件,则相同url所在的文件序号一定是相同的
    4. 由此可以继续对比每一对小文件,先将a1文件存入hashmap,再遍历b1文件,在a1存在则是共同的url
  2. 方案二 若允许有一定误差,可以使用bloomfilter
    1. bloom filter 的4G内存可以存储340亿bit
    2. 它的原理就是对存入值进行k散列,然后将数组中对应散列值置1
    3. 判断值是否存在的方法就是散列后对应值都为1,有一个为0就是不存在。全部为1则是很大可能存在

转载于:https://www.cnblogs.com/sky-chen/p/9755948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值