在java中使用SPI创建可扩展的应用程序

2020-08-22
阅读 3 分钟
1.7k
简介什么是可扩展的应用程序呢?可扩展的意思是不需要修改原始代码,就可以扩展应用程序的功能。我们将应用程序做成插件或者模块。这样可以在不修改原应用的基础上,对系统功能进行升级或者定制化。本文将会向大家介绍如何通过java中的SPI机制实现这种可扩展的应用程序。SPI简介SPI的全称是Java Service Provider Interf...

一文读懂jar包的小秘密

2020-08-20
阅读 5 分钟
2.8k
java程序员每天不是在创建jar包就是在创建jar包的路上,并且各种依赖引用都是以jar包的形式展示的。但是随着现代IDE的出现,我想很多程序员已经基本上很少直接和jar包打交道了。

troubleshoot之:GC调优到底是什么

2020-08-18
阅读 2 分钟
1.5k
简介我们经常会听到甚至需要自己动手去做GC调优。那么GC调优的目的到底是什么呢?让程序跑得更快?让GC消耗更少的资源?还是让程序更加稳定?带着这些疑问来读一下这篇文章,将会得到一个系统的甚至是不一样的结果。那些GC的默认值其实GC或者说JVM的参数非常非常的多,有控制内存使用的:有控制JIT的:有控制分代比例的,...

troubleshoot之:分析OutOfMemoryError异常

2020-08-14
阅读 3 分钟
1.6k
先看一下OutOfMemoryError的定义,OutOfMemoryError继承自VirtualMachineError,它是Error的一种,表示的是应用程序无法处理的异常,一般情况下会导致虚拟机退出。

troubleshoot之:使用JFR解决内存泄露

2020-08-12
阅读 3 分钟
1.3k
在C++中所有被分配的内存对象都需要要程序员手动释放。但是在java中并不需要这个过程,一切都是由GC来自动完成的。那么是不是java中就没有内存泄露了呢?

troubleshoot之:用control+break解决线程死锁问题

2020-08-08
阅读 5 分钟
1.4k
简介如果我们在程序中遇到线程死锁的时候,该怎么去解决呢?本文将会从一个实际的例子出发,一步一步的揭开java问题解决的面纱。死锁的代码写过java多线程程序的人应该都知道,多线程中一个很重要的事情就是状态的同步,但是在状态同步的过程中,一不小心就有可能会导致死锁的问题。一个最简单的死锁情况就是thread1占有...

JVM系列之:再谈java中的safepoint

2020-08-07
阅读 2 分钟
2.1k
java程序里面有很多很多的java线程,每个java线程又有自己的stack,并且共享了heap。这些线程一直运行呀运行,不断对stack和heap进行操作。

JVM系列之:从汇编角度分析NullCheck

2020-08-06
阅读 3 分钟
1.1k
之前我们在讲Virtual call的时候有提到,virtual call方法会根据传递的参数实例的不同而进行优化,从而优化成为classic call,从而提升执行效率。

JVM系列之:从汇编角度分析Volatile

2020-08-05
阅读 4 分钟
1.1k
Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了。Volatile是JMM(Java Memory Model)的一个非常重要的关键词。通过是用Volatile可以实现禁止重排序和变量值线程之间可见两个主要特性。

JVM系列之:JIT中的Virtual Call接口

2020-08-04
阅读 3 分钟
1.6k
简介上一篇文章我们讲解了Virtual Call的定义并举例分析了Virtual Call在父类和子类中的优化。JIT对类可以进行优化,那么对于interface可不可以做同样的优化么?一起来看看吧。最常用的接口ListList应该是大家最最常用的接口了,我想这个大家应该不会反驳。 {代码...} 今天我们就拿List来做例子,体验一下JIT优化接口的...

JVM系列之:JIT中的Virtual Call

2020-08-03
阅读 5 分钟
1.3k
有用过PrintAssembly的朋友,可能会在反编译的汇编代码中发现有些方法调用的说明是invokevirtual,实际上这个invokevirtual就是Virtual Call。

JVM详解之:类的加载链接和初始化

2020-08-01
阅读 2 分钟
2k
简介有了java class文件之后,为了让class文件转换成为JVM可以真正运行的结构,需要经历加载,链接和初始化的过程。这三个过程是怎么工作的呢?在本文中你将会找到答案。加载JVM可以分为三大部分,五大空间和三大引擎,要讲起来也不是特别复杂,先看下面的总体的JVM架构图。从上面的图中,我们可以看到JVM中有三大部分,...

JVM系列之:通过一个例子分析JIT的汇编代码

2020-07-31
阅读 2 分钟
1.3k
我们知道JIT会在JVM运行过程中,对热点代码进行优化,传说自然是传说,今天我们通过一个简单的例子来具体分析一下JIT到底是怎么进行优化的。

5万字长文:Stream和Lambda表达式最佳实践-附PDF下载

2020-07-27
阅读 39 分钟
3.1k
今天要讲的Stream指的是java.util.stream包中的诸多类。Stream可以方便的将之前的结合类以转换为Stream并以流式方式进行处理,大大的简化了我们的编程,Stream包中,最核心的就是interface Stream<T>

JVM系列之:对象的锁状态和同步

2020-07-24
阅读 3 分钟
1.6k
锁和同步是java多线程编程中非常常见的使用场景。为了锁定多线程共享的对象,Java需要提供一定的机制来实现共享对象的锁定,从而保证一次只有一个线程能够作用于共享对象。当第二个线程进入同一个区域的时候,必须等待第一个线程解锁该对象。

JVM系列之:Contend注解和false-sharing

2020-07-23
阅读 6 分钟
1.3k
现代CPU为了提升性能都会有自己的缓存结构,而多核CPU为了同时正常工作,引入了MESI,作为CPU缓存之间同步的协议。MESI虽然很好,但是不当的时候用也可能导致性能的退化。

一张PDF了解JDK11 GC调优秘籍-附PDF下载

2020-07-22
阅读 2 分钟
2.7k
JDK11相比JDK10,添加了一个新的Source-File Mode,可以直接通过java来运行单个java源文件,而不需要进行编译。同时还提供了新的HTTP API,支持响应性stream。

JVM系列之:String,数组和集合类的内存占用大小

2020-07-21
阅读 4 分钟
1.4k
之前的文章中,我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧。

JVM系列之:详解java object对象在heap中的结构

2020-07-20
阅读 5 分钟
1.4k
简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址。 今天,我们会更进一步,剖析一下在之前文章中没有讲解到的更深层次的细节。一起来看看吧。 对象和其隐藏的秘密 java.lang.Object大家应该都很熟悉了,Object是java中一切对象的鼻祖。 接下来我们来对这个java对象的鼻...

看动画学算法之:排序-归并排序

2020-07-19
阅读 3 分钟
1.5k
归并排序简称Merge sort是一种递归思想的排序算法。这个算法的思路就是将要排序的数组分成很多小的部分,直到这些小的部分都是已排序的数组为止(只有一个元素的数组)。

看动画学算法之:排序-选择排序

2020-07-18
阅读 3 分钟
2.2k
简介 选择排序就是从数组中选择出来最大或者最小的元素,然后将其和队首或者队尾的元素进行交互。 因为首先做的是一个选择的过程,所以叫做选择排序。 选择排序的例子 假如我们有一个数组:29,10,14,37,20,25,44,15,怎么对它进行选择排序呢? 先看一个动画: 选择排序的原理如下: 8个数字,我们需要进行7轮排序。 以第...

计算机揭秘之:网络分类和性能分析

2020-07-17
阅读 6 分钟
1.9k
简介 程序员天天都在写代码,关注的都是更高层次的封装,今天我们换个思路,让程序那些事来带你看一看隐藏在表象之下的网络和他们的性能分析。 本文主要涉及5个模块,分别是网络七层协议,延迟与带宽,IP,TCP,UDP。 OSI网络七层协议 在讲网络之前,一定要提到OSI网络七层协议。 OSI是Open System Interconnect的缩写,...

JVM详解之:运行时常量池

2020-07-16
阅读 3 分钟
6.5k
JVM在运行的时候会对class文件进行加载,链接和初始化的过程。class文件中定义的常量池在JVM加载之后会发生什么神奇的变化呢?快来看一看吧。

JVM详解之:java class文件的密码本

2020-07-15
阅读 9 分钟
1.7k
机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比,就可以轻松的解密了。

一张PDF了解JDK10 GC调优秘籍-附PDF下载

2020-07-14
阅读 3 分钟
1.1k
简介 今天我们讲讲JDK10中的JVM GC调优参数,JDK10中JVM的参数总共有1957个,其中正式的参数有658个。 其实JDK10跟JDK9相比没有太大的变化,一个我们可以感受到的变化就是引入了本地变量var。 为了方便大家的参考,特意将JDK10中的GC参数总结成了一张PDF,这个PDF在之前的JDK9的基础上进行了增减和修正,欢迎大家下载。 ...

看动画学算法之:排序-插入排序

2020-07-13
阅读 2 分钟
1.5k
简介 插入排序就是将要排序的元素插入到已经排序的数组中,从而形成一个新的排好序的数组。 这个算法就叫做插入排序。 插入排序的例子 同样的,假如我们有一个数组:29,10,14,37,20,25,44,15,怎么对它进行插入排序呢? 先看一个插入排序的动画,对它有个直观的了解: 我们来分析一下排序的流程。 八个数字,我们分为7轮...

看动画学算法之:排序-冒泡排序

2020-07-12
阅读 4 分钟
2.2k
简介 排序可能是所有的算法中最最基础和最最常用的了。排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序。 排序算法有很多种,每个都有其自身的优点和局限性。 今天我们来学习最最简单的冒泡排序算法。 冒泡排序的原理 冒泡排序的原理很简单,我们想象一下一个一个的气泡上浮的过程...

如果你想写自己的Benchmark框架

2020-07-11
阅读 3 分钟
1.6k
使用过JMH的同学一定会惊叹它的神奇。JMH作为一个优秀的Benchmark框架带给了我们无数的欢乐。作为一个有极客精神的程序员,那么有没有想过去自己实现一个Benchmark框架呢?

JVM中栈的frames详解

2020-07-10
阅读 3 分钟
1.9k
我们知道JVM运行时数据区域专门有一个叫做Stack Area的区域,专门用来负责线程的执行调用。那么JVM中的栈到底是怎么工作的呢?快来一起看看吧。

小师妹学JVM之:Dirty cards和PLAB

2020-07-09
阅读 2 分钟
1.6k
分代垃圾回收器在进行minor GC的时候会发生什么操作呢?有没有什么提高效率的手段呢?今天我们和小师妹一起来了解一下垃圾回收中的Dirty cards和PLAB