![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
喝不醉的solace
这个作者很懒,什么都没留下…
展开
-
JAVA类加载器学习
1.类加载过程首先加载过程大体分为3步,即装载,链接,初始化。装载:加载类的二进制数据 链接:分为三部分。 (1)验证:确保加载类正确,防止恶意class文件 (2)准备:为静态变量分配内存,初始化默认值 (3)解析:为类中的符号引用转化为直接引用 初始化:为静态变量赋值。2.类的初始化初始化时间点有: (1)创建实例 (2)访问静态变量,或对该静态变量赋值 (3)访问静态方法 (原创 2017-08-11 23:47:03 · 190 阅读 · 0 评论 -
Kafka线程模型
reactor模式可能这个模式很多人听起来会比较陌生,其实也很容易理解,类似观察者模式的,java NIO中提供了实现reactor模式的API,javaNIO工作流程如图 首先,selector创建serversocketChannel对象,并注册op_accept事件,serversocketChannel负责监听收到客户端连接请求,请求来了后,selector监听到op_acce...原创 2018-04-13 00:42:43 · 1818 阅读 · 0 评论 -
浅谈高可用架构中NIO的重要性
一个功能引发的思考今天同事开发了一个文件读写的模块,发现读写性能异常的低,他的做法是单线程纯IO操作,频繁的打开关闭IO流,读写。 于是乎他问我这个应该怎么做,我给他讲解到这种做法的低效,建议他批量的一次性写入,频繁直接操作IO性能当然是无法接受的。再谈IO操作的演变BIO:传统的cs端架构,都是一个请求提交,后台一个专门的线程负责接受这个请求,分配给新的线程去处理。这种做法的缺...原创 2018-04-11 00:36:00 · 603 阅读 · 0 评论 -
基于zookeeper分布式锁的实现
架构图如图所示 1. 首先创建持久化节点loker,每次获取锁,就去loker下创建临时顺序节点,锁用完后删除节点。 2. 每次创建节点后需要判断节点的是不是最小的,所以需要先排序所以节点,拿到比自己大的那个节点 3. 使用锁过程中,释放出现问题,则通过session_time_out来控制锁自动释放 4. 拿到比自己大的节点后监听exsit的watch被触发,注:一个节点只会监听比他...原创 2018-03-22 11:34:07 · 262 阅读 · 0 评论 -
kafka重复消费解决方案
重复消费场景:1.消费端消费能力比较低,处理消息速度慢2.根据kafka消费特性,消费者在每个partion上的位置都是一个整数,即消费下一条消息的偏移量。这个状态可以定期检查点,使得消息的确认变得非常的方便,消费者可以倒退回旧的偏移量,重新消费。3.消息处理完之后提交下一个消费的offset,而在session-time-out前,消息还没有处理完,但是已经超时被kafka视为消费失败...原创 2018-03-22 00:30:49 · 12627 阅读 · 0 评论 -
Note Of Deep JVM(3)_垃圾收集算法
标记清除算法分标记-清除两个阶段,首先标记出所有需要回收的对象,然后批量回收对象。 这种算法有两个不足点: 1>效率 标记和清除的过程效率不高 2>空间 回收后产生大量不连续的内存碎片,在分配比较大的对象时,可能会导致内存不足,而不得不提前执行一次GC操作复制算法将内存按照容量划分成两个大小相同的块,每次只使用其中一块,当其中一块用完了,就将还存活着的对象赋值到另外一块上,原创 2017-11-25 00:08:15 · 152 阅读 · 0 评论 -
Note of deep JVM(2)_hotspot JVM
对象创建当JVM遇到一条new指令,首先会检查这个指令参数能否在常量池中定位到一个类的符号引用,并检查这个引用代表的类是否已被加载,解析,初始化过。如果没有,则先执行上述过程。然后虚拟机将为新生对象分配内存,对象所需的内存空间在加载完成后即可完全确定。一般来说,分配的方式有两种1.指针碰撞 java堆中内存绝对规整,从指针向空闲内存移动与对象大小相等的距离2.空闲列表 虚拟机维护原创 2017-11-12 21:08:55 · 139 阅读 · 0 评论 -
Note of deep JVM(1)
JVM运行时数据区JVM的多线程就是通过线程轮流切换分配处理器执行时间的方式来实现的。1.程序计数器可以看做是当前线程所执行的字节码的行号指示器,在概念模型中,字节码解释器工作时就是通过这个值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能。如果执行的是JAVA方法,计数器记录的是正在执行的虚拟机字节码指令地址,如果是Native方法,则计数器值为空。无OutOfM原创 2017-11-10 15:06:00 · 187 阅读 · 0 评论 -
DUBBO SPI部分源码浅析
private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();这里先上核心代码。 在分析dubbo源码时,我们发现每个config类里面都有这段代码。 首先,protocal类带有spi注解,我们可以确认,默认使用的DUBBO-P原创 2017-09-12 23:33:04 · 451 阅读 · 0 评论 -
java对象序列化,RMI
java对象序列化反序列化,rmi远程调用原创 2017-09-10 00:33:29 · 331 阅读 · 0 评论 -
JAVA虚拟机读写其他进程数据
简要代码package com.solace.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * Created by solace on 2017/9/9. */public class ReadOtherProcessData {原创 2017-09-09 23:58:59 · 330 阅读 · 0 评论 -
MYSQL免安装版无法启动终极解决方法
1注册服务是否指定my.ini2my.ini中basedata路径是否正确,版本是否支持innodb3.之前安装过mysql安装版,导致注册表混乱,检查注册表中的service MYSQL服务中的imagexxx属性,看是否是对的检查完这些,绝对是没问题的原创 2017-09-06 11:59:49 · 423 阅读 · 0 评论 -
AtomicInteger研究
概念AtomicInteger:java中无锁的线程安全整数,提供原子操作。由于++i和i++操作线程不安全,在使用的时候,难免会使用synchronized来保证线程安全。使用AtomicInteger可以通过一种线程安全的加减操作接口。底层实现通过硬件提供的原子操作指令实现。 关于处理器的原子操作,有如下三种加锁方式。 1:处理器自动保证基本内存操作的原子性 处理器保证从系统内存中读取或者原创 2017-08-25 00:15:58 · 434 阅读 · 0 评论 -
学习ThreadLocal
1.Whats this? ThreadLocal是在jdk1.2发行的一个用于维护变量的工具类,详情:JAVA.LANG.THREADLOCAL.使用这个工具类可以简洁编写多线程程序。2.总体介绍使用ThreadLocal维护变量时,每个使用变量的线程将会提供独立的副本。从线程的角度来看,目标变量就像是本地变量。ThreadLocal提供了以下接口:1.void set(Object转载 2017-08-14 00:28:37 · 154 阅读 · 0 评论 -
领域驱动模型之ERP单品模块架构设计
模块划分领域对象 用户根据持有的单据类型ID,去可用的单据流程池中查找单据流程池,拿到流程池之后,需要确定最终单据管理的操作是什么,相比原始业务对象,领域对象具有了行为资源库 一些基础的数据库交互操作,数据库与Elasticsearch缓存同步等操作,相比传统的VO,由资源库屏蔽了敏感的直接对底层访问,相比以前vo,具有更高的内聚,低耦合防腐层 在一个上下文中,有时需要对...原创 2018-07-10 23:44:40 · 637 阅读 · 0 评论