
Java
文章平均质量分 94
啊浪的博客
细节决定一切。
最近会将很久之前总结的相关笔记整理成文章,以作总结。侵即删。
展开
-
Reactor手册
reactor详细手册原创 2022-12-12 22:23:24 · 2112 阅读 · 2 评论 -
ThreadPoolExecutor源码分析
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ...原创 2018-06-13 23:10:43 · 218 阅读 · 0 评论 -
轻量级任务调度中间件
一、遇到的问题近段时间这边遇到了一些类似的需求,而且未来可能还会有……源源不断的需求-_-案例1: 当一个内容产生时,需要在1小时后开始,每隔1小时去检测该内容的质量评分(根据阅读量、点赞率等指标算出),最多检测两天或者1000次,如果满足阈值则进行大规模推广,从而提高优质内容的曝光率。案例2: 当一个内容开始大规模推广时,可能因算法出错(阅读量高的内容不一定是好内容,如涉黄内容就是阅...原创 2018-06-13 23:09:50 · 4624 阅读 · 0 评论 -
ConcurrentHashMap简介
简介HashMap、Hashtable、ConcurrentHashMap都是一个数组链表结构。但是HashMap是线程不安全的。Hashtable和Collections.synchronizedMap(hashMap)是线程安全,但是是锁整个结构的,性能很差。ConcurrentHashMap是线程安全,锁的力度小,性能更好。ConcurrentHashMap如何保证线程安全和高性能...原创 2018-03-17 21:35:51 · 327 阅读 · 0 评论 -
synchronized原理
各种使用姿势对于同步方法,锁是当前实例对象。对于静态同步方法,锁是当前对象的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。简单原理Object内部维护一个监视器Monitor,synchronized正是通过监视器锁实现同步的,在代码的前后加上monitorente...原创 2018-06-13 23:12:57 · 320 阅读 · 0 评论 -
Kafka简介
架构Producer发送消息到某个指定的Topic,Broker负责存储消息,Consumer通过订阅的方式消费指定Topic的消息。 实现细节Partition 物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。在发送一条消息时,可以指定这条消息的key,Prod...原创 2018-06-14 22:53:13 · 495 阅读 · 1 评论 -
volatile原理
简介volatile在多处理器开发中保证了“共享变量”的“可见性”。可见性指当一个线程修改一个共享变量时,另外一个线程能马上读到这个修改的值。共享变量:共享变量都被存放在堆内存中,volatile只作用于共享变量。实现原理对volatile变量修饰的共享变量进行写操作的时候会多一行汇编代码 - 将当前处理器缓存行的数据会写回到系统内存 - 写回内存的操作会引起在其他CPU里...原创 2018-06-13 23:22:29 · 354 阅读 · 0 评论 -
MyBatis原理浅析
简介MyBatis是一个轻量级的ORM框架,它简化了对关系数据库的使用,开发人员可以在XML或注解中编写SQL来完成对数据库的操作。 如果完全使用XML方式,SQL语句可以集中维护,做到与Java代码完全隔离,便于对SQL调优。原理及流程加载配置:配置来源于两个地方,一是配置文件,一是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了...原创 2018-06-13 23:13:23 · 8384 阅读 · 0 评论 -
Spring详解
Bean的生命周期 0,调用BeanFactoryPostProcessor的postProcessBeanFactory方法1,调用Bean的构造函数(或者工厂方法)实例化Bean.2,对Bean的成员变量赋值.3,如果Bean实现了BeanNameAware,调用Bean的setBeanName方法.4,如果Bean实现了BeanFactoryAware,调用Bean的s...原创 2018-06-13 23:18:37 · 785 阅读 · 0 评论 -
JVM参数调优
基本常识堆内存 = Eden + old + Metaspace(perm)总内存 = 堆 + 栈 + 堆外内存 + jvm等内部使用的内存system.gc最常见的场景是RMI/NIO下的堆外内存分配等java -verbose:class -version:查看jvm启动时被加载的类OutOfMemoryError分配内存当Eden内存不够用的时候,某些情况下会尝试到Old里进行...原创 2018-06-13 23:19:29 · 1007 阅读 · 0 评论 -
maven简介
maven是一个项目管理和构建自动化工具,基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。安装http://jingyan.baidu.com/article/3d69c55157068af0ce02d76f.htmlintellij 自带集成了maven工具,可配置IDE使用自己下载的maven版本(注意,maven2和3的区别还是很大的,某些...原创 2018-06-13 23:19:56 · 926 阅读 · 0 评论 -
类加载的过程
class A { public void m() { A.class.getClassLoader().loadClass(“B”); } public void doSomething() { B b = new B(); b.doSomethingElse(); }}B b = new B();//等...原创 2018-06-13 23:14:10 · 631 阅读 · 0 评论 -
wait/notify浅析
wait/notify原创 2018-03-24 17:23:18 · 316 阅读 · 0 评论 -
ReentrantLock、CountDownLatch、CyclicBarrier简介
ReentrantLock、CountDownLatch、CyclicBarrier1、ReentrantLock可重入互斥锁公平锁与非公平锁的释放锁步骤是一致的。获取锁的过程不一致,非公平锁是让当前线程优先独占,而公平锁则是让等待时间最长的线程优先,非公平的可能让其他线程没机会执行,而公平的则可以让等待时间最长的先执行,但是性能上会差点。2、CountDownLatch是一个线程(或...原创 2018-06-14 22:54:44 · 682 阅读 · 0 评论 -
BlockingQueue简介
BlockingQueueArrayBlockingQueue 是一个有界的阻塞队列,其内部实现是将对象放到一个数组里。因为它是基于数组实现的,所以一旦初始化,大小就无法修改。DelayQueue 对元素进行持有直到一个特定的延迟到期。注入其中的元素必须实现 java.util.concurrent.Delayed 接口。LinkedBlockingQueue 内部以一个链式结构(链接节...原创 2018-06-13 23:23:07 · 303 阅读 · 0 评论 -
arthas使用简介
https://alibaba.github.io/arthas/install-detail.htmlcurl -L https://alibaba.github.io/arthas/install.sh | sh添加source /etc/profilesudo -u push ./as.sh 22617trace com.oppo.push.inbox.service.InboxSe...原创 2019-01-17 11:09:39 · 1242 阅读 · 0 评论 -
kafka集群安装
0、运维添加机器到堡垒机、push用户、挂盘(/data*)、创建目录(push用户权限 /web/push/)1、上传kafka安装包kafka_2.11-0.11.0.0.tgzcd /web/push/ && sudo -u push rz -bey2、解压(/web/push/kafka并且cd进入目录)sudo -u push tar -zxvf kafka...原创 2019-02-13 11:43:15 · 258 阅读 · 0 评论 -
常用ES命令 Demo
push-trace-20190108/_search{ "query": { "bool": { "must": [ { "term": { "event": &a原创 2019-02-13 11:45:18 · 1518 阅读 · 0 评论 -
日志配置文件 Demo
<?xml version="1.0" encoding="UTF-8"?><configuration scan="true&q原创 2019-02-13 12:02:00 · 289 阅读 · 0 评论 -
浅谈GC日志
GC日志young gcyoung gc是需要stop the world的 例子:当eden满时,young gc使用的是ParNew收集器ParNew: 2230361K->129028K(2403008K), 0.2363650 secs2230361K->129028K,指回收前后eden+s1(或s2)大小2403008K,指可用的young...原创 2018-06-14 22:52:59 · 1478 阅读 · 0 评论 -
揭秘java日志系统
概念 日志框架:是一种日志接口,不负责具体的日志输出形式(有点类似于JDBC),可以灵活的切换日志输出形式。常见的日志框架有slf4j、jcl,只提供Logger、LoggerFactory等接口 日志系统:是应用实际使用的日志工具,主要有log4j,jul,logback等。一般在程序中应该避免直接使用,可以保证程序具有一定的灵活性。 Logger:日志输出实例,包...原创 2018-06-13 23:18:18 · 2084 阅读 · 0 评论 -
Java泛型简介
问题public class ArrayList { public Object get(int i) { ... } public void add(Object o) { ... } ... private Object[] elementData;}当没有泛型时,我们会使用obejct替代。但这样会存在以下问题第一有关get方法:每次调用get方法都会返回...原创 2018-06-13 23:20:07 · 2127 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java内存同步模型
java内存同步模型Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 此处的变量(Variables)与Java编程中所说的变量有所区别,它包括了实例字段、 静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题。 为了获得较好的执行效能,Java内存模型并没有限制执...原创 2017-06-01 19:48:03 · 502 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java字节码执行
编译过程指令简介Java虚拟机的指令由一个字节长度的、 代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。Java虚拟机采用面向操作数栈而不是寄存器架构。加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。运算或算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶类型转换指...原创 2017-05-30 15:33:17 · 594 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java类加载
概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、 转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。在Java语言里面,类型的加载、 连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点...原创 2017-05-30 21:08:48 · 620 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java编译期和运行期优化
编译期优化解析和填充符号表1.词法、 语法分析词法分析是将源代码的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,关键字、 变量名、 字面量、 运算符都可以成为标记。Token不可再拆分。语法分析是根据Token序列构造抽象语法树的过程,抽象语法树(Abstract SyntaxTree,AST)是一种用来描述程序代码语法结构的树形表示方式,语法...原创 2017-06-01 11:48:33 · 2545 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java Class类文件结构
Class文件简介任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符。class文件含两种数据类型:无符号数和表无符号数属于基本的数据类型,以u1、 u2、 u4、 u8来分...原创 2017-05-28 14:43:18 · 618 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java垃圾回收机制原理
对象是否已经可以回收?引用计数法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。实现简单,但它很难解决对象之间相互循环引用的问题。可达性分析通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roo...原创 2017-05-26 23:28:21 · 2045 阅读 · 2 评论 -
深入理解Java虚拟机读书笔记-java对象模型和内存参数
对象访问reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改。 直接指针访问方式的最大好处就是速度更快,它节省了一次指针定位的时间开销。 堆的最小值-Xms参数和最大值-Xmx参数 -XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当...原创 2017-05-24 21:13:37 · 814 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java运行时内存简介
程序计数器虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Nativ...原创 2017-05-23 22:03:33 · 1683 阅读 · 0 评论 -
注解原理
作用注解很多时候的确能帮助我们减少、美化代码,或为现有代码增加额外功能等1、为编译器提供信息:注解可以被编译器(如Eclipse、IntelliJ)用来检测错误和已知警告,如Java内置的@Deprecated、@Override和@SuppressWarnnings就被经常用到。2、编译时和部署时附加操作:软件工具可以在编译时或部署时根据注解信息生成可执行代码,XML文件等等。如生成说明文档,J...原创 2018-06-13 23:17:55 · 364 阅读 · 0 评论 -
Java问题排查利器
jps输出JVM中运行的进程状态信息 -q 不输出类名、Jar名和传入main方法的参数 -m 输出传入main方法的参数 -l 输出main类或Jar的全限名 -v 输出传入JVM的参数jps -m -l1217 com.xxxx.sunfire.agent.Main3093 org.apache.catalina.startup.Bootstrap start8415...原创 2018-06-13 23:12:23 · 975 阅读 · 0 评论 -
谈谈反射
简介JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;简单说就是,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。原理Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象(Class反射对象),通过该元信息对象可以获知Class的结构信息。Class反射对象:描述类语义结构,可以...原创 2018-06-13 23:18:33 · 647 阅读 · 0 评论 -
浅析Spring Boot
纯spring的问题需要做大量的配置:声明大量的bean,并把他们组装到一起需要解决很多依赖和冲突的问题。特别是当应用依赖到很多组件的时候(Spring MVC, Mysql, Redis等),要解决这些依赖,需要花很多的功夫手工去配置,解决jar包版本冲突。如果是web应用,则额外需要一个servlet容器将程序跑起来。Spring Boot简介Spring Boot在S...原创 2018-06-13 23:16:12 · 1045 阅读 · 0 评论 -
Netty浅析
简介Netty是一个异步网络IO框架,简单说就是帮我们专注于收发包的细节且提供高性能IO复用,在恰当的时候(如Tcp收满一个逻辑包后),回调我们的业务逻辑代码。Netty基于NIO,整个Netty API体系都是异步的(可通过callback被动通知模式、Future主动通知模式进行后续的业务逻辑操作)。组件介绍Channels代表一次具体的管道连接(文件设备或Socket),连接着两端的的读写。...原创 2018-06-13 23:18:22 · 404 阅读 · 0 评论 -
深入理解Java虚拟机读书笔记-java锁机制
线程安全的实现方法1.互斥同步最基本的互斥同步手段就是synchronized关键字,synchronized关键字经过编译之后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令,这两个字节码都需要一个reference类型的参数来指明要锁定和解锁的对象。 如果Java程序中的synchronized明确指定了对象参数,那就是这个对象的reference;如...原创 2017-06-01 19:57:50 · 687 阅读 · 2 评论 -
RocketMQ简介
简介rocketMQ是一款分布式、消息队列中间件。基于发布订阅模式,有Push和Pull两种消费方式,支持严格的消息顺序,亿级别的堆积能力,支持消息回溯和多个维度的消息查询。核心作用:解耦、异步化、消息堆积缓冲高性能离不开异步,异步离不开队列!基本概念Producer: 消息生产者,负责产生消息并发送消息到meta服务器Consumer: 消...原创 2018-06-13 23:19:07 · 560 阅读 · 0 评论 -
ElasticSearch简介
ElasticSearch是一个开源的、可扩展、分布式的搜索和分析系统。适用场景不需要事务支持。可以适应准实时的查询特点,注意ES 不是实时查询的数据库。需要支持多维度查询的场景,即需要在很多字段进行过滤,比如数十、数百甚至更大的字段中选择过滤。需要支持庞大数据量的聚合、排序、统计的要求,但对并发请求要求不高。需要支撑千万、甚至数百亿以上的数据查询。原创 2017-10-09 10:51:41 · 785 阅读 · 0 评论 -
Think In Java第四版读书笔记
02-一切都是对象将一切都“看作”对象,操纵的标识符实际是指向一个对象的“句柄”。可将这一情形想象成用遥控板(句柄)操纵电视机(对象)。String s;//这里创建的只是句柄,并不是对象。若此时向s 发送一条消息,就会获得一个错误.这是由于s 实际并未与任何东西连接(即“没有电视机”)。一种更安全的做法是:创建一个句柄时,记住无论如何都进行初始化(创建句柄时,我原创 2017-04-16 21:05:54 · 5737 阅读 · 1 评论