面试
文章平均质量分 85
怎能止步于此
一个创业者,一个希望能够在人生中有不断尝试的人,不断对未来有梦想的人,猜测、谣言、苦难、挫折,一定会伴随着你。
展开
-
深入研究池化技术——对象池
池化技术池化技术是性能调优的重要措施,池化的思想是把对象放到池子里,当要使用的时候,从池子里面拿对象,用完后再放回池子里,这样可以降低资源分配以及释放的开销,从而提升性能,在实际项目中,其实我们每天都在使用池化技术。关于池化技术有以下几种:对象池:通过复用对象,减少对象的创建、垃圾回收的开销线程池:通过复用线程来提升性能连接池:如数据库连接池/Redis连接池/HTTP连接池,通过复用TCP连接来减少创建和释放连接的时间来提升性能。本文,我们详细来探讨一下对象池。对象池对象池用于维护一些很原创 2021-11-07 13:40:09 · 1313 阅读 · 0 评论 -
Java并发之彻底搞懂读写锁
ReentrantReadWriteLock我们来探讨一下java.concurrent.util包下的另一个锁,叫做ReentrantReadWriteLock,也叫读写锁。实际项目中常常有这样一种场景:比如原创 2021-11-06 19:20:38 · 694 阅读 · 1 评论 -
java并发之彻底搞懂ReentrantLock
ReentrantLock在Java5之前synchronized是仅有的同步手段,从Java5开始便提供了ReentrantLock,即再入锁的实现。它的语义和synchronized基本相同,通过代码直接调用lock方法获取,代码编写也更加灵活。与此同时,位于java.util.concurrent.locks包下的ReentrantLock提供了很多使用方法,java.util.concurrent这个package即业界有名的J.U.C包,里面比较有名的工具类几乎都是基于Doug Lea大神写的原创 2021-11-06 13:09:58 · 582 阅读 · 0 评论 -
Java并发之彻底搞懂synchronized
前言我们开始向Java多线程模块发起进攻。由于Java线程这部分知识点非常多,并且网上也有相关的一些教程,如果要求小编把内容全部梳理完并不现实,我们重点介绍一些面试常考知识点,此外,还要给大家打个预防针,就是关于那种高大上的如何支撑千万级并发架构设计咱也不会说,毕竟没有在实际的系统中接触过这类知识的话,光靠在面试里面背概念不仅没有任何帮助,反而会给自己带来不少麻烦,做过就是做过,没做过就是没做过,并不是人人都有处理这种量级高并发的机会。希望大家不要被这类噱头唬住,毕竟万变不离其宗还是学习原理为主,所谓高并原创 2021-11-06 01:23:41 · 442 阅读 · 0 评论 -
打通JVM调优第四战-栈内存溢出
栈内存溢出关于虚拟机栈与本地方法栈在java虚拟机规范里是这样描述的:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError如果虚拟机的栈内存允许动态扩展,当无法申请到足够内存时,将抛出OutOfMemoryError虚拟机虽然是这样定义的,但是对于我们所熟悉的Hotspot虚拟机有两点意外:栈内存不允许动态扩展统一使用Xss设置栈大小,不区分虚拟机栈还是本地方法栈有的虚拟机是区分的,可以用Xss设置虚拟机栈,Xoss设置本地方法栈看下面一段原创 2021-10-26 23:59:51 · 225 阅读 · 0 评论 -
打通JVM调优第三战-堆内存溢出排查与分析
笔者有话说纸上得来终觉浅,绝知此事要躬行。这句话笔者一直把它当做自己的座右铭。希望大家也能抱有和笔者一样的姿态,多动手,多实践。让我们用实际行动证明,在我们年轻人的世界,不存在‘不可能’。聊聊内存溢出内存溢出是实际项目中经常会遇到的问题,关于内存溢出,可以细分为:堆内存溢出栈内存溢出方法区溢出直接内存溢出这四类。本文,我们就主要探讨一下堆内存溢出问题。看我下面演示一段容易造成OOM的代码:这段代码很简单,在main方法里面,我们不断地往oomList里面添加元素,然后使用我原创 2021-10-26 22:39:46 · 514 阅读 · 1 评论 -
打通JVM调优第二战-CPU过高问题定位
CPU过高问题如何定位?本文,我们来聊一下对于CPU过高问题如何定位。如果我们CPU占用率非常高,那么该怎样去定位哪段代码导致CPU过高呢?我们一般可以采用两种方式定位这种问题。top+jstacktop命令是linux中常用的命令,可以查看CPU的运行情况,比如查看CPU占用率,内存使用率等等。我们来演示一下:我们可以看到39331这个进程占用率最高,占用率为0.7%接着我们执行top -Hp 30331然后就可以显示出当前进程里面线程的运行信息我们可以看出来,29537这个线程是占原创 2021-10-25 23:34:49 · 429 阅读 · 0 评论 -
打通JVM调优第一条战-JVM日志
不同版本的JVM日志差异是比较大的,所以有必要专门探讨一下,首先我们先来看一下JDK 8里的JVM日志是怎么玩的。常用参数这里笔者整理了JDK8一部分相关垃圾收集和运行时的常用参数。JDK 8垃圾收集相关参数G1PrintHeapRegions、GCLogFileSize、NumberOfGCLogFiles、PrintAdaptiveSizePolicy、PrintGC、PrintGCApplicationConcurrentTime、PrintGCApplicationStoppedTime、P原创 2021-10-25 22:42:09 · 551 阅读 · 0 评论 -
JVM性能调优工具2之jcmd详解(覆盖全网最全的jcmd命令与说明文档)
上篇文章里《JVM常用性能调优工具详解1》我们已经探究了jps、jstat等监控工具,以及jinfo、jmap、jstack、jhat等故障排查工具,这里我单独拿出一篇文章,特别介绍jcmd。(因为jcmd这玩意细节太多了,整理文档就整理了好几个小时…)jcmdjcmd全称JVM Command,用于将诊断命令请求发送到正在运行的Java虚拟机,从JDK 7开始提供。使用说明命令如下:-f 从文件读取并执行命令-l 列出本机上的所有JVM进程我们先来看一下最简单的jcmd -l原创 2021-10-24 21:25:17 · 15137 阅读 · 0 评论 -
JVM常用性能调优工具详解1
前言工程学科是在不断动手的过程中来细化自己的领域,就像练武功一样,单凭着掌握一身武林绝学是远远不够的,在实战中,如何在多变的环境面前使用合适的招式,怎样出击,应该选择怎样的功法去迎击未知的对手,这往往都是经验之谈,当你踩过了无数的坑,沉淀了无数的线上问题,总结无数的经验,当问题来的时候你能拥有自己独特的见解与方案,你才能所向披靡,战无不胜。当你经验少的时候,要多学会辛苦一下自己,大不了就是比别人多干点活,通过不断编码,不断试错,你才能熟能生巧,慢慢的,我们才会从一个以苦劳展现价值的工程师,发展成一名靠经原创 2021-10-24 14:39:24 · 1753 阅读 · 0 评论 -
面临层出不穷的垃圾收集器我们如何选择?
如何选择垃圾收集器?前面几章,我们已经聊过了七种垃圾收集器,当然,在比较新的JDK版本中,还有低延迟更高效的垃圾收集器,比如:Shenandoah 、 ZGC… 这些内存我们以后再做详细介绍。那么,面临这么多的垃圾收集器,我们如何选择呢?我们可以从三个方面去考虑:你的应用系统关注的主要矛盾点是什么?比如说,某个项目是一个数据分析类的应用系统,我们希望它能更迅速的获得执行结果,那么吞吐量就是主要矛盾点。可以使用Parallel Scavenge而假设,某个应用是一个Web应用,Stop The原创 2021-10-24 08:33:52 · 258 阅读 · 0 评论 -
深入浅出垃圾收集器-G1收集器
G1收集器前面几篇博文中,我们聊了新生代收集器和老年代收集器(《深入浅出垃圾收集器-新生代收集器》、《深入浅出垃圾收集器-老年代收集器》),这篇文章主要和大家介绍最后一款主流的垃圾收集器 G1收集器。G1收集器的全称是:Garbge First这是一款面向服务器端应用的垃圾收集器,它既可以用于新生代,也可以用于老年代。内存布局G1这款垃圾收集器,它带来了很多革命性的变化,首先是堆内存布局的变化。我们来看一下图:和前面介绍的说有垃圾收集器都不一样,G1把整个java堆划分成了若干个大小相等的原创 2021-10-23 22:36:08 · 1750 阅读 · 0 评论 -
深入浅出垃圾收集器-老年代收集器
老年代收集器上篇文章中,和大家介绍了新生代收集器。这次,我们聊一聊老年代收集器。如果大家没有看过我的《深入浅出垃圾收集器-新生代代收集器》这篇文章的话,建议先去阅读后,再来学习这篇文章。Serial Old收集器也叫串行老年代收集器,可以认为它是Serial收集器的老年代版本。但是,它采用的是标记整理算法。它的执行过程大致是这样的:可以看出,他和Serial收集器相比,除了使用的算法不一样以外,其他和Serial收集器都是一样的。Serial收集器有哪些适用场景呢?可以和Serial/P原创 2021-10-23 18:46:10 · 439 阅读 · 0 评论 -
深入浅出垃圾收集器-新生代收集器
垃圾收集器前面我们已经详细探讨了垃圾收集算法,我们这次探讨一下垃圾收集器。垃圾收集算法为实现垃圾回收提供强有力的理论支持。而垃圾收集器则是利用垃圾收集算法,实现垃圾回收的实践落地。那么和垃圾收集算法类似,java也提供了多种垃圾收集器,不同的垃圾收集器也有不同的特性以及适用场景,甚至不同的垃圾收集器之间还可能存在配合使用的关系。那么使用起来还是比较复杂的。...原创 2021-10-23 09:30:09 · 500 阅读 · 0 评论 -
彻底理解分代收集算法
分代收集算法就目前来讲,业界各种商业虚拟机堆内存的垃圾收集,基本上都采用了分代收集。可想而知,分代收集算法有多么重要。分代收集算法的思想是:根据对象的存活周期,把内存分成多个区域,不同区域使用不同的回收算法回收对象。堆内存结构Java 把堆分成了"新生代"个"老年代",我们来看下图:经过分代之后,垃圾回收可以分成以下几类:新生代回收(Minor GC | Young GC)老年代回收(Major GC)清理整个堆(Full GC)由于执行Major GC的时候,也会伴随着一次原创 2021-10-22 22:16:29 · 2771 阅读 · 1 评论 -
打破垃圾回收的第一道壁堡,探究垃圾回收算法
垃圾回收算法这部分文章,我们聊聊垃圾回收算法,主要有五种垃圾回收算法标记清除算法标记整理算法复制算法分代收集算法增量算法标记清除(Mark-Sweep)标记需要回收的对象(这个过程其实就是前文中所提的通过可达性分析判断对象是否需要回收的过程)清理掉要回收的对象标记清除算法的有一个缺点,就是在清除之后会存在垃圾碎片标记整理(Mark-Compact)标记需要回收的对象把所有的存活的对象压缩到内存的一段清理掉边界外的所有空间复制算法(Copy)复制算法大致是这样玩的原创 2021-10-21 23:19:12 · 197 阅读 · 0 评论 -
初步探讨垃圾回收机制
写在前面社会上难免会有各种各样的偏见,年龄可以被否认,学历可以被否认,能力可以被否认,经验也可以被否认,但否认不了的,是我们年轻人一往无前的干劲,当有一天你能正确的接受和看待各种各样的偏见,不与他人相争,不与他人相比。静下心来,做自己的领域,成为自己心里的专家,做自己的偶像。万物没有什么可以争议,万事也没有什么值得惊奇,走自己的路,让别人说去吧。大话垃圾回收我们来探讨一下垃圾回收这个话题,垃圾回收是性能调优的重中之重,绝对值得我们深入研究。垃圾回收的内容水非常的深,细节也非常的多,小飞龙在准备这篇文原创 2021-10-21 21:31:25 · 244 阅读 · 0 评论 -
聊聊逃逸分析、标量替换与栈上分配
逃逸分析分析变量能否逃出他的作用域全局变量赋值逃逸方法返回值逃逸实例引用逃逸线程逃逸我们看下面一段代码:这段代码演示了三种逃逸的场景。public static SomeClass someClass;//全局变量赋值逃逸public void globalVariablePointerEscape() { someClass = new SomeClass();}这段代码里,我们把一个局部变量赋值给了一个静态变量,局部变量的作用域是在方法内部,类变量的作用域是在类里原创 2021-10-20 23:01:39 · 535 阅读 · 0 评论 -
大透编译器,聊聊方法内联
方法内联上篇文章中,和大家聊过JVM会用编译的方式为代码提速,那在这个基础上,即时编译器还做了很多的优化措施,从而进一步的提升性能,我们这次聊的方法内联就是即时编译器优化措施之一。来看下这段代码:private static int add1(int x1, int x2, int x3, int x4){ return add2(x1, x2) + add2(x3, x4);}private static int add2(int x1, int x2) { return x1 + x2;原创 2021-10-20 20:45:43 · 213 阅读 · 0 评论 -
侃侃编译器优化
字节码是如何运行的?首先我们先探讨一下字节码是如何运行的,众所周知,java有两种运行模式,一种叫解释执行,一种叫编译执行:解释执行:由编译器一行一行翻译执行编译执行:把字节码翻译成机器码,直接执行机器码下面我们来对比一下这两种执行模式:解释执行:优势在于没有编译的等待时间性能相对差一些编译执行:运行效率会高很多,一般认为比解释执行快一个数量级带来了额外开销那么怎样去查询Java是解释执行还是编译执行的呢?很简单,执行 java -version就可以了我们可原创 2021-10-19 23:49:24 · 282 阅读 · 0 评论 -
深研JVM 探讨类加载过程
类加载过程我们都知道,编写的java代码是不能直接运行的,需要编译成class文件才行,这个编译需要通过javac命令就可以实现。然而生成的class文件是一个二进制文件,是不方便我们阅读的,我们需要通过javap命令进行反编译。比如,我下面一段代码反编译后是这样的内容:我们分析一下反编译之后的结果可以看到 一个class文件包含了几部分第一部分:是类的描述信息,他记录了类的存储位置,最后一次修改时间,md5值,以及从哪个java类里编译出来的第二部分:还是一些描述信息,主要描述了这个类是原创 2021-10-18 22:37:02 · 387 阅读 · 2 评论 -
并发编程之原子性、有序性及可见性。
问题引入在计算机执行程序的过程中,每条指令都是在cpu中执行的。程序中的临时数据都是存放在主存中的。而cpu和数据直接产生交互的是高速缓存。在程序运行过程中,会将运算需要的数据从主存拷贝一份到高速缓存中。那么cup在进行计算时直接可以从高速缓存中读取数据和写入数据,运算结束后,再将高速缓存中的数据刷新到主存。很典型的一个例子: i = i+1;当线程执行这个语句时,cpu首先会先从主存中读取i的值,然后复制到高速缓存,然后cpu会对i进行+1的操作,然后写入高速缓存,最后刷新到主存中。缓存一原创 2021-08-18 00:28:28 · 195 阅读 · 0 评论