Skip to content

Instantly share code, notes, and snippets.

@arrayadd
arrayadd / final.md
Last active August 20, 2017 16:04
一个java中的无奈实现

作为一个大部分时间都在使用java的工程师,final这个关键字几乎无时无刻都能在代码里面看到,尤其是在使用多线程内部类的时候,一部分时间都在处理变量中的final问题。非常烦人,可一旦按照正常习惯去掉final,IDE中又常常会提示红色下划线错误,为什么匿名内部类使用其所在方法的局部变量式需要额外添加final关键字?


示例代码

public void doWork(){
        final int num=12;//基本数据类型
        final List<String> list=new ArrayList();//引用数据类型

 new Thread() {
@arrayadd
arrayadd / fenpei.md
Created August 2, 2017 12:52
分配担保意义

我们知道HotSpot虚拟机把堆空间(内存上可以是不连续的)分成不同区域,来进行所谓分代收集。 其中又根据来自IBM一些数据研究结果,把一些朝生夕死的短命鬼划分到年轻代,其他一些老不死的放到老年代。 当年轻代存不下新分配对象时候,就会触发所谓的Minor GC,进而引发老年代和新生代之间的分配担保机制

关于分配担保机制的详细过程,网上充栋,这里就不说了,但更有意思是,这种机制不需要可以吗?使用了它又有什么意义?实际工作场景中有没有可以参考的。


为什么需要是连续的空间

分配担保机制中,无论是新生代所有对象总和还是历次晋升到老年代的平均大小的经验值,在进行比较时候都会和老年代最大连续空间进行比较。 难道不连续只要凑起来够就不行了?毕竟老年代还是**标记-清理-(压缩)**算法。

@arrayadd
arrayadd / log4j.md
Last active July 20, 2017 17:01
从log4j日志升级想到

这几天在对自己业务组的十几个模块进行日志升级,从log4j1 升级到log4j2. 在实施的过程中遇到各种各样的问题,其中有个问题特别突出,导致好几个项目没法升级。

首先说下背景,我们这些模块只是集团一个小业务线中的子模块,除业务部分外代码需要自己编码外,项目中其他部分代码从框架,数据库,公共组件都是使用集团统一所谓的自研框架,例如有个叫XYRedis组件,XY是公司名字,其只不过是把redis的大部分代码copy过来,连包名都不改,套了个maven壳子。经常出一些莫名其妙的问题,一看日志,不对啊,jedis官方怎么会犯这样低级错误。总之,东施效颦一般。

就说这次日志升级中最令人发指的部分,这些公共组件,有好些个居然使用的日志框架是log4j 而不是 SLF4J, 导致我们项目没法从log4j1 升级到log4j2 (两者配置文件格式不兼容),一启动项目就包错,找不到合法的日志配置文件,一查原来是依赖的公共组件要用到旧的配置文件,奔溃。


@arrayadd
arrayadd / random.md
Last active July 4, 2017 17:00
记一个需求开发的思维过程

昨天临下班的时候,意外接到一个叫**「我的足迹」**的需求,大意就是把用户访问过的商品记录下来,方便用户以后查看。


重审需求是否合理

从用户使用层面,上面这个需求提供的功能,或多或少有和我的收藏功能重叠嫌疑。但作为开发有质疑需求的意识还是非常必要的,尤其是做应用开发的,绝对不能PM给个需求就急着开发,时常驳回一些拍脑袋的需求还是必修的。养成这个意思非常重要。 当然关于这个需求,PM还提出了以下一些要求:

  • 每个用户只保留最近100条浏览记录
  • 不能重复,同一个商品浏览多次,算最近一次时间。
@arrayadd
arrayadd / cron.md
Last active November 1, 2018 05:50
【Linux】cron表达式的小坑

今天遇到个坑,因为凌晨要执行个脚本,把一些数据从一个表清洗到另一个表。结果写好脚本,线下服务器测试crontab定时任务的时候,到时间死活就是不执行。后来找同事看了下,才发现

Linux 下的crond服务,所用的cron表达式,只能精确到分,而通常项目中,例如spring,quartz 是可以精确到秒的。

结果我复制的项目中平时运行好好的的cron表达式,自然无法定时执行。


Linux下cron表达式格式

cron有两个配置文件,一个是全局配置文件(/etc/crontab),是针对系统任务的;一组是crontab命令生成的配置文件(/var/spool/cron/用户名 下的文件),是针对某个用户的. 通常都用/var/spool/cron下的。

@arrayadd
arrayadd / JVM-PCR.md
Last active August 20, 2017 16:29
【JVM】程序计数器为什么是线程私有的?

我们知道,JVM运行时数据区域中有一个线程私有的区域Program Counter Register,姑且翻译为程序计数器。 当然也有翻译为 PC寄存器的。以下简称PCR. 我们知道在计算机的CPU中有两个专有的寄存器

  • 指令寄存器,用于存储正在执行的指令
  • 程序计数器,其存储的是下一个等待执行的指令地址。

在JVM中,这两个专有寄存器功能应该是融合的(没考证,推测的,但不影响理解其功能)


@arrayadd
arrayadd / jobs.md
Last active April 14, 2021 08:47
【Linux】让任务后台运行

平时我们用CRT,或者Xshell 连接到Linux服务器上执行一些命令操作,执行完成后,关闭窗口完事。但有些场景下,例如,启动一个java程序,而这个程序会每隔1分钟执行一些任务。如果我们用类似命令:

[root@test ~]# java -jar ./test.jar

但这样做有个问题,如果我们关闭终端,这个java进程也会随着退出。


让程序后台运行

linux下有个命令nohup可以让程序后台运行,即使是我们退出了终端,它也会持续运行。

@arrayadd
arrayadd / readline.md
Last active June 17, 2017 10:42
【Linux】for,while读取每一行的区别

平时要操作线上数据库,只能通过跳板机来连接到生产数据库,然后执行一些sql. 例如,运营同学会筛选出一批活动id,我们需要批量修改下这些id对应的数据过期时间信息,通常我们只需要连接到数据库执行类似update t_activity set ent_time=1234554 where activit_id in (xx,xxx,xx) 的sql就行。

但有时候,运营同学给的id文件中,有几百,上千个。如果我们手动把这些id,用逗号隔开,一个一个拼接到sql中,然后复制这条sql,去执行。就会非常麻烦。这时候下面简单脚步就可以快速搞定。


读取文件的每一行

shell 中读取文件的每一行,有很多实现方式,但fro,While循环的方式是最容易理解的,接近平时编程语言方式。

  • for 方式
@arrayadd
arrayadd / consistenghash.md
Last active April 27, 2018 10:51
一致性hash 一致在哪里?

关于一致性哈希算法的介绍,网上挺多的,图文并茂,易懂详细,例如:一致性哈希算法与Java实现


一些注意点

  • key的哈希及服务集群节点的哈希应该用同一个哈希函数。尽管理论上可以用不同函数,只需要保证这两个hash函数的哈希值范围及均匀性相近就行,但实际中完全没理由这么做,除非想没事找事,脱裤子放屁..
  • 每个节点的可虚拟节点数,及总的虚拟节点数,应该有已被实践过的参考范围,而不应该是越多越好。同时,随着实际节点数的变化,对应的总的虚拟节点数也应该是动态的。而不是线性的。
  • 实际开发中难点还有一处,就是如何有效的发现集群中节点的变化,也就是动态的删除,增加节点。
@arrayadd
arrayadd / array.md
Last active June 11, 2017 16:28
数组为什么快

仔细想想,平时在用的时候,Java中的那些数据结构,本质上都是数组+引用。HashMap就不说了,链表呢?每个节点可以看成是一个length=1的数组。


天生自带枷锁

数组在定义的时候就携带了一些枷锁:

  • 使用前先申请确定的内存空间;
  • 分配空间后,大小固定,不能再改变(数据溢出问题)
  • 内存空间必须是连续的。在内存中有空间连续性的表现,中间不会存在其他程序需要调用的数据,为此数组的专用内存空间。