java底层及源码相关
文章平均质量分 87
java底层及源码相关
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
life1024
这个作者很懒,什么都没留下…
展开
-
springboot 的@SpringBootApplication注解与第三方模块的xxx-boot-starter.jar,META-INF/spring.factories,手写starter
@SpringBootApplication注解的解析过程springboot默认扫描启动类所在的包下的主类与子类的所有组件,但并没有包括依赖包的中的类,如引入mybatis-starter,他的包名并不在启动类所在的包下,那么依赖包中的bean是如何被发现和加载的?我们通常在启动类中加@SpringBootApplication这个注解,点进去看@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Docume原创 2021-11-26 14:54:27 · 291 阅读 · 0 评论 -
Cglib的MethodPro的invoke和invokeSuper的区别;为何invokeSuper可以内部调用方法依然能增强,为何jdk代理不能实现invokeSuper的功能
简而言之,invoke方法调用的对象没有增强过,invokeSuper方法调用的对象已经是增强了的,所以会再走一遍 MyMethodInterceptor的 interceptor方法,如果是个拦截器链条,就会重新在走一次拦截器链;一。准备环境 Gglib的两个jar包,因为Cglib使用了ASM生成子类;二。代码准备public class Target { public void a() { System.out.println(" a 方法")..原创 2021-10-30 09:27:47 · 631 阅读 · 0 评论 -
关于spring 类内部方法调用aop不生效原因,以及jdk,cglib 动态代理原理
引入:spring的aop我们知道,在spring 的一个A类bean中方法fa调用A中的方法fb,即使fb上有则@Transactional,或者fb 被aop拦截了,此时fb上的所有代理织入操作都不会生效。而如果在另一个类B中调用A中的fb,则代理织入是生效的。但是经过下面实验发现,spring完全可以实现类内部方法调用 代理增强依然生效。但为何spring 不这样做呢?网上没有找到原因,以下为自己的理解原因:Spring aop应该是故意这样做的 内部调用是调用自己,不然就没办法通过代理b..原创 2021-10-30 10:33:46 · 588 阅读 · 0 评论 -
java HashMap的线程不安全的体现、扩容2次幂,jdk1.7 扩容链表死循环。
为何每次扩容都是2的n次幂hashMap table的长度为2^n 原因jdk1.8的index索引计算方法为 (table的长度-1)&key的hash值(1)扩容时要么是元索引位置、要么是源索引位置+原数组长度、可以减少重算hash。下图 n-1是数组长度,其中(a)是16、(b)是a扩容后长度为32。此时我们新的index 要么是原位置,要么是 原位置+原数组长度。(2)可以减少碰撞2^n-1全是1111..、与key的hash相&。会保留原来hash的特.原创 2020-12-09 09:56:53 · 309 阅读 · 1 评论 -
多ClassLoader实例加载多版本jdbc驱动原理,驱动包自动注册原理
我们知道一个类的元数据信息 在jvm方法区中 是以:ClassLoader实例对象+类全限定名 确定唯一的。也就是在jvm中可能存在 两个全限定名相同的class。同一个ClassLoader实例 不能加载两个全限定名 相同的class。ClassLoader 具体可以参看:https://liuhuiyao.blog.csdn.net/article/details/107078160URLClassLoader u1 = new URLClassLoader(new URL[] { u ..原创 2020-12-09 09:51:43 · 983 阅读 · 1 评论 -
在线执行java源码代码的实现、手动编译编码并执行
编译及执行类的封装package test3;import javax.tools.Diagnostic;import javax.tools.DiagnosticCollector;import javax.tools.FileObject;import javax.tools.ForwardingJavaFileManager;import javax.tools.JavaCompiler;import javax.tools.JavaFileManager;import java原创 2020-12-09 09:59:20 · 1234 阅读 · 0 评论 -
重排序,内存屏障,happen-before,主内存,工作内存
指令重排我们知道java在运行的时候有两个地方可能用到重排序,一个是编译器编译的的时候,一个是处理器运行的时候。那么我们就应该问问为啥要用指令重排序呢?生活类比我们从生活中举个例子,假设你有一箱红纸,现在要你剪成小红花贴在窗上。你有两种极端的选择:拿出来一个,把这个剪好,再贴上去......一个一个依次进行;另一种方式是先全部拿出来,然后全部剪好,最后全部贴上去。那种效率更高?很明显是后者,因为前者你就需要不停地在箱子,剪刀和胶水之间切换,这个切换过程不仅浪费时间,还耗费精力。但是后者一直原创 2020-12-09 09:50:39 · 387 阅读 · 0 评论 -
java agent 动态字节码修改,无代码侵入(jar 启动时,启动后)
简要描述java agent 技术 不同于AOP、不需要在原程序包中增加或者修改代码,而是单独做一个程序jar,实现对目标程序jar的修改,可以在jvm程序启动前、或者运行时 对类进行拦截、修改类中的实现(实际是修改jvm方法区中class字节码)两种方式实现(1)目标jar启动时修改在 目标jar包启动时 使用命令 java -javaagent:xx-agent.jar -jar 目标程序.jar ,对目标程序进行修改。(2)目标jar运行时修改使用attach(目标jar运行的原创 2020-09-25 10:00:53 · 1868 阅读 · 0 评论 -
http协议解决粘包拆包半包 的编码解码过程、 以及netty 使用http协议的原理
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能。1 http协议1.1 描述 标示 ASCII 描述 字符 CR 13 Carriage return (回车) \r LF 10 Line feed character(换行) \n SP 30 Horizontal space(...转载 2020-08-02 11:36:02 · 9047 阅读 · 0 评论 -
java 原生序列化算法字节码结构,以及使用
Java序列化算法Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。java序列化API提供一种处理对象序列化的标准机制。序列化的必要性java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。java序列化机制就是为了解决这个问题而产生。如何序列化一个对象一个对象能够序列化的前提是实现Serializable接口转载 2020-08-02 10:33:47 · 744 阅读 · 0 评论 -
java synchronized原理与 为何锁升级及过程
关于锁升级java1.6之前Syntronized 没有锁升级概念,只有重量锁:即用户态和内核态的上下文切换 会比较浪费时间。java1.6之后,Syntronized关键字 开始有锁升级的概念,即偏向锁,轻量级锁,重量级锁。注意CAS不是自旋锁,(CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。)自旋锁是利用CAS做多次循环判断。所谓的锁升级,其实就是从偏向锁à轻量级锁(自旋锁)à重量级锁,之前一..原创 2020-06-04 09:57:17 · 1300 阅读 · 0 评论 -
常见的几种jvm问题排查
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。这种情况可能的原因主要有两种:代码中某个位置读取数据量较大,导致系统内存原创 2020-07-28 12:04:38 · 688 阅读 · 0 评论 -
简单模拟实现 spring AOP Aspect的动态代理
package e;import java.lang.annotation.Annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.lang.reflect.InvocationH...原创 2020-07-23 18:58:25 · 281 阅读 · 0 评论 -
java锁的到底是锁的什么??
锁作用的对象类代码块锁对多个线程使用的多个此类A的代码加锁,即使多个线程多个对象也 会只有一个线程进入到此代码块,与对象个数,线程个数无关。实现方式(1)类代码块 synchronized(A.class){}(2)静态lock对象 static Lock lock=new ReetrantLock();类对象锁对多个线程使用的同一个类A对象加锁,与线程个数无关,多个线程中必须使用同一个类A对象,才会同步线程。实现方式(1)对象代码块 synchronized(this.原创 2020-06-04 10:00:00 · 1977 阅读 · 0 评论 -
java的对象物理结构,以及对象头中MarkWord与锁的关系
关于锁升级可参看https://blog.csdn.net/u013378306/article/details/106538659java 对象头我们都知道,Java对象存储在堆(Heap)内存。那么一个Java对象到底包含什么呢?概括起来分为对象头、对象体和对齐字节。如下图所示:对象的几个部分的作用:1.对象头中的Mark Word(标记字)主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode;2.Klass Word是一个指向方法区中Class信.转载 2020-06-13 17:24:37 · 2317 阅读 · 1 评论 -
java锁 AQS、ReentrantLock、ReentrantReadWriteLock 源码分析
一、AQSAbstractQueuedSynchronizer(简称AQS),队列同步器,是用来构建锁或者其他同步组建的基础框架。该类主要包括:1、模式,分为共享和独占。2、volatile intstate,用来表示锁的状态。3、FIFO双向队列,用来维护等待获取锁的线程。AQS部分代码及说明如下:public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer.转载 2020-07-15 09:24:37 · 268 阅读 · 0 评论 -
关于java的classLoader,与类加载过程
类加载过程一、类加载机制JVM把class文件加载到内存,并对数据进行校验、准备、解析、初始化,最终形成JVM可以直接使用的Java类型的过程。‘类加载全过程1、加载将class字节码文件加载到内存中,并将这些数据转换成方法区中的运行时数据(静态变量、静态代码块、常量池等),在堆中生成一个Class类对象代表这个类(反射原理),作为方法区类数据的访问入口。类的加载原理2、链接将Java类的二进制代码合并到JVM的运行状态之中。• 验证确保加载的类信息符合JVM规范,原创 2020-07-15 09:25:28 · 318 阅读 · 0 评论 -
关于javac 与 java,编译 运行的包路径问题
前言文件目录树注意着几个java文件都没又定义包名,但是他们都不在统一路径的问题Test.javapublic class Test{ public static void main(String[] args){ try{ Class c = Class.forName(args[0]); A w = (A)c.newInstance(); w.go("aaaa"); } catch(Exception e){ e.printStackTra.原创 2020-07-15 09:24:15 · 970 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore源码解析
CountDownLatch1 前言CountDownLatch是一种同步辅助工具类,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。(源码分析基于JDK1.8)CountDownLatch需要用给定的闩锁计数count初始化。await方法使当前线程阻塞(每执行一次countDown方法就将闩锁计数减1),直到闩锁计数达到零时(所有因此阻塞等待的线程都)才会被唤醒。CountDownLatch是一次性使用的同步工具,闩锁计数无法重置,如果需要重置计数,可能使用CyclicBar.转载 2020-07-15 09:24:51 · 464 阅读 · 0 评论 -
关于java的线程池 ThreadPoolExecutor 如何做到线程复用的 源码解析
自己总结:重要的类java.util.concurrent.ThreadPoolExecutorjava.util.concurrent.ThreadPoolExecutor.Worker重要的属性//线程workerprivate final HashSet<Worker> workers = new HashSet<Worker>();//阻塞的任务队列private final BlockingQueue<Runnable> ..原创 2020-07-15 09:25:02 · 448 阅读 · 0 评论 -
jdk1.8 1.7 ConcurrentHashMap HashMap 实现对比
前言理解HashMap和ConcurrentHashMap的重点在于:(1)理解HashMap的数据结构的设计和实现思路(2)在(1)的基础上,理解ConcurrentHashMap的并发安全的设计和实现思路前面的文章已经介绍过Map结构的底层实现,这里我们重点放在其扩容方法,这里分别对JDK7和JDK8版本的HashMap+ConcurrentHashMap来分析:JDK7的HashMap扩容这个版本的HashMap数据结构还是数组+链表的方式,扩容方法如下:...转载 2020-07-15 09:28:42 · 398 阅读 · 0 评论 -
原码反码补码 与 位移运算总结(Java)
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理以下代码基于javajava 中数字做位运算时,都会补全32位(Short也是),如果强转为Long类型则会用64位。以下以-4,4为例 ,长度以32位为准。关于:原码,反码,补码(有符号位)java 输出-4或4的补码。正数4的原码=0(28个0)100正数的 原码=反码=补码负数注意:转换过程中:最高位符号位始终位置不变值也不变。反.原创 2020-06-10 11:18:22 · 403 阅读 · 0 评论 -
算法-8种排序算法
排序算法总结排序算法 平均时间复杂度 冒泡排序 O(n2) 选择排序 O(n2) 插入排序 O(n2) 希尔排序 O(n1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*logN) 基数排序 O(d(n+r)) 一. 冒泡排序(BubbleSort) 基本思想:两个数比较大小,较大的数下沉,较小的数冒起来。 过程: 比较相邻的两个数据,如果第二个数小,就交换位转载 2020-06-05 09:42:47 · 334 阅读 · 0 评论 -
布隆过滤器
布隆过滤器。选择多个哈希函数 对一个字符串xxx进行映射到数组的不同位置。如果这些位置下标都有值(不为空),则说明这个字符串在数组中存在的几率越大。如果用这个几个哈希函数算出的位置 其中有一个为空,则一定能说明此字符串肯定不存在什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,.转载 2020-06-04 10:00:13 · 377 阅读 · 0 评论 -
二叉搜索树、平衡二叉树、B树、B+树、B*树
二叉查找树二叉查找树,由于不平衡,如果连续插入的数据是有顺序的、会导致如下图B的所示,此时搜索会退化到O(N) 二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树:(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 任意节点的左、右子树也分别为二叉查找树;(4) 没有键值相等的节点。 如上图所示,是不同形态的二叉查原创 2020-06-03 14:40:05 · 372 阅读 · 0 评论 -
一致性哈希原理与应用
分布式系统中对象与节点的映射关系,传统方案是使用对象的哈希值,对节点个数取模,再映射到相应编号的节点,这种方案在节点个数变动时,绝大多数对象的映射关系会失效而需要迁移;而一致性哈希算法中,当节点个数变动时,映射关系失效的对象非常少,迁移成本也非常小。本文总结了一致性哈希的算法原理和Java实现,并列举了其应用。作者:王克锋出处:https://kefeng.wang/2018/08/10/consistent-hashing/版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。1 概述1转载 2020-06-03 14:28:36 · 455 阅读 · 0 评论 -
tomcat连接池和dbutils使用
1. 配置tomcat下的conf下的context.xml文件,在 之间添加连接池配置: res-ref-name> --> auth="Container" type="javax.sql.DataSource" res-type> --> maxActive="20"原创 2015-09-10 23:17:26 · 817 阅读 · 0 评论 -
(java gui) 和 (网页 js) 通过url传值(如json)时,注意问题
(java gui) 和 (网页 js) 通过url传值时,如果不涉及特殊字符可以不进行编码,但是如果有特殊字符,比如中文,及符号 就要进行编码。java 使用 java.net.URLEncoder.encode(str, "UTF-8");编码,java 使用java.net.URLDecoder.decode(str,"UTF-8");解码,js 使用decodeU原创 2015-08-22 11:00:19 · 1831 阅读 · 0 评论 -
java 连接oracle数据库
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;public class oracleTest {public static Connection testOracle(){原创 2015-08-18 17:15:44 · 575 阅读 · 0 评论 -
关于byte 进制 float String 编码 16进制字符串转16进制byte的问题
首先 只有String才与编码有关;byte与其他类型转换时,要注意大端点还是小端点,编码: Ascii Unicode gbk utf-8等等 byte 占 8位 可由两个16进制数(0xff)组成,一个16进制占4位,也可由8位二进制数组成等等,与编码没关系,但可用2进制表示,也可由其他进制表示。把byte[n]转换成String;new String(byte原创 2015-07-12 19:09:09 · 549 阅读 · 0 评论 -
关于 java JSONArray JSONObject转换问题
import lhy.client.json.JSONArray;import lhy.client.json.JSONException;import lhy.client.json.JSONObject;public class MyJson {public static void main(String[] args) throws JSONException原创 2015-05-31 12:28:47 · 1324 阅读 · 0 评论 -
java join sleep wait notify notifyAll
sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。 通过调用sleep使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行。调用sleep的时候锁并没有被释放。休眠 Java SE5引入了更加显示的sleep()版本作为TimeUnit类的一部分,这个方法允许你指定sleep(转载 2015-05-21 22:35:41 · 650 阅读 · 0 评论 -
java获得一个目录下的所有文件,和固定后缀的文件
import java.io.File;import java.io.FilenameFilter;public class FileSelect implements FilenameFilter{static String extension = ".";public FileSelect(String fileExtensionNoDot){原创 2015-09-24 16:08:42 · 3355 阅读 · 0 评论 -
java date String 类型相互转换
这种转换要用到java.text.SimpleDateFormat类字符串转换成日期类型:方法1:也是最简单的方法 Date date=new Date("2008-04-14");方法2:SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//小写的mm表示的是分钟String d原创 2015-10-17 13:37:05 · 448 阅读 · 0 评论 -
java操作oracle数据库的时间类型
方法一、使用java.sql.Date实现比较简单的yyyy-mm-dd格式日期。java.sql.Date不支持时间格式。切记不要使用new java.sql.Date(int year,int month,int date),因为还要处理时间差问题。PreparedStatement pstmt = conn.prepareStatement("insert into book (na原创 2015-10-17 13:43:04 · 1161 阅读 · 0 评论 -
java 占位符 拼接字符串
(1)先使用 %s (字符串) %d(整形)占好位 String urlFormat2="http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=%s¤t_page=%d" + "&since_id=&page=%d&pre_page=%d&max_id=&end_id=%d&pagebar=%d&f原创 2015-10-29 22:01:19 · 2906 阅读 · 0 评论 -
用 ThreadLocal 管理用户session
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVari转载 2015-12-19 11:34:07 · 1121 阅读 · 1 评论 -
java 自定义注解使用
以上就是自定义注解原创 2016-01-18 17:10:14 · 538 阅读 · 0 评论 -
java enum枚举的使用
用法一:常量在JDK1.5 之前,我们定义常量都是: public static fianl…. 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。123publicenum Color { RED, GREEN, BLANK, YELLOW }转载 2016-02-27 15:10:27 · 758 阅读 · 0 评论 -
java http get post 各种请求,模拟浏览器请求
package com.hlzt.wx.util.http;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import java.util.Arr原创 2016-04-28 11:01:28 · 1280 阅读 · 0 评论