你问我答03
问: 就是我现在有一个字串,希望找出它的最长不重复子串的长度。我举个例子啊,就是这个组串,其中最长的不成的组串长度是三。那比如说abcabca啊,这些都是它的最长不重复的串啊,abca呢这就不是因为这个a 有两个重复了。好吧,再把写到这个版本上。
嗯,好的。嗯,我写完了。
问: 嗯,行,那简单说一下你这道题的思路吧。
嗯,可以的,我用了一个滑动窗口,滑动窗口每次都会向右扩张一个字符。然后检查这个字符在滑动窗口里面呢,是不是存在的。要是不存在的话呢,就会继续向右扩张。要是存在的话,窗口左侧呢就会开始收缩。直到收缩到这个新字符没有重复。然后这个i 我是用来记录窗口的最大长度啊,这个长度呢就是要求的最长不重复子串的长度。
问: 你在项目里面用redis 是做缓存呢,还是做存储呢?
嗯,主要是用来做缓存的,
问: 主要是用来缓存什么数据呢?
这个是用来缓存一些商品信息。
问: 在你这个小店第一次上线的时候,Redis有没有进行过预热呢?
进行了一个简单的预热。我们在上线之前预测了一些热点的商品,然后就把这些商品信息添加到了redis 里面。然后随着用户不断请求我们的服务,会 ...
你问我答02
问:我们先聊一下Java基础知识吧,在你工作的时候,用过哪些并发的工具类呢?
我在工作的时候用过Atomiclnteger,AtomicReference这些原子类,也用过 ReentrantLock 、还有ReadWrtteLock这两种锁,然后还用过CountDownLatch
问: 简单介绍一下 Aomiclnteger底层的原理吧
Atomiclnteger底层是通过一个volatile 修饰的lnt值还有CAS操作实现的,CAS 操作的这个含义呢就是JVM的一个原子性操作,它具体是比较一个值,和我们预期的值是不是一致的,在这个时候如果一致的话就表示没有其他线程,并发去修政这个值。这样的话我们就可以安全的把这个值替换成我们的目标值
问: 为什么不能使用volatile关键字,必须使用Atomiclnteger呢?
当时我的场景是需要把一个值进行加一操作,这样的话,就必须使用Atomiclnteger,因为volatile关键字它只能保证可见性、顺序性和读写操作的原子性。我先简单说一下volatile 的这几个特性吧,可见性就是一个线程修改了volatile关键字修饰 ...
你问我答04
问: 你常用的集合类有哪些呢?
我常用的有ArrayList ,LinkedList ,HashMap,TreeMap,还有HashSet,treeSet,然后支持并发的用过ConcurrentHashMap,CopyOnWriteArrayList,ConcurrentSkipListMap大概就是这些
问: 问:你是在什么场景下用的CopyOnWriteArrayList这个集合呢?
当时的情况是这样的,当时我们的监控系统做了一个动态加载的功能。动态加载的这些扩展模块,都会生成一个对应的model 对象,然后放到CopyOnWriteArrayList里面去。这些扩展模块,主要就是接收我们监控系统的一些消息啊,就比如说有的是用来发异常报警的,而有的是用来持久化这些报警信息的。然后在我们的监控系统里面,就会起一个线程去定期检查这些动态模块的目录。嗯,如果发现新的模块的jar包,那就直接加载上来。然后把这个放到CopyOnWriteArrayList 里面。这个变更一般都是比较少的,所以说是比较符合这个CopyOnWriteArrayList的使用场景啊,毕竟它是比较适合那种读 ...
Docker基础
1. Docker简介1.1 是什么问题:为什么会有docker出现
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
之前在服务器配置一个应用的运行环境,要安装各种软件,就拿尚硅谷电商项目的环境来说吧,Java/Tomcat/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
传统上认为,软件编码开 ...
CompletableFuture异步编程
CompletableFuture组合式异步编程1.1 线程回顾初始化线程的4种方式:
继承Thread
实现Runnable接口
实现Callable接口 + FutureTask (可以拿到返回结果,可以处理异常)
线程池
方式1和方式2:主进程无法获取线程的运算结果。不适合当前场景
方式3:主进程可以获取线程的运算结果,并设置给itemVO,但是不利于控制服务器中的线程资源。可以导致服务器资源耗尽。
方式4:通过如下两种方式初始化线程池:
123Executors.newFiexedThreadPool(3);//或者new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit unit, workQueue, threadFactory, handler);
通过线程池性能稳定,也可以获取执行结果,并捕获异常。但是,在业务复杂情况下,一个异步调用可能会依赖于另一个异步调用的执行结果。
1.2. CompletableFuture介绍Future是Java 5添加的类,用来描述 ...
虚拟内存调整
前言因为这个阿里服务器是购买的学生服务器,所以内存只有2G,项目在运行的时候,占用的内存已经报表,所以有的时候就会出现宕机的情况发生,后面发现可以通过使用增加虚拟内存空间,来增加内存容量。 下面进入正题,讲解下CentOS7下swap分区的创建和删除。
swap分区的创建1、查看磁盘使用情况1free -h
而Mem就表示购买阿里云时候的内存,我们能够看到只有1.8G,并且已经使用了1.7G。(说着说着,眼泪就流了下来)
因为我之前增加了交换空间4G,所以Swap会显示4G,并且已经使用了1G了
2、添加Swap分区使用dd命令创建名为swapfile 的swap交换文件(文件名和目录任意):
1dd if=/dev/zero of=/var/swapfile bs=1024 count=4194304
dev/zero是Linux的一种特殊字符设备(输入设备),可以用来创建一个指定长度用于初始化的空文件,如临时交换文件,该设备无穷尽地提供0,可以提供任何你需要的数目。
bs=1024 :单位数据块(block)同时读入/输出的块字节大 ...
JVM调优工具详解及调优实战
前置启动程序
123456789101112public class HelloGC { byte[] a = new byte[1024 * 100]; //100kb public static void main(String[] args) throws InterruptedException { List list = new ArrayList(); while (true) { list.add(new HelloGC()); Thread.sleep(100); } }}
事先启动一个web应用程序(没有准备好的直接用我上面着代码也行),用jps查看其进程id,接着用各种jdk自带命令优化应用
Jmap此命令可以用来查看内存信息,实例个数以及占用内存大小
12jmap -histo 14660 #查看历史生成的实例jmap -histo:live 14660 #查看当前存活的实例,执行过程中可能 ...
JVM调优第三方
阿里巴巴Arthas详解Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas 官方文档十分详细,详见:https://alibaba.github.io/arthas
Arthas使用场景
得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。
是否有一个全局视角来查看系统的运行状况?
为什么 CPU 又升高了,到底是哪里占用了 CPU ?
运行的多线程有死锁吗?有阻塞吗?
程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
有什么办法可以监控到 JVM 的实时运行状态?
Arthas使用
1234# github下载arthaswget ...
JvisualVM安装插件
JvisualVM安装插件给jdk自带的jvisualvm安装Visual GC插件,遇到We’re sorry the java.net site has closed(我们很抱歉java.net网站已经关闭)
1、找到新的更新地址 visualvm新访问地址:https://visualvm.github.io/index.html
进入“Plugins”,找到对应自己JDK版本的更新地址
2、进入jvisualvm的插件管理“工具” - “插件”
在”设置”中修改url地址为刚才我们在github上找到的对应我们JDK版本的地址
修改成功后,可用插件即可刷新出来
3、安装VisualGC插件
4、重启即可看到VisualGC
JVisualVM使用
Visual VM作用: 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样,预示着他除了运行监视、故障处理外,还提供了很多其他方面的功能。如性能分析,VisualVM的性能分析功能甚至比起很多专业的收费的工具都不会逊色多少,而且VisualVM还有一个很大的优点:不需要被监视的程序基于特殊的运行,因此他对应用程序的实际性能的影响很小,使得他可以直接应用在生产环境中。
VisualVM基于NetBeans平台开发,因此他一开始就具备了插件扩展功能的特性,通过插件扩展支持,VisualVM可以做到:
显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
监视应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)。
dump以及分析堆转储快照(jmap、jhat)。
方法级的程序运行性能分析,找到被调用最多、运行时间最长的方法。
离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快 ...



