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. 网络抓包工具 wireshark 入门教程

    Wireshark Wireshark(前称Ethereal)是一个网络数据包分析软件.网络数据包分析软件的功能是截取网络数据包,并尽可能显示出最为详细的网络数据包数据.Wireshark使用WinP ...

  2. CentOS7下安装Gitlab社区版【安装步骤、IP改域名、修改端口】

    这两天一直在给公司的服务器配置Gitlab(10.5.4).过程很是痛苦,所以把过程记录一下. 1.安装CentOS7 从官网上下载了最新版CentOS-7-x86_64-DVD-1708.iso.用 ...

  3. jquery抓娃娃机代码

    <html><head><title>jQuery抓娃娃机游戏代码 - 源码之家</title><meta name="content- ...

  4. MariaDB ColumnStore初探(1):安装、使用及测试

    相信大家在对接BI数据报表部门有很深刻的体验,高大上的复杂SQL关联JOIN十几张表在InnoDB里跑起来,会让你酸爽到死.它的出现正是解决这个问题,DBA能不能轻松愉快地玩耍,就要靠它了,“神州行我 ...

  5. Extension-valuepart

    data: ls_extension type bapiparex. loop at extensionin into ls_extension . read table extensionout i ...

  6. spring多线程

    Spring4.x高级话题(二):多线程 一. 点睛 Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池 ...

  7. centos 7 安装pip

    1.首先检查centos 有没有安装python-pip 包, >>yum install python-pipnotice:NO package python-pip available ...

  8. sql语句-单表查询

    一:单表查询 CREATE TABLE `Score`( `s_id` ), `c_id` ), `s_score` ), PRIMARY KEY(`s_id`,`c_id`) ); ); ); ); ...

  9. c# sshnet控制linux 使用unzip的一些问题

    无法使用unzip 解压缩 linux文件夹下的zip文件 于是想在win下生成一个 shell 文件传到linux 下运行,结果这个sh文件在linux  运行时出错,同样的文件在linux下生成就 ...

  10. java动态生成验证码图片

    package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import ...