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则是很大可能存在

java相关技术问答(二)的更多相关文章

  1. java相关技术问答(一)

    网上一些没有标准答案的面试题,我自己做的解答总结,有任何异议可以提出来~^_^,不断更新中... Springboot除了自动配置与传统的spring还有哪些不同 传统的springweb项目需要部署 ...

  2. Java压缩技术(二) ZIP压缩——Java原生实现

    原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZI ...

  3. 在Eclipse中使用Maven插件 博客分类: Java相关技术

    简介 本文介绍如何在Eclipse中通过maven插件编写java项目和web项目. 安装Maven 下载Maven最新版本,见:maven.apache.org/download.html 当前版本 ...

  4. JAVA相关技术

    开发服务器环境: 1.Linux系统 CentOS 6.5\7 2.JDK1.8 3.tomcat 9 4.mysql 5.7 开发环境: 1.开发集成工具:idea 2.构建工具maven 仓库暂时 ...

  5. java -相关技术

    地址:      http://www.codeyyy.com/java/11-35-52.html

  6. Java加密技术

    相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法  ...

  7. Java加密技术(八)——数字证书

    原文:http://snowolf.iteye.com/blog/391931 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证 ...

  8. Java后端技术微信交流群!工作、学习、技术、资源等!期待你的加入!

    <Java后端技术>专注Java相关技术:SSM.Spring全家桶.微服务.MySQL.MyCat.集群.分布式.中间件.Linux.网络.多线程,偶尔讲点运维Jenkins.Nexus ...

  9. 深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

随机推荐

  1. 最适合入门的Laravel中级教程(四)前端开发

    Laravel 使用 npm 安装前端依赖: npm 是一个类似 composer 的工具: 用于管理前端的各种依赖包: 在使用之前需要先安装 node : Windows 下可以在官网下载安装: h ...

  2. Zabbix告警脚本-短信

    [root@iot-svndata02 bin]# cat zbsms.sh #!/bin/sh #curl http://221.179.180.137:8080/smsaServer/lkSend ...

  3. python的基本用法(三)字符串常用函数

    字符串常用函数 # s='.abcd.'# new_s=s.strip('.')#默认去掉字符串两边的空格和换行符,想去掉什么括号中就写什么# print('s',s)# print('new_s', ...

  4. CentOS7 使用ifconfig命令 ENS33没有IP地址的解决办法

    最近在研究和学习Linux操作系统,我并没有安装独立的Linux操作系统,我选择在虚拟机上安装Linux操作系统.我选择的虚拟机的版本是VMware Workstation Pro14,然后在虚拟机上 ...

  5. python 之字符编码

    一    了解字符编码的储备知识 python解释器和文件本编辑的异同      相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样 不 ...

  6. java 组件开发中的日志记录问题

    今天帮别人写封装几个url 请求,打成jar 包,可以以java接口的方式提供给外部访问. 遇到两个问题: 1. 是否把依赖的jar包也 打入 我要生成的jar包中,如果你不打入,别人直接调用接口会报 ...

  7. Maven学习 四 Eclipse与Maven结合的配置

    本问承接Maven学习 三 第一步:配置本地仓库 (1)默认配置 查看 本地仓库的位置是在一个叫做setting.xml的配置文件中设置,如果我们不配置,会使用开发工具自己集成的一个setting.x ...

  8. merge and saveorupdate

    首先 saveOrUpdate返回void 也就是什么都不返回 而merge会返回一个对象 merge 在执行session.merge(a)代码后,a对象仍然不是持久化状态,a对象仍然不会被关联到S ...

  9. Win7 VS2015编译wxWidgets-3.1.0

    下载 https://www.wxwidgets.org/downloads/ 打开SLN工程 D:\CPPLibs\wxWidgets-3.1.0\build\msw\wx_vc14.sln 编译 ...

  10. java的poi 读取exc 文件

    package lizikj.bigwheel.shop.util.excel; import java.io.File; import java.io.FileInputStream; import ...