- 博客(80)
- 资源 (6)
- 收藏
- 关注
原创 jvm sandbox实现字节码增强
1.安装jvm-sandbox2.引入依赖<parent> <groupId>com.alibaba.jvm.sandbox</groupId> <artifactId>sandbox-module-starter</artifactId> <version>1.2.0</version></parent>3.编写脚本@MetaInfServices( Module.class
2020-06-27 09:36:34
988
原创 BTrace实现字节码增强
下载BTrace,配置BTrace环境编写BTrace脚本@BTracepublic class BTraceTest { @OnMethod( clazz = "com.bj58.btrace.Base", method = "run", location = @Location( Kind.ENTRY) ) public static void start() { println(.
2020-06-27 09:36:19
293
原创 自己实现字节码增强
使用技术:Javassist , Instrument,JVMTI , javaagent,Attach APIJVMTI:JVM TI(JVM TOOL INTERFACE,JVM 工具接口)是 JVM 提供的一套对 JVM 进行操作的工具接口。通过 JVMTI,可以实现对 JVM 的多种操作,它通过接口注册 各种事件勾子,在 JVM 事件触发时,同时触发预定义的勾子,以实现对各个 JVM 事件的响应,事件包括类文件加载、异常产生与捕获、线程启动和结束、进入和退 出临界区、成员变量修改、GC 开始和结束
2020-06-27 09:36:01
545
原创 jvm-sandbox分享
引子相信大家都遇到过这种场景,线上出故障了,但是关键代码里面忘记打日志了,导致无法复现和准确定位问题。这时候可能需要重写加上日志,部署到服务器,但这第一耗时间,第二可能破坏现场,比如可能是线程池的问题呢?所以如果可以不重启服务器,就可以给代码加上日志,是多么棒的一件事呀。那能不能实现,of course。简述实现当然市面上有很多工具可以实现热部署,我们先来看一下,如果我们自己实现,思路是什么。我们知道Java对象的行为(函数,方法)是存储在方法区的,从下图可以看到,方法区的数据是由类加载器把编译好的.
2020-06-26 20:40:49
1691
原创 valatile原理
volatile定义官方定义:java语言规范第三版中对volatile的定义如下:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获得这个变量。java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明或volatile,java线程内存模型确保所有线程看到这个变量值是一致的。个人定义:volatile的解释通常...
2020-04-25 16:28:54
349
原创 海量数据处理
1、A,B两个文件各存放50亿条URL,每条URL占用64字节,内存限制4G,找出A,B文件共同的URL答:1G文件的大致字节数:2^30 约等于 1的9次方(2的10次方约等于100)所以50亿条URL大概为5*64=320G 所以将大文件分为1000个小文件,怎么分,每个URL进行hashcode再对1000取余。这个A文件就被分为(a0,…a999)了,同样的对B进行这样操作,B文件就...
2020-04-18 14:43:17
266
原创 MySQL事务和锁
1.MySQL事务四大特性原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性(Durability...
2020-04-15 14:25:28
118
原创 发布订阅模式和观察者模式区别
一 观察者模式观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。二 发布订阅模式三 观察者模式与发布订阅模式区别四 观察者模式与发布订阅模式优缺点...
2020-04-06 16:00:48
707
原创 Docker 入门
一 常用命令输入docker可以查看Docker的命令用法,输入docker COMMAND --help查看指定命令详细用法。镜像常用操作查找镜像:docker search 关键词#搜索docker hub网站镜像的详细信息下载镜像:docker pull 镜像名:TAG#Tag表示版本,有些镜像的版本显示latest,为最新版本查看镜像:docker image...
2020-03-22 20:19:45
159
原创 SpringBoot JPA 注解使用手册
一 @OneToMany,@ManyToOne注释的使用@Entitypublic class Employee { @Id @Column(name="EMP_ID") private long id; ... @OneToMany(mappedBy="owner") private List<Phone> phones; ...}@Entit...
2020-03-10 22:27:10
370
原创 MySQL之索引分享
索引本质官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构本质:索引是数据结构Innodb B-Tree 索引B+树成因:我们知道,每一种数据结构的出现都是为了解决特定的问题,那么B+树的出现是为了解决什么问题,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。在理解B+树结构之前,先提一下计算机的局部性原理:当计算机访问一个地址的数...
2020-03-01 19:54:25
298
原创 SimpleDateFormat的时区问题
Date data = new Date(); //2019-12-17 11:49:35 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); Stri...
2019-12-17 11:56:37
10364
原创 手动实现线程池
通过手写线程池,理解了以下问题:1.当任务堆满阻塞队列后,线程池会new新的线程来处理新的任务,直到线程数量达到最大值。这些新new出来的线程什么时候销毁呢?答:new出新线程后,这些线程同核心线程一样,处理阻塞队列里面的任务,阻塞队列里面任务处理完了后,新new出来的线程在等待设置的时间后,进行销毁,核心线程继续存活。2.比核心线程池数多的线程如何实现等待设置的时间后就销毁呢?答案是:...
2019-11-25 20:56:08
342
原创 数据库的一些知识点记录
为什么大公司不推荐用连表查询而使用单表查询第一:单机数据库计算资源很贵,数据库同时要服务写和读,都需要消耗CPU,为了能让数据库的吞吐变得更高,而业务又不在乎那几百微妙到毫秒级的延时差距,业务会把更多计算放到service层做,毕竟计算资源很好水平扩展,数据库很难啊,所以大多数业务会把纯计算操作放到service层做,而将数据库当成一种带事务能力的kv系统来使用,这是一种重业务,轻DB的架构思...
2019-11-14 11:26:50
240
原创 Spring Restful风格
一、什么是Restful风格REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,而 HTTP 是一种包含了 REST 架构属性的协议,为了便于理解,我们把它的首字母拆分成不同的几个部分:表述性(REpresentational): REST 资源实际上可以用各种形式来进行表述,包括 XML、JSON 甚至 H...
2019-11-10 17:44:17
306
原创 Mac下 nginx安装使用
一、安装Nginx使用brew命令简单方便:常用指令如下:brew 搜索软件brew search nginxbrew 安装软件brew install nginxbrew 卸载软件brew uninstall nginxbrew 升级sudo brew update查看安装信息(经常用到, 比如查看安装目录等)sudo brew info nginx查看已经安装的软件b...
2019-11-08 14:29:01
315
原创 单一职责原则
一、什么是职责在《敏捷软件开发:原则、模式与实践》中,把职责定义为变化的原因:如何你能想到多于一个动机去改变一个类,那么这个类就具有多于一个的职责。就一个类而言,应该仅有一个引起它变化的原因。...
2019-11-01 18:13:54
642
原创 算法基础-数组
收获点滴:1.数组的查询效率比链表高?答:哪怕排好序的数组,利用二分法查询时间复杂度也是 O(logn)。所以,正确的表述应该是,数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)。2.数组插入和删除的效率低?答:对于实际上,在某些特殊场景下,我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行,删除的效率是不是会提高很多呢?,如果数组只是存储数据的容器,存...
2019-10-23 17:51:35
121
原创 shell自动化程序之-MySQL自动登录
一、背景最近在学shell脚步,突然想练下手,想着每次登录MySQL,需要输入mysql -u root -p password 这个命令,那么能不能使这个过程自动化呢,于是动手写了下。先上结果吧:看,只需要输入mysqlgo这个命令,即可自动登入MySQL。二、shell编写#!/usr/bin/expect -fset password youPasswordspawn mys...
2019-10-16 17:47:15
2166
原创 个人电脑连接远程服务器点滴
ssh配置远程登录别名:cd ~/.ssh 在config文件中:添加这句话#remote server configHost pit #别名HostName 123.207.170.77User rootIdentitiesOnly yes #默认举例:ssh pit 然后输入密码就行了提示:默认远程服务器不开通密码登录,需要在远程服务器上的.ssh/authorized...
2019-10-16 14:13:10
254
原创 新电脑Java环境配置
MySQL配置:mac:https://juejin.im/post/5cc2a52ce51d456e7079f27f#heading-0centos:http://www.05bk.com/517.htmlJRE配置:centos:http://www.05bk.com/391.html
2019-10-12 15:48:03
290
原创 网络
1.TCP与UDP的区别TCP 是面向连接的,UDP 是面向无连接的(在互通之前,面向连接的协议会先建立连接,如 TCP 有三次握手,而 UDP 不会)UDP程序结构较简单TCP 是面向字节流的,UDP 是基于数据报的TCP 保证数据正确性,UDP 可能丢包TCP 保证数据顺序,UDP 不保证UDP:TCP:UDP例子:对实时性要求很高,比如直播,游戏,对数据丢失不敏感2.T...
2019-09-18 16:17:49
80
原创 敏捷软件开发 问题&感想
看到第5张重构的时候,最终版的代码写的是真好。优点:代码具有高可读性,基本就是让代码说话了,可以节省后面人阅读改代码的时间缺点:但是我感觉是不是有点过度重构了,三行代码也要重新写个方法?本来开发时间有限,而且程序员设计好的类名和方法名的时候感觉是挺费时的一件事。我们是要开始写代码的时候就严格按照这种规范,还是可以先实现功能,然后后面进行重构呢,如果时间紧急又该如何?在萌芽培训中我找到了答案:...
2019-09-16 16:11:33
261
原创 基础笔记
Float 和 Double 不会有缓存,其他包装类都有缓存。Integer 是唯一一个可以修改缓存范围的包装类,在 VM optons 加入参数:-XX:AutoBoxCacheMax=666 即修改缓存最大值为 666 。Set<Short> set = new HashSet<>();for (short i = 0; i < 5; i++) { ...
2019-09-10 11:09:31
166
原创 常用排序算法备忘录
快速排序public class QuickSort { public static void main(String[] args) { int[] array = {3, 5, 1, 4, 6, 2, 8,7};//3, 5, 1, 4, 6, 2, 8 StringBuilder sb = new StringBuilder(); n...
2019-09-10 11:01:59
156
原创 算法常用工具类
public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } public static ListNode mockHeadNode() { ListNode listNode = new ...
2019-09-08 22:24:24
1411
原创 ThreadLocal
引言ThreadLocal的官方API解释为:“该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。”大...
2019-08-27 20:01:58
110
原创 MySQL之B树和B+树
首先抛个问题,MySQL的索引为何用树而不是其他数据结构如hash,hash的读和写都是O(1),而树的话查询和插入都是O(log(n))?答:因为索引设计成树,是和SQL需求相关的,如果单独只查询某条数据,自然是hash算法快,但是我们平常用的查询往往不是只查询单条数据,而是order by,group by,< >这种排序查询,遇到这种情况,hash就会退化成O(n),而树因为它...
2019-08-15 18:14:12
11798
原创 Kafka学习笔记
一、kafka基本认识:kafka是一个分布式MQ中间件,由多个broker组成,每个broker是一个节点;你创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据。每个topic的数据,是分散放在多个机器上的,每个机器就放一部分数据。二、引入MQ的优缺点优点:解耦、异步和削峰解...
2019-07-28 17:14:18
161
原创 Simplify Path
Given an absolute path for a file (Unix-style), simplify it.For example, path = “/home/”, => “/home” path = “/a/./b/../../c/”, => “/c”思路:将路径根据“/”进行分割,得到去掉“/”的数组,然后将数组的内容放入栈中,当遇到“..”时,就把栈中的一个元素pop出来,当
2017-09-18 09:11:47
606
原创 最大和子序列
给定一个数组,里面的数有正有负,如何得到该数组中,最大和的子序列呢? 得到最大和子序列,那么就先求最大和嘛,在求最大和的过程中记录一下起始下标和终点下标就好了。 下面列出代码:public void maximumSubsequence (int arr[]) { int max = arr[0]; int sum = 0; int s = 0,s
2017-09-17 17:44:20
716
转载 HashMap源码分析
一、HashMap概述二、HashMap的数据结构三、HashMap源码分析 1、关键属性 2、构造方法 3、存储数据 4、调整大小 5、数据读取 6、HashMap的性能参数 7、Fail-Fast机制 一、Has
2017-08-30 23:15:22
3129
原创 Single Number
Single Number I Given an array of integers, every element appears twice except for one. Find that single one.思路:只要将所有数组中的数组进行异或即可,因为相同两个数异或结果为0 代码如下:public int singleNumber(int[] nums) { in
2017-08-30 12:42:38
3486
原创 从10万个数中找10个最大的数
对于这种题目,最普通的想法是先对这10万个数进行排序,然后再选取数组中前10个数,即为最后的答案,排序算法的时间复杂度不下于O(N lgN)。最好的方法是建立一个最小堆。 算法描述: 我们首先取10万个元素中的前10个元素来建立由10个元素组成的最小堆。这样堆顶元素便是当前已知元素的第10大的数;然后依次读取剩下的99990个元素,若读取的元素比堆顶元素大,则将堆顶元素和当前元素替换,并自堆顶至
2017-08-29 11:20:39
23974
4
翻译 Minor GC、Major GC与Full GC
先简单介绍一下: Minor GC:从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。 Major GC:是清理老年代。 Full GC:是清理整个堆空间—包括年轻代和老年代。 年轻代是大多数新对象创建和销毁的地方,对象从Young generation区域消失的过程我们称之为”minor GC“ 当年轻代满时,会引发“minor GC”。 新
2017-08-28 17:58:39
5916
原创 Excel Sheet Column
Given a column title as appear in an Excel sheet, return its corresponding column number.For example:A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 思路:26进制,将字符串从左往右遍历,每次得到的字母转为数字,然后加上次的的数并乘以对应的基数。
2017-08-28 15:09:07
5758
原创 Java中BIO,NIO,AIO
一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而
2017-08-28 10:21:04
5964
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人