
java&JVM
文章平均质量分 71
qililong88
这个作者很懒,什么都没留下…
展开
-
代码技巧: 线程池多线程快速处理List集合
有一个大List集合,遍历进行一些耗时操作,不能达到性能要求,查询日志,单个任务虽然有不少数据库和第三方API请求,比较耗时,但返回效率尚可,所以优先采用多线程方式进行处理并行请求数据库和第三方API,因为处理完还要对list所属的数据进行操作,所以,线程池多线程处理要等待全部处理完:相关的代码如下:@Test public void testTB() { List<String> list = new ArrayList<>(); fo原创 2021-03-03 16:16:30 · 3908 阅读 · 3 评论 -
Netty学习笔记(十)心跳机制与断线重连
心跳是啥在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.心跳机制的工作原理心跳机制的工作原理是: 在服务器和客户端之间一定时间内没有数据交互时, 即处于 idle 状态时, 客户端或服务器会发送一个特殊的数据包给对方, 当接收方收到这个数据报文后, 也立即发送一个特殊的数据报文, 回应发送方, 此即一个 PING-PONG 交互. 自然地, 当某一端收到心跳消息后, 就知道了对方仍然在线, 这就确保 TCP 连接的有效性转载 2020-09-19 12:14:01 · 887 阅读 · 0 评论 -
Netty学习笔记(九)新连接接入
引子在上一篇分析NioEventLoop那篇文章中分析NioEventLoop.run()时候提到当方法processSelectedKey()处理事件的时候,比如读事件,最终调用了unsafe.read();本文就来分析一下unsafe对象的read方法的具体实现。检测新的连接源码中的Unsafe是一个接口,在调试时可知其实现类为NioMessageUnsafe类,其read方法源码如下: private final List<Object> readBu.转载 2020-09-19 11:31:02 · 346 阅读 · 0 评论 -
netty学习笔记(八)ByteBuf分析2
引子java NIO 使用ByteBuffer作为字节容器,使用上过于复杂,为此netty使用ByteBuf来代替ByteBuffer。ByteBuf的APINetty的数据处理API通过两个组件暴露:ByteBuf和ByteBufHolder。 ByteBuf维护了两个不同的索引:readerIndex和writerIndex,分别用于读写。 我们在ByteBuf的源码的注释中看到: * +-------------------+------------------+-.转载 2020-09-19 11:29:10 · 549 阅读 · 0 评论 -
Netty学习笔记(七)ByteBuf分析
ByteBufjava NIO 使用ByteBuffer作为字节容器,使用上过于复杂,为此netty使用ByteBuf来代替ByteBuffer。ByteBuf是一个抽象类,不能直接使用,它的子类有:ByteBuf子类它有两个重要的指针:readerIndex读指针,writerIndex写指针。在ByteBuf的0到readerIndex区间内不可读,在readerIndex到writerIndex区间内可读,在writerIndex到capacity容量区间内可写入。另外Byte.转载 2020-09-19 11:26:58 · 267 阅读 · 0 评论 -
Netty学习笔记(六)Pipeline
Pipeline初始化Pipeline创建Netty在创建客户端Channel和服务端Channel的时候,都会调用父类的构造函数: protected AbstractChannel(Channel parent) { this.parent = parent; id = newId(); unsafe = newUnsafe(); pipeline = newChannelPipeline(); }构造函数转载 2020-09-19 11:25:21 · 3344 阅读 · 1 评论 -
Netty学习笔记(五)NioEventLoop启动
引子在之前的文章中有提到BootStrap启动类中绑定端口的内部实现如下: private static void doBind0( final ChannelFuture regFuture, final Channel channel, final SocketAddress localAddress, final ChannelPromise promise) { channel.eventLoop().execu.转载 2020-09-19 11:22:41 · 338 阅读 · 0 评论 -
Netty学习笔记(四)NioEventLoopGroup分析
引子在上一篇文章中我们已经分析了Netty注册相关的逻辑,接下来再开看下NioEventLoopGroup这个类内部的相关构造。NioEventLoopGroup在之前的demo中第一行就是:EventLoopGroup bossGroup = new NioEventLoopGroup(1);这个NioEventLoopGroup类的构造函数最终实现如下:protected MultithreadEventExecutorGroup(int nThreads, E..转载 2020-09-19 11:21:27 · 494 阅读 · 0 评论 -
Netty学习笔记(三)Reactor线程模型
单线程模型所有操作都在同一个NIO线程处理,在这个单线程中要负责接收请求,处理IO,编解码所有操作,相当于一个饭馆只有一个人,同时负责前台和后台服务,效率低。单线程模型多线程模型多线程的优点在于有单独的一个线程去处理请求,另外有一个线程池创建多个NIO线程去处理IO。相当于一个饭馆有一个前台负责接待,有很多服务员去做后面的工作,这样效率就比单线程模型提高很多。多线程模型主从线程模型多线程模型的缺点在于并发量很高的情况下,只有一个Reactor单线程去处理是来不..转载 2020-09-19 11:19:56 · 208 阅读 · 0 评论 -
Netty学习笔记(二)Channel的分类
Channel分类在Netty中存在众多Channel类和接口,大致关系如下:Netty中Channel类图Channel:和Java Nio中的Channel同名,是Netty对网络底层读写和连接的抽象。 AbstractChannel: 是Channel的抽象实现类,抽象出了parent,id,unsafe,pipeline等概念。 AbstractNioChannel:封装Java NIO,通过Selector选择器进行IO事件的监听,拥有SelectionKey,readI.转载 2020-09-19 10:46:12 · 488 阅读 · 0 评论 -
Netty学习笔记(一)组件
Channel,EventLoop和ChannelFuture类构成了Netty网络抽象的代表:Channel:对应Socket EventLoop:对应控制流,多线程处理,并发 ChannelFuture:对应异步通知Channel接口Channel是对Socket的封装,大大降低了直接使用Socket的复杂性。EventLoop接口EventLoop用于处理连接的生命周期中所发生的事件。在服务端编程中,EventLoop起到了监听端口连接和数据读取的工作。ChannelFutu转载 2020-09-19 10:43:45 · 228 阅读 · 0 评论 -
springCloud组件以及相应原理
springcloud是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易。通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。SpringCloud的组件相当繁杂,拥有诸多子项目。重点关注Netflixspringcloud项目是由多个独立项目集合而成的,每个项目都是独立的,各自进行自己的迭代和版本发布。所以springcloud不方便使用版本号来管理,而是使用版本名。以避免和子原创 2020-09-18 10:37:21 · 2192 阅读 · 0 评论 -
Tomcat消息处理流程
图1-1一、前言 平时我们都将项目扔给Tomcat就行了,做了撒手掌柜,没接触过JavaEE项目,对于请求从服务器接收后的处理流程模棱两可,不利于对Web项目的理解,我们现...原创 2020-09-17 17:10:18 · 280 阅读 · 0 评论 -
同事分享_1_java 内存模型
文龙同事分享:导语本文是针对java内存模型JMM的入门级简介,通过学习JMM可以让我们加深对java代码执行的过程,及java并发编程中常见的问题的了解。例如volatile、synchronized等在JMM中的具体体现。概念Java内存模型(JMM)Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存...原创 2020-07-30 17:56:20 · 184 阅读 · 0 评论 -
2、Springboot入门-整合篇
一、Springboot启动配置原理二、自定义starters原创 2020-06-07 17:08:25 · 135 阅读 · 0 评论 -
1、Springboot 入门-配置和原理
**一、**Spring Boot 入门 <!-- 这个插件,可以将应用打包成一个可执行的jar包;--> <artifactId>spring-boot-maven-plugin</artifactId>将这个应用打成jar包,直接使用java -jar的命令进行执行;1、启动器<dependency> <groupId>org.springframework.boot</groupId> <arti原创 2020-06-05 14:57:25 · 160 阅读 · 0 评论 -
NIO效率高的原理之零拷贝与直接内存映射
前言首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并且这两个技术并不是等价的。零拷贝零拷贝是指避免在用户态(User-space) 与内核态(Kernel-space) 之间来回拷贝数据的技术。传统IO传统IO读取数据并通过网络发送的流程,如下图 read()调用导致上下文从...原创 2020-05-29 17:07:12 · 533 阅读 · 1 评论 -
kafka与Rocketmq的区别
淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kafka这个优秀的消息中间件,淘宝中间件团队在对Kafka做过充分Review之后,Kafka无限消息堆积,高效的持久化速度吸引了我们,但是同时发现这个消息系统主要定位于日志传输,对于使用在淘宝交易、订单、充值等场景下还有诸多特性不满足,为此我们重新用Java语言编写了RocketMQ,定位于非日志的可靠消息传输(转载 2020-05-15 16:42:01 · 281 阅读 · 0 评论 -
RocketMQ学习3-原理
消息存储,高可用机制,负载均衡,消息重试,死信队列,消息幂等消息存储:为了保障高可用需要持久化:存储介质:1)关系型数据库DB:Apache下开源的另外一款MQ—ActiveMQ(默认采用的KahaDB做消息存储)可选用JDBC的方式来做消息持久化,通过简单的xml配置信息即可实现JDBC消息存储。2)文件系统:(RocketMQ/Kafka/RabbitMQ)均采用的是消息刷盘至所部署虚拟机/物理机的文件系统来做持久化存储过程读和写是如何保持高速的:写:RocketMQ的消息用原创 2020-05-15 16:39:06 · 623 阅读 · 0 评论 -
RocketMQ学习总结2- SpringBoot整合RocketMQ开发
1、普通方式生产消费生产者:1)依赖:<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq-spring-boot-starter-version}</version>...原创 2020-05-15 01:12:42 · 457 阅读 · 0 评论 -
ROCKETMQ学习总结1入门
MQ 作用:应用解耦 、流量削峰 、数据分发常见的MQ产品包括Kafka、ActiveMQ、RabbitMQ、RocketMQ。RocketMQ组成角色:Producer:消息的发送者; Consumer:消息接收者; Broker:暂存和传输消息; NameServer:管理Broker; Topic:区分消息的种类; Message Queue:相当于是Topic的分区;用于并行发送和接收消息 。高可用的保障:集群搭建:单Master模式、多Master模式、多Master多Slav原创 2020-05-14 15:28:44 · 283 阅读 · 0 评论 -
Java面试2谈谈final、finally、 finalize有什么不同?
final 可以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展,final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。finally 则是 Java 保证重点代码一定要被执行的一种机制。我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证 unl...原创 2020-04-13 00:40:57 · 191 阅读 · 0 评论 -
Java面试1:Exception和Error有什么区别?
Error 是指在正常情况下,不大可能出现的情况Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类...原创 2020-04-13 00:37:58 · 1005 阅读 · 0 评论 -
Java面试进阶33: 后台服务出现明显“变慢”,谈谈你的诊断思路?
分析方法:自上而下。从应用的顶层,逐步深入到具体的不同模块,或者更近一步的技术细节单元,找到可能的问题和解决办法。这是最常见的性能分析思路,也是大多数工程师的选择。自下而上。从类似 CPU 这种硬件底层,判断类似Cache-Miss之类的问题和调优机会,出发点是指令级别优化。这往往是专业的性能工程师才能掌握的技能,并且需要专业工具配合,大多数是移植到新的平台上,或需要提供极致性能时才会进行...原创 2020-04-13 00:31:25 · 570 阅读 · 2 评论 -
Java面试扩展:对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗
答:Netty 在基础的 NIO 等类库之上进行了很多改进,例如:1)更加优雅的 Reactor 模式实现、灵活的线程模型、利用 EventLoop 等创新性的机制,可以非常高效地管理成百上千的 Channel。2)充分利用了 Java 的 Zero-Copy 机制,降低内存分配和回收的开销。例如,使用池化的 Direct Buffer 等技术,在提高 IO 性能的同时,减少了对象的创...原创 2020-04-13 00:32:32 · 254 阅读 · 1 评论 -
Java 面试扩展:spring bean生命周期、三级缓存
实例化 Bean 对象。设置 Bean 属性。如果我们通过各种 Aware 接口声明了依赖关系,则会注入 Bean 对容器基础设施层面的依赖。具体包括 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,分别会注入 Bean ID、Bean Factory 或者 ApplicationContext。调用 BeanPostProcess...原创 2020-04-13 00:32:21 · 1221 阅读 · 0 评论 -
Java面试扩展:MySQL支持的事务隔离级别
读未提交(Read uncommitted),就是一个事务能够看到其他事务尚未提交的修改,这是最低的隔离水平,允许脏读出现。读已提交(Read committed),事务能够看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,当然脏读也不会出现。读已提交仍然是比较低级别的隔离,并不保证再次读取时能够获取同样的数据,也就是允许其他事务并发修改数据,允许不可重复读和幻象读(Ph...原创 2020-04-13 00:32:10 · 140 阅读 · 0 评论 -
java面试进阶:JVM优化Java代码时都做了什么?
JVM 在对代码执行的优化可分为运行时(runtime)优化和即时编译器(JIT)优化。运行时优化主要是解释执行和动态编译通用的一些机制,比如说锁机制(如偏斜锁)、内存分配机制(如 TLAB)等。除此之外,还有一些专门用于优化解释执行效率的,比如说模版解释器、内联缓存(inline cache,用于优化虚方法调用的动态绑定)。JVM 的即时编译器优化是指将热点代码以方法为单位转换成机器码,直接...原创 2020-04-13 00:31:52 · 194 阅读 · 0 评论 -
Java面试进阶:如何构建自己的微基准测试,选择什么样的框架比较好?
目前应用最为广泛的框架之一就是JMH,OpenJDK 自身也大量地使用 JMH 进行性能对比,如果你是做 Java API 级别的性能对比,JMH 往往是你的首选。除了支持完整的基准测试过程,包括预热、运行、统计和报告等,还支持 Java 和其他 JVM 语言。更重要的是,它针对 Hotspot JVM 提供了各种特性,以保证基准测试的正确性,整体准确性大大优于其他框架,并且,JMH 还提供了...原创 2020-04-13 00:31:35 · 144 阅读 · 0 评论 -
Java面试进阶30:Java 程序运行在 Docker 等容器环境有哪些新问题?
对于 Java 来说,Docker 毕竟是一个较新的环境,例如,其内存、CPU 等资源限制是通过 CGroup(Control Group)实现的,早期的 JDK 版本(8u131 之前)并不能识别这些限制,进而会导致一些基础问题:如果未配置合适的 JVM 堆和元数据区、直接内存等参数,Java 就有可能试图使用超过容器限制的内存,最终被容器 OOM kill,或者自身发生 OOM。错误判...原创 2020-04-12 19:35:02 · 171 阅读 · 0 评论 -
Java面试进阶29,JMM中的happen-before是什么
答:Happen-before 关系,是 Java 内存模型中保证多线程操作可见性的机制可从四个维度去理解JMM1 从JVM运行时视角来看,JVM内存可分为JVM栈、本地方法栈、PC计数器、方法区、堆;其中前三区是线程所私有的,后两者则是所有线程共有的2 从JVM内存功能视角来看,JVM可分为堆内存、非堆内存与其他。其中堆内存对应于上述的堆区;非堆内存对应于上述的JVM栈、本地方法栈、PC...原创 2020-04-12 19:09:15 · 582 阅读 · 0 评论 -
Java面试进阶27:垃圾收集器有哪些
Serial GC,它是最古老的垃圾收集器,“Serial”体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-World”状态。也意味简单,所以一直是 Client 模式下 JVM 的默认选项。从年代的角度,通常将其老年代实现单独称作 Serial Old,它采用了标记 - 整理(Mark-Compact)算法,区别于新生代的复制算法。ParNew GC...原创 2020-04-12 17:19:05 · 218 阅读 · 0 评论 -
java面试进阶26:如何监控和诊断JVM堆内和堆外内存使用?
堆内空间:堆内分析工具:图形化工具,如 JConsole、VisualVM(jmc,jconsole在linux上用不了的问题,其实1可以远程连接,2可以使用xshell);命令行工具进行运行时查询,如 jstat 和 jmap 等工具;Tomcat、Weblogic内置功能;GC 日志1、新生代:内部又分为 Eden 区域,作为对象初始分配的区域;两个 Survivor,有时候也叫 ...原创 2020-04-12 16:40:40 · 1042 阅读 · 0 评论 -
Java面试进阶:jvm内存区域的划分
1)程序计数器(PC,Program Counter Register)。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地方法,则是未指定值(undefined)。2)Java 虚拟机栈(Java Virtual Machine ...原创 2020-04-12 15:24:38 · 353 阅读 · 0 评论 -
Java面试进阶:有哪些方法可以在运行时动态生成一个Java类?
答:1)使用 Java Compiler API,这是 JDK 提供的标准 API,里面提供了与 javac 对等的编译器功能,源码编译过程中实现2)直接动态生成字节码,用ASM、Javassist、cglib等字节码和类加载到底是怎么无缝进行转换的?发生在整个类加载过程的哪一步?JDK 提供的 defineClass 方法,最终都是本地代码实现的。如何利用字节码操纵技术...原创 2020-04-12 14:49:15 · 331 阅读 · 0 评论 -
Java面试进阶:AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
答:AtomicIntger 是对 int 类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于 CAS(compare-and-swap)技术。从 AtomicInteger 的内部属性可以看出,它依赖于 Unsafe 提供的一些底层能力,进行底层操作;以 volatile 的 value 字段,Unsafe 会利用 value 字段的内存地址偏移,直接完成操作。CAS 是 ...原创 2020-04-12 13:05:44 · 569 阅读 · 0 评论 -
Java面试进阶:Java并发类库提供的线程池有哪几种? 分别有什么特点?
Executors 目前提供了 5 种不同的线程池创建配置:newCachedThreadPool(),它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过 60 秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用 SynchronousQueue 作为工作队列。n...原创 2020-04-12 12:33:36 · 676 阅读 · 0 评论 -
Java面试进阶:并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
答:Concurrent 类型基于 lock-free,基于CAS的无锁技术,在常见的多线程访问场景,一般可以提供较高吞吐量。而 LinkedBlockingQueue 内部则是基于锁,并提供了 BlockingQueue 的等待性方法。,java.util.concurrent 包提供的容器大概区分为 Concurrent*、CopyOnWrite和 Blocking等三类...原创 2020-04-11 23:58:22 · 649 阅读 · 0 评论 -
Java面试进阶:Java并发包提供了哪些并发工具类?
java.util.concurrent 及其子包,集中了 Java 并发的各种基础工具类,具体主要包括几个方面:1)提供了比 synchronized 更加高级的各种同步结构,包括 CountDownLatch、CyclicBarrier、Semaphore 等,可以实现更加丰富的多线程操作,比如利用 Semaphore 作为资源控制器,限制同时进行工作的线程数量。2)各种线程安全的容器...原创 2020-04-11 01:17:43 · 576 阅读 · 0 评论 -
Java面试进阶:什么情况下Java程序会产生死锁?如何定位、修复?
两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。定位死锁:最常见的方式就是利用 jstack 等工具获取线程栈,然后定位互相之间的依赖关系,进而找到死锁。如果是比较明显的死锁,往往 jstack 等就能直接定位:首先,可以使用 jps 或者系统的 ps 命令、任务管理器等工具,确定进程 ID。其次,调用 jstack 获取线程栈,找到处于 BLOCKED 状态的线程...原创 2020-04-11 00:06:37 · 239 阅读 · 0 评论