java
文章平均质量分 56
明月(Alioo)
一个在互联网行业浪迹多年的IT民工,集闷骚与博爱于一身,擅长JAVA,喜欢折腾Linux,热衷于研究各类B/S系统。对各类新奇技术保持极大的热情,行迹诡异,早年经常流窜于移动互联网领域,现藏身于朝林阑珊处。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
展开
-
自己动手实现javap
纸上得来终觉浅,绝知此事要躬行,今天就动手实现一个jdk自带的工具javap- 阅读本文可以带你完整的自己实现javap的全部功能- 本文只提到了核心代码,完整代码git地址请访问:https://github.com/lzc-alioo/itstack-demo-jvm- 项目访问入口类是com.lzc.wuxin.Jad1,com.lzc.wuxin.Jad2,将分别代表javap,javap -v的实现逻辑,如果你在运行过程中有任何问题欢迎留言,看到后一定为你解答,同时如果你发现代码的缺陷,原创 2022-04-17 21:44:28 · 546 阅读 · 0 评论 -
JavaAgent的那点秘密
JavaAgent的那点秘密前言大家都知道Java文件编译成Class文件之后才能在Jvm中运行的,而Class文件自有一套规范:不必一定是Java文件经由javac编译产生;其它编程语言也可以直接生成Class文件交由Jvm运行;既然其它语言都可以生成Class文件,理论上Java语言自己是不是也可以修改/篡改Class文件呢?答案是肯定的。那么是否有这方面的需求呢(用Java语法去直接修改Class文件)我举个例子:需要去增强别人的二方包,需要针对其中大量的方法进行增强程序运行期间原创 2021-10-31 20:43:22 · 378 阅读 · 0 评论 -
jdk8中list,map的stream常见操作
本文的知识点:map 与flatmap的区别从list中取出第一个元素,需要需要list为null,empty的情况package com.alioo.stream;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;import java.util.Optional;import static java.util.stream.Col原创 2020-08-26 17:45:23 · 2223 阅读 · 0 评论 -
Java 能否自定义一个类叫 java.lang.ArrayList
关于这个问题,网上众说纷纭,类似的问题还有:java.lang.System,java.lang.String,java.lang.Math是否自己写一个jdk同名的类。大概的答案主要分成以下2派:可以,自定义classloader破坏双亲委派机制(由于系统自带的3个类加载器都加载特定目录下的类,如果我们自己的类加载器放在1个特殊的目录,那末系统的加载器就没法加载,也就是终究还是由我们自己的加载器加载。)点评:这个明显是没有实践过的一派人的发言,实践一下就会发现自定义classloader是行不通原创 2020-07-31 16:14:12 · 414 阅读 · 1 评论 -
ThreadPoolExecutor是如何处理任务的异常情况
本文因生产环境线程池某些场景下的任务异常后,日志文件中没有被记录进来产生的困惑引发的思考。当然如果所有异步的业务方法run里面都加上一层try…catch…就可以主动捕获所有的异常,也能够记录到日志文件中,然而总有一些人不漏掉了,今天分享下run方法如果不加try…catch…的后果测试调用execute//测试代码public static void testExecute() { ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1原创 2020-06-04 01:47:12 · 5721 阅读 · 1 评论 -
SPI技术-JDK实现
SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉...原创 2020-03-03 23:33:04 · 426 阅读 · 0 评论 -
GC专题-查看日志
GC日志参数列表-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC 在进行GC的前后打...原创 2020-02-26 18:58:11 · 396 阅读 · 0 评论 -
java String字符串在内存中的地址和指向问题
String str1 = “abc”;System.out.println(str1 == “abc”);步骤:栈中开辟一块空间存放引用str1,String池中开辟一块空间,存放String常量"abc",引用str1指向池中String常量"abc",str1所指代的地址即常量"abc"所在地址,输出为trueString str2 = new String(“ab...转载 2020-02-25 15:02:24 · 2775 阅读 · 4 评论 -
Java String6,7,8,9区别 以及 有哪些方式可以提高性能
String 对象在jdk不同版本中的实现String对象是 Java 中使用最频繁的对象之一,所以 Java 公司也在不断的对String对象的实现进行优化,以便提升String对象的性能,看下面这张图,一起了解一下String对象的优化过程。在 Java6 以及之前的版本中String对象是对 char 数组进行了封装实现的对象,主要有四个成员变量:char 数组、偏移量 offse...转载 2020-02-17 09:31:45 · 618 阅读 · 0 评论 -
java程序开启远程调试、断点功能
代码就是最好的文档 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 几点说明:-agentlib:jdwp 这个是jdk自带的调试工具是jti,位于$JAVA_HOME/jre/lib/amd64/libjdwp.so,后面的均是它的参数suspend=n 表示程序启动时不挂起,直接运行,...原创 2020-01-03 11:12:11 · 1845 阅读 · 0 评论 -
GC专题-查看JVM使用的GC
一、设置垃圾收集器参数我们设置JVM垃圾收集器参数时,一个参数就同时指定新生代老年代各自的垃圾收集器了。-XX:+UseSerialGC,虚拟机运行在Client模式下的默认值,Serial+Serial Old。-XX:+UseParNewGC,ParNew+Serial Old,在JDK1.8被废弃,在JDK1.7还可以使用。-XX:+UseConcMarkSweepGC,...原创 2019-12-27 12:13:03 · 1052 阅读 · 0 评论 -
如何保证消息队列的顺序性?
面试题如何保证消息的顺序性?面试官心理分析其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。面试题剖析我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -...转载 2019-12-17 11:53:49 · 338 阅读 · 0 评论 -
Jdk8 foreach语法需要break怎么办?
forEach里的return只相当于continue,没有break语法,在这里我总结了3种解决方案供你选择exception ,filteranyMatch //forEach里的return只相当于continue,没有break语法 //使用exception , filter , 或者 anyMatch 可以解决 List<...原创 2019-12-16 13:25:19 · 1168 阅读 · 0 评论 -
HTTPS的加密过程
HTTPSHTTPS即加密的HTTP,HTTPS并不是一个新协议,而是HTTP+SSL(TLS)。原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。我们首先了解几个基本概念。共享密钥加密(对称密钥加密):加密和解密同用一个密钥。加密时就必须将密钥传送给对方,那么如何安...转载 2019-11-14 14:52:48 · 389 阅读 · 0 评论 -
jdk8之前版本中HashMap存在的问题剖析
一、put时存在丢失元素的问题put方法逻辑说明将新插入的元素放置到链表头部,原来的链表头部作为新元素的next节点put关键代码块void createEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; // 步骤1 table[buc...原创 2019-11-08 11:07:54 · 438 阅读 · 0 评论 -
java调用c++文件
网上有很多例子,参照着执行有时候相对路径问题经常卡住了,实战了一把通过后,特重新整理一份,供小白参考首先需要有一个含有native方法的java类vi /Users/mac/work/git/javademo/src/main/java/com/alioo/jni/JniDemo.javapackage com.alioo.jni;public class JniDemo { ...原创 2019-11-04 18:45:14 · 689 阅读 · 0 评论 -
Idea Live Templates代码模板&Edit Variables变量定义
我是一名java工程师,说下我用到的2个模板吧,分享给大家一下1.我喜欢将自定义的归纳到一个分组 logger对应的代码模板 private static final Logger logger = LoggerFactory.getLogger($CLASS_NAME$.class); 备注:1需要设置作用域 备注:2还需要针对变量进行定义$CLASS_NAME$ ...原创 2018-02-26 16:35:38 · 10273 阅读 · 0 评论 -
一个mysql事务引发的思考(血案)
问题简述大家都知道mysql是支持ACID,支持事务的,事务是非常重要的一个特性,要不都执行成功,要不都不成功。我们在coding时也会大量用到,但是随着业务代码的累加与使用人数的增加,系统有某些场景下会出现下面这个错误11:48:40.265[http-nio-8999-exec-3] ERROR c.x.e.l.c.e.ExceptionHandleFilter - excepti...原创 2018-07-04 20:20:26 · 465 阅读 · 0 评论 -
带你认识一下“京东到家-网关系统”
京东到家二周年活动已然结束,在这2年里,我们的网关系统经历过了618,1020,双11,双12,415等多个非常有意义的考试,回顾起来依旧让人觉得很刺激,每次考前我们和市场部都做了大量的效果预估、压测&扩容,但是活动当日依旧是惊心动魄,瞬时数以100倍的流量涌入(有成千上万薅羊毛党的入侵,有技术黑客的搅局,有友商的友情压力测试,有通过全站push带来的用户同一时间瞬时访问),网关作为后台服务器的第原创 2018-06-06 10:00:22 · 2175 阅读 · 0 评论 -
Spring 启动过程,bean到底是什么时候通过反射生成实例的
Spring 启动时最重要的方法refresh(), 1. 在obtainFreshBeanFactory();中创建所有对象的BeanDefinition 2. 在finishBeanFactoryInitialization(beanFactory);中创建真正的单例对象,及其依赖对象的绑定public void refresh() throws BeansException, Il...原创 2018-03-26 15:28:25 · 1890 阅读 · 0 评论 -
关于hashCode,你一定听说过会重复,那么你见过2个不同的字符串hashCode值却是相同的吗
java中String.hashCode()方法的算法如下:str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + ... + str.charAt(n-1)据说算法中31这个数字是对英文字符进行优化后产生的一个最佳数字,但是碰上字母大小写或是一些特殊字符,再或者是中文字符,它就不灵了,很容易重复,举个例子:Stringa="Aa";Stringb="BB"...原创 2017-05-09 21:02:57 · 39122 阅读 · 11 评论 -
从实际案例聊聊Java应用的GC优化
当Java程序性能达不到既定目标,且其他优化手段都已经穷尽时,通常需要调整垃圾回收器来进一步提高性能,称为GC优化。但GC算法复杂,影响GC性能的参数众多,且参数调整又依赖于应用各自的特点,这些因素很大程度上增加了GC优化的难度。即便如此,GC调优也不是无章可循,仍然有一些通用的思考方法。本篇会介绍这些通用的GC优化策略和相关实践案例,主要包括如下内容: 优化前准备: 简单回顾JVM相关知...转载 2018-03-19 11:56:48 · 1894 阅读 · 0 评论 -
第二章 ZAB协议介绍
第二章 ZAB协议介绍 ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)是zookeeper数据一致性的核心算法。 ZAB 协议并不像 Paxos 算法那样,是一种通用的分布式一致性算法,它是一种特别为 ZooKeeper 设计的崩溃可恢复的原子消息广播算法。 ZAB协议主要实现了: 1.使用一个单一的主进程来接收转载 2018-01-30 10:09:58 · 223 阅读 · 0 评论 -
spring Aop嵌套调用的解决办法
众所周知,Spring AOP在同一个类里自身方法相互调用时是无法拦截的。问题示例代码 public String say(String a) { System.out.println("say a=" + a); say2(a); return a + a; } public String say2(String a) {原创 2018-03-05 14:52:23 · 5878 阅读 · 1 评论 -
Spring Aop&proxy到底是什么关系
Spring Aop&proxy到底是什么关系 proxy代理模式,是一种设计模式,具体内容可参见 https://www.cnblogs.com/cenyu/p/6289209.html Spring Aop,是利用了代理模式在运行期间对植入了增强的代码如果Spring bean没有用到aop(即没有aop会作用到当前bean)时,这个时候的bean就是一个普通的b...原创 2018-03-05 14:03:13 · 1382 阅读 · 0 评论 -
缓存雪崩,缓存穿透,缓存击穿,解决方案分析
前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存雪崩缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。解决方案缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储...转载 2018-03-12 11:53:58 · 295 阅读 · 0 评论 -
NGINX location 在配置中的优先级
location表达式类型~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。 = 进行普通字符精确匹配。也就是完全匹配。 @ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_fileslocation优先级说明在ngi...转载 2018-02-24 15:45:44 · 357 阅读 · 0 评论 -
UML类图关系大全
转载来源:https://www.cnblogs.com/pingge/p/3527196.html你需要掌握的几个 继承父类,实现接口,自关联1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法。在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来说显得太抽象了,因为在设计阶段关联关...转载 2018-03-09 17:47:00 · 228 阅读 · 0 评论 -
Spring、SpringMVC父子容器关系
Spring、SpringMVC父子容器关系常规配置代码 <!-- listeners --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </...原创 2018-03-15 17:45:41 · 368 阅读 · 0 评论 -
JDK源码中为什么在方法中创建一个临时变量替代成员变量、类变量
JDK源码中为什么在方法中创建一个临时变量替代成员变量、类变量 又名 临时变量提高Java代码性能 一个Java类中可以存在多种形式的变量,可以是最一般的成员变量;或静态变量;或临时变量。那么这三种变量的存取效率如何?1、实战出真知package com.subject.variable;/** * 使用临时变量提高Java代码性能 (转) */public class ...原创 2018-02-08 13:57:57 · 1554 阅读 · 0 评论 -
idea 注册码 在线生成方式
已经有前辈搞了一个在线网站了,直接生成即可的 http://idea.iteblog.com/原创 2018-02-07 18:28:56 · 19653 阅读 · 3 评论 -
Maven根据一个现有的项目创建模板
1.首先需要一个现成的项目,预览一下$ ll /Users/didi/work/git/land-server total 56 drwxr-xr-x 17 didi staff 544 7 17 20:35 . drwxr-xr-x 16 didi staff 512 7 9 14:40 .. drwxr-xr-x 15 didi staff 480 ...原创 2018-07-17 21:09:48 · 1816 阅读 · 0 评论 -
分布式ID方案那么多,如何进一步保证ID尾部的最后1位也是随机的呢
2018-07-18 先占个坑,回头再来完善下这篇文章,有思路想法的欢迎大家留言交流为什么把这个问题抛出来的,因为了解到有公司的订单号ID本身是随机的,也是杂乱无序的,但是订单号ID的最后1位随机性不强,在一次大促期间引发了严重的事故。举个例子: 订单号ID的最后1位只会有1,2,3,4这4种可能性,考虑到单位时间内订单量的不确定性,我们通常会写入到一个临时表(订单缓冲表)。 然后会...原创 2018-07-18 17:09:08 · 279 阅读 · 0 评论 -
一次ajax调用,却发送了二次http请求(一次为请求方法为option,一次为正常请求)
直接上证据,截图来自于chrowm浏览器-开发者工具-network 会发现其中一次请求 Method是OPTIONS 另外一次是正常请求 原因如下: 浏览器对复杂跨域请求的处理,在发送真正的请求前, 会先发送一个方法为OPTIONS的预请求(preflight request), 用于试探服务端是否能接受真正的请求,如果options获得的回应是拒绝性质的,比如404\403...原创 2018-09-04 14:13:53 · 7903 阅读 · 0 评论 -
Spring的IOC原理[通俗解释一下]
转载http://www.cnblogs.com/superjt/p/4311577.html1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。图1:软件系统中耦合的对象如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒转载 2017-06-28 09:30:35 · 330 阅读 · 0 评论 -
在Java里体验一把协程Quasar
在还没有协程的时代操作系统产生一个进程,进程再产生若干个线程并行的处理逻辑,线程的切换由操作系统负责调度。每个线程都有自己的栈栈是否有一些默认值?的确有默认值,不同的虚拟机不同的平台是不同的,想了解的可以看这里 https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html#wp1...原创 2019-09-19 19:50:49 · 686 阅读 · 0 评论 -
HashMap/ConcurrentHashMap在单线程模式下的性能比较
起源阅读源码发现jdk8中ConcurrentHashMap是基于synchronized来加锁实现多线程安全的,但是实现方式上与早期的HashTable又有了很大的区别,虽然都是使用synchronized来加锁,但是锁的粒度不一样,大致可以作如下理解:HashTable JDK1.0版本开始提供,为了保证线程安全,内部使用了1把锁,读读、读写操作均会锁竞争HashTable这种键值...原创 2019-08-20 10:25:49 · 6637 阅读 · 0 评论 -
tcpdump常用命令
只抓目的ipsudo /usr/sbin/tcpdump -i eth0 tcp dst host 1.2.3.4 -c 100 -w 0515.pacp只抓目的portsudo /usr/sbin/tcpdump -i eth0 tcp dst port 9030 -c 100 -w 0515.pacp只抓目的ip&目的portsudo /usr/sbin/tcpdum...原创 2019-05-27 18:43:11 · 465 阅读 · 0 评论 -
CAS存在的问题以及解决方案
CAS存在的问题以及解决方案CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题。ABA问题,循环时间长开销大和只能保证一个共享变量的原子操作ABA问题因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变...转载 2019-05-24 17:33:22 · 10453 阅读 · 0 评论 -
程序计数器(关于java虚拟机内存的那些事)
什么是程序计数器?程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 ;在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳准、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 ;———–摘抄自 周志明版 《深入理解java...转载 2019-04-23 19:56:36 · 334 阅读 · 2 评论