java相关技术问答(二)
String为什么是final的
- 首先是为了安全性,final表示不可变,不可被继承,不能修改其方法保证安全
- 在多线程环境下,final类型的String保证线程安全
- String支持字符串常量池,相同字符串可以指向相同地址
cas原理讲下
- cas算法包含三个参数,v需要更新的变量,e预期值,n新的值
- 进入cas算法时,会先记录更新变量值,然后进入compareAndSwap方法,判断v是否等于e,相等说明v值没有被改变,那v值更新成n值
线程池线程数配置多少合适?
- 需要根据所执行的任务类别来区分
- 分为cpu密集型和IO密集型
- cpu密集型线程数和cpu数量相同
- io密集型,表示任务中需要执行像数据库操作,磁盘操作这类io阻塞等待的操作
- 这个时候,有公式来算出最佳执行线程=(线程io阻塞时间/io运行时间+1)*cpu数
为什么redis单线程还这么快
- redis虽然是单线程,但他的操作完全是在内存进行的,内存的速度比IO快很多,可以有效提高cpu的利用率
ThreadPoolExecutor中有哪些参数
- 核心线程数
- 最大线程数
- 最大空闲时间
- 单位
- 阻塞队列
- 超出队列任务处理
jdk7和jdk8特性
- jdk7可以使用switch字符串了
- jdk7 try-catch资源块,可以自动释放
- jdk8 lambda表达式 函数式编程
- jdk8 接口可以实现默认方法了
防盗链方法
- 判断请求头refered,不是自己的域名,重定向到别的页面
- 使用nginx,nginx可以设置哪些域名可以访问哪些资源,其他域名访问都会跳到错误页面
跨域问题解决方案
- 首先常用方法,添加请求头head,可以设置哪些域名允许跨域
- jsonp,前端技术,只支持get求情
- 使用网关,像nginx
- 使用httpClient转一道,rpc调用
java中的队列常用哪些
- ArrayBlockingQueue
- LinkedBlockingQueue
- DelayQueue
- PriorityBlockingQueue
Class.forName和classloader的区别
- Class.forName 只会加载类信息,不会执行类中的static块
- classloader除了加载类,还会执行static块
让你优化系统,你会做哪些
- 首选如果条件允许,tomcat集群部署,使用nginx做负载均衡和反向代理,分担压力
- 这可能会带来问题,比如该tomcat应用不支持集群部署,里面存在定时任务,不允许重复执行,还有session共享问题等等。
- 所以在集群前先解决上述问题,使用单独的分布式任务调度系统管理所有定时任务,系统代码该优化的优化,接口需要保证幂等性
- 随着集群化,并发量qps肯定能上来。接下来可以并发执行的优化还有数据库方面
- 开启慢查询,对用时比较长的语句进行explain,对该加索引的地方加上索引,能优化的地方优化。字段能用not null的地方用not null 因为is null的判断可能引起索引失效
- group by默认会进行排序,若不需要使用order by null禁用排序
- 还有后端缓存也是一大块,使用好缓存可以减少大量数据库io操作,可以增大qps,可以使用redis作为缓存,
- 前端动静分离,cdn加速
- 当然如果能有服务器操作权限,也可以适当的进行JVM调优
Redis和Memcached整体对比
- redis在单核的性能上高于mecached,memcached可以多核处理
- redis在单纯key-value存储上,memcached利用率更高,但redis使用hash结构的key-value则利用率比mecached高
- redis支持更丰富的数据操作,list,set,zset,string,hash
- redis可持久化数据
强引用,软引用,弱引用,虚引用
- 强引用 最普遍引用,对象引用存在永远不会被垃圾收集器回收
- 软引用和内存相关,软引用对象内存不足时清除
- 弱引用,短时间可取到对象,二次垃圾回收时清除
- 虚引用,假的引用,没有实际引用对象。多用于检测对象是否从内存中移除
hashMap在jdk1.7和1.8的区别
- 1.8在链表的基础上加入了红黑树,当链表长度超过8,链表结构将变成红黑树模式,降低时间复杂度
- 但要使用这个优势,key必须时间比较接口compare
死锁,活锁和饥饿
- 死锁,两个以上线程竞争资源导致都得不到资源
- 活锁,两个线程互相谦让资源导致都得不到资源
- 饥饿,一条线程一直等着另一条线程一直持有资源
redis中穿透与雪崩的预防及解决
- 穿透,同一个不存在数据的请求多次发起,由于缓存找不到数据,每次会请求数据库,导致缓存穿透
- 可以通过缓存不存在的值,存入null值,访问到时返回null值处理方法
- 雪崩,大量缓存在同一时间失效,请求都访问数据库
- 并发压力通过加锁或队列,当缓存失效时,对某个key只允许一条线程访问,其他等待
- 缓存失效时间设置不同,尽量均匀分布
- 加二级缓存,二级缓存失效时间大于一级缓存可以做到一级缓存失效,二级缓存可以起到作用
- 如果能知道某个时间点会存在大量并发,可以设计手动reload,重新加载缓存
ES和solr对比
- ES自带分布式不需要其他依赖组件,solr需要依赖如zookeeper
- ES接近实时搜索,效率比solr高
- ES节点故障自动分配其他节点
- 对已有数据进行搜索时,solr更快;实时建立索引,ES更快
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
- 方案一
- 50亿64字节大概在320G,明细全部加载内存不够
- 首先的想法肯定是分批对比,如何分,先a文件通过对每个url hash(url)%1000 得到的数代表文件编号,每个文件大概300M
- 再b文件同样的方式分割出相同数量1000个文件,则相同url所在的文件序号一定是相同的
- 由此可以继续对比每一对小文件,先将a1文件存入hashmap,再遍历b1文件,在a1存在则是共同的url
- 方案二 若允许有一定误差,可以使用bloomfilter
- bloom filter 的4G内存可以存储340亿bit
- 它的原理就是对存入值进行k散列,然后将数组中对应散列值置1
- 判断值是否存在的方法就是散列后对应值都为1,有一个为0就是不存在。全部为1则是很大可能存在
java相关技术问答(二)的更多相关文章
- java相关技术问答(一)
网上一些没有标准答案的面试题,我自己做的解答总结,有任何异议可以提出来~^_^,不断更新中... Springboot除了自动配置与传统的spring还有哪些不同 传统的springweb项目需要部署 ...
- Java压缩技术(二) ZIP压缩——Java原生实现
原文:http://snowolf.iteye.com/blog/642298 去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充.今天得空,整理一下ZI ...
- 在Eclipse中使用Maven插件 博客分类: Java相关技术
简介 本文介绍如何在Eclipse中通过maven插件编写java项目和web项目. 安装Maven 下载Maven最新版本,见:maven.apache.org/download.html 当前版本 ...
- JAVA相关技术
开发服务器环境: 1.Linux系统 CentOS 6.5\7 2.JDK1.8 3.tomcat 9 4.mysql 5.7 开发环境: 1.开发集成工具:idea 2.构建工具maven 仓库暂时 ...
- java -相关技术
地址: http://www.codeyyy.com/java/11-35-52.html
- Java加密技术
相关链接: Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC Java加密技术(二)——对称加密DES&AES Java加密技术(三)——PBE算法 ...
- Java加密技术(八)——数字证书
原文:http://snowolf.iteye.com/blog/391931 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法. 在构建Java代码实现前,我们需要完成证 ...
- Java后端技术微信交流群!工作、学习、技术、资源等!期待你的加入!
<Java后端技术>专注Java相关技术:SSM.Spring全家桶.微服务.MySQL.MyCat.集群.分布式.中间件.Linux.网络.多线程,偶尔讲点运维Jenkins.Nexus ...
- 深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
随机推荐
- 最适合入门的Laravel中级教程(四)前端开发
Laravel 使用 npm 安装前端依赖: npm 是一个类似 composer 的工具: 用于管理前端的各种依赖包: 在使用之前需要先安装 node : Windows 下可以在官网下载安装: h ...
- Zabbix告警脚本-短信
[root@iot-svndata02 bin]# cat zbsms.sh #!/bin/sh #curl http://221.179.180.137:8080/smsaServer/lkSend ...
- python的基本用法(三)字符串常用函数
字符串常用函数 # s='.abcd.'# new_s=s.strip('.')#默认去掉字符串两边的空格和换行符,想去掉什么括号中就写什么# print('s',s)# print('new_s', ...
- CentOS7 使用ifconfig命令 ENS33没有IP地址的解决办法
最近在研究和学习Linux操作系统,我并没有安装独立的Linux操作系统,我选择在虚拟机上安装Linux操作系统.我选择的虚拟机的版本是VMware Workstation Pro14,然后在虚拟机上 ...
- python 之字符编码
一 了解字符编码的储备知识 python解释器和文件本编辑的异同 相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样 不 ...
- java 组件开发中的日志记录问题
今天帮别人写封装几个url 请求,打成jar 包,可以以java接口的方式提供给外部访问. 遇到两个问题: 1. 是否把依赖的jar包也 打入 我要生成的jar包中,如果你不打入,别人直接调用接口会报 ...
- Maven学习 四 Eclipse与Maven结合的配置
本问承接Maven学习 三 第一步:配置本地仓库 (1)默认配置 查看 本地仓库的位置是在一个叫做setting.xml的配置文件中设置,如果我们不配置,会使用开发工具自己集成的一个setting.x ...
- merge and saveorupdate
首先 saveOrUpdate返回void 也就是什么都不返回 而merge会返回一个对象 merge 在执行session.merge(a)代码后,a对象仍然不是持久化状态,a对象仍然不会被关联到S ...
- Win7 VS2015编译wxWidgets-3.1.0
下载 https://www.wxwidgets.org/downloads/ 打开SLN工程 D:\CPPLibs\wxWidgets-3.1.0\build\msw\wx_vc14.sln 编译 ...
- java的poi 读取exc 文件
package lizikj.bigwheel.shop.util.excel; import java.io.File; import java.io.FileInputStream; import ...