watermark

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

拥有回忆 提交于 2020-08-04 10:02:54
简介 上一篇文章我们讲解了Virtual Call的定义并举例分析了Virtual Call在父类和子类中的优化。 JIT对类可以进行优化,那么对于interface可不可以做同样的优化么? 一起来看看吧。 最常用的接口List List应该是大家最最常用的接口了,我想这个大家应该不会反驳。 public interface List<E> extends Collection<E> { 今天我们就拿List来做例子,体验一下JIT优化接口的奥秘。 还是上代码,要分析的代码如下: public class TestVirtualListCall { public static void main(String[] args) throws InterruptedException { List<String> list=new ArrayList<>(); for (int i = 0; i < 10000; i++) { doWithVMethod(list); } Thread.sleep(1000); } public static void doWithVMethod(List<String> list) { list.add("www.flydean.com"); } } 如果在命令行运行,大家记得在运行时添加参数-XX:

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

半城伤御伤魂 提交于 2020-07-29 08:09:18
简介 排序可能是所有的算法中最最基础和最最常用的了。排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序。 排序算法有很多种,每个都有其自身的优点和局限性。 今天我们来学习最最简单的冒泡排序算法。 冒泡排序的原理 冒泡排序的原理很简单,我们想象一下一个一个的气泡上浮的过程。 假设我们有八个数字 29,10,14,37,20,25,44,15 要进行排序。 我们先用一个动画图来直观的观察一下整个冒泡排序的过程: 排序共进行八轮,每一轮都会做两两比较,并将较大的元素右移,就像冒泡一下。 一轮结束之后,八个元素中最大的那个元素44将会移动到最右边。 然后再重复其他的几轮。最终得到一个完全排序的数组。 也可以这样看: 第一轮是将八个元素中的最大值44交换移动到最右位置。 第二轮是将八个元素中的次大值37交换移动到最右位置。 以此类推。 冒泡排序算法的java实现 我们先看一个最简单的冒泡算法: public class BubbleSort { public void doBubbleSort(int[] array){ log.info("排序前的数组为:{}",array); //外层循环,遍历所有轮数 for(int i=0; i< array.length-1; i++){ //内层循环,两两比较,选中较大的数字,进行交换 for(int j=0; j

java 类加载系统

人盡茶涼 提交于 2020-07-29 07:17:18
java很强大,特别是加载系统,看到好多人在背空洞的概念,可没有实践过,我就表演下 0. 原材料: 先建几个java文件 打开cmd,切换到想要的工作盘符,比如d: 按回车键,然后cd到工作目录 然后新建目录md code,然后cd code,然后在建子目录md classloader,最后进入到子目录下 开始新建三个java文件:PrintService.java,PrintServiceImpl.java,ServiceTest.java cd .>PrintService.java cd .>PrintServiceImpl.java cd .>ServiceTest.java public interface PrintService { void print (String msg) ; } public class PrintServiceImpl implements PrintService { @Override public void print (String msg) { System.out.println( "Jar Hello : " + msg); } } public class ServiceTest { public static void main (String[] args) { PrintServiceImpl printService

小师妹学JVM之:cache line对代码性能的影响

懵懂的女人 提交于 2020-07-29 05:35:13
简介 读万卷书不如行万里路,讲了这么多assembly和JVM的原理与优化,今天我们来点不一样的实战。探索一下怎么使用assembly来理解我们之前不能理解的问题。 一个奇怪的现象 小师妹:F师兄,之前你讲了那么多JVM中JIT在编译中的性能优化,讲真的,在工作中我们真的需要知道这些东西吗?知道这些东西对我们的工作有什么好处吗? um...这个问题问得好,知道了JIT的编译原理和优化方向,我们的确可以在写代码的时候稍微注意一下,写出性能更加优秀的代码,但是这只是微观上了。 如果将代码上升到企业级应用,一个硬件的提升,一个缓存的加入或者一种架构的改变都可能比小小的代码优化要有用得多。 就像是,如果我们的项目遇到了性能问题,我们第一反应是去找架构上面有没有什么缺陷,有没有什么优化点,很少或者说基本上不会去深入到代码层面,看你的这个代码到底有没有可优化空间。 第一,只要代码的业务逻辑不差,运行起来速度也不会太慢。 第二,代码的优化带来的收益实在太小了,而工作量又非常庞大。 所以说,对于这种类似于鸡肋的优化,真的有必要存在吗? 其实这和我学习物理化学数学知识是一样的,你学了那么多知识,其实在日常生活中真的用不到。但是为什么要学习呢? 我觉得有两个原因,第一是让你对这个世界有更加本质的认识,知道这个世界是怎么运行的。第二是锻炼自己的思维习惯,学会解决问题的方法。 就想算法

Java高级特性之Instrumentation

≯℡__Kan透↙ 提交于 2020-07-29 02:20:57
不要说精通Java、Spring,能掌握70%就很不错了,其他的高级特性。。。 我们平常开发java程序时,总想开发一个代理程序监视记录类的运行情况,比如性能监控或运维人员很需要,比如调用业务方法时记录日志、计时等,除了AOP实现之外,还有一种实现,那就是基于java高级特性Instrumentation功能, 比如很多开源或商业公司也是基于此玩法, 用开源的技术赚钱是我们一生的梦想!!!!!!!!! Instrumentation简介 利用java.lang.instrument(容器类) 做动态 Instrumentation(执行容器) 是 Java SE 5 的新特性。 使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。 这个功能为虚拟机监控提供了支撑。 利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序

Spring 过滤器 拦截器 AOP区别

安稳与你 提交于 2020-07-29 01:06:16
简介 这几天在回顾Spring的AOP时,对过滤器,拦截器,AOP的关系有点好奇,故记录做以备份。在实现一些公共逻辑的时候,很多功能通过过滤器,拦截器,AOP都能实现,但是不同的方式有不同的效率。具体有什么区别,看下文描述。 前后端交互基本逻辑 过滤器 过滤器拦截的是URL Spring中自定义过滤器(Filter)一般只有一个方法,返回值是void,当请求到达web容器时,会探测当前请求地址是否配置有过滤器,有则调用该过滤器的方法(可能会有多个过滤器),然后才调用真实的业务逻辑,至此过滤器任务完成。过滤器并没有定义业务逻辑执行前、后等,仅仅是请求到达就执行。 特别注意:过滤器方法的入参有request,response,FilterChain,其中FilterChain是过滤器链,使用比较简单,而request,response则关联到请求流程,因此可以对请求参数做过滤和修改,同时FilterChain过滤链执行完,并且完成业务流程后,会返回到过滤器,此时也可以对请求的返回数据做处理。 拦截器 拦截器拦截的是URL 拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。Spring中拦截器有三个方法:preHandle,postHandle,afterCompletion。分别表示如下 public boolean preHandle

Qt开发技术:QtCharts(一)QtCharts基本介绍以及图表框架详解

我的未来我决定 提交于 2020-07-28 20:34:32
若该文为原创文章,未经允许不得转载 原博主博客地址: https://blog.csdn.net/qq21497936 原博主博客导航: https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址: https://blog.csdn.net/qq21497936/article/details/106528645 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) Qt开发专栏:开发技术(点击传送门) 《 Qt开发技术:QtCharts(一)QtCharts基本介绍以及图表框架详解 》  敬请期待... <br> 前话   Qt自带的二维图标QCharts相关研发笔记。 Qt图标(Qt Charts) 概述   Qt图表模块提供了一组易于使用的图表组件。它使用Qt图形视图框架,因此图表可以很容易地集成到现代用户界面中。Qt图表可以用作QWidgets、QGraphicsWidget或QML类型。用户可以通过选择一个图表主题轻松创建令人印象深刻的图表。 开始使用   在应用程序中使用Qt图表C++类

八张图彻底了解JDK8 GC调优秘籍-附PDF下载

て烟熏妆下的殇ゞ 提交于 2020-07-28 19:33:25
简介 JVM的参数有很多很多,根据我的统计JDK8中JVM的参数总共有1853个,正式的参数也有680个。 这么多参数带给我们的是对JVM的细粒度的控制,但是并不是所有的参数都需要我们自己去调节的,我们需要关注的是一些最常用的,对性能影响比较大的GC参数即可。 为了更好的让大家理解JDK8中 GC的调优的秘籍,这里特意准备了八张图。在本文的最后,还附带了一个总结的PDF all in one文档,大家把PDF下载回去,遇到问题就看两眼,不美吗? 分代垃圾回收器的内存结构 为了更好的提升GC的效率,现代的JVM都是采用的分代垃圾回收的策略(ZGC不是)。 java运行时内存可以分为JVM内存和非JVM内存。 JVM内存又可以分为堆内存和非堆内存。 堆内存大家都很熟悉了,YoungGen中的Eden,Survivor和OldGen。 非堆内存中存储的有thread Stack,Code Cache, NIO Direct Buffers,Metaspace等。 注意这里的Metaspace元空间是方法区在JDK8的实现,它是在本地内存中分配的。 JDK8中可用的GC JDK8中到底有哪些可以使用的GC呢? 这里我们以HotSpot JVM为例,总共可以使用4大GC方式: 其中对于ParallelGC和CMS GC又可以对年轻代和老年代分别设置GC方式。 大家看到上图可能有一个疑问

面试美团,面试官突然问我 Java “锁” ,我哭了

佐手、 提交于 2020-07-28 19:29:55
前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。 Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录: 1. 乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。 先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。 乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。 根据从上面的概念描述我们可以发现:

椭圆曲线密码学简介

喜夏-厌秋 提交于 2020-07-28 19:29:22
椭圆曲线密码学是下一代的公钥密码学,它比之前的公钥密码学系统例如RSA和Diffe-Hellman在安全性方面有显著提高。椭圆曲线密码学是目前被广泛使用的最强大的密码学算法之一,但是真正理解其工作原理的开发者并不多。 区块链开发教程链接: 以太坊 | 比特币 | EOS | Tendermint | Hyperledger Fabric | Omni/USDT | Ripple 1、椭圆曲线方程 椭圆曲线有一系列满足特定数学方程的点组成。一个椭圆曲线的方程看起来像这样: Y² = X³ + ax + b 也有其他的椭圆曲线表达式,从技术上来将,一个椭圆曲线就是由满足上述方程的点组成,它的一些固有的特征使其非常适合用于密码学。 上面的曲线有很多有趣的特性,其中之一就是水平对称性。椭圆曲线上的任何一个点关于X轴的对称点依然还在曲线上。另一个更有意思的特性是,任何一条不垂直于X轴的直线与椭圆曲线的交点不会超过3个。假设我们从椭圆曲线上任选两个点画一条直线,那么这条直线将在第三个点与椭圆曲线相交。 可以把这个过程想象成一个台球游戏,如果你在A点拿一个球向B点射击,当这个球碰到曲线后,就会弹向下方(如果球在X轴上方)或上方(如果球在X轴下方),就像下面这张动图: 如果将台球在这两点上的运动称为dot运算,那么椭圆曲线上任何两点都可以进行dot运算: A dot B = C A dot A =