前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java相关技术问答(二)

java相关技术问答(二)

作者头像
老梁
发布2019-09-10 16:52:40
3480
发布2019-09-10 16:52:40
举报

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则是很大可能存在
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • String为什么是final的
  • cas原理讲下
  • 线程池线程数配置多少合适?
  • 为什么redis单线程还这么快
  • ThreadPoolExecutor中有哪些参数
  • jdk7和jdk8特性
  • 防盗链方法
  • 跨域问题解决方案
  • java中的队列常用哪些
  • Class.forName和classloader的区别
  • 让你优化系统,你会做哪些
  • Redis和Memcached整体对比
  • 强引用,软引用,弱引用,虚引用
  • hashMap在jdk1.7和1.8的区别
  • 死锁,活锁和饥饿
  • redis中穿透与雪崩的预防及解决
  • ES和solr对比
  • 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档