自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

姜希成的博客

岁月流逝,将来的某时某处,我会在叹息中想起,林间的路分成两股,而我选择了人迹罕至之徒,那一刻起,一切差别已成定铸。

  • 博客(19)
  • 收藏
  • 关注

原创 Java系列核心知识体系

算法、数据结构、设计模式线性表、树、图排序、查找、贪心、动态规划设计原则、创建型、结构性、行为型、复合模式基础Spring / SpinrgMVC / SpringBootJVM内存模型,对象分配,类加载,字节码GC,调优,JIT语法糖并发编程synchronizedAQS / Lock并发工具类(框架),并发容器,线程池JMM网络编程网络协议BIO, NIO, selector/poll/epollNettyTomcatNginxwir.

2021-04-24 09:01:16 314

原创 基于 AQS 和 StringRedisTemplate 的 Redis 分布式可重入独占锁实现

重点在于:如果一台机器中没有线程获取到锁,那么它就应该不断的自旋拿锁,避免无限等待使用守护线程周期性的给锁续命,避免持有锁的线程down机后发生死锁问题public class RedisReentrantLock implements Lock { private final Sync sync; public RedisReentrantLock(StringRedisTemplate stringRedisTemplate, String key) { sy

2021-04-21 12:09:34 442 1

原创 synchronized 关键字原理

OS 有哪些方法来完成同步:互斥量 pthread_mutex_t:重量锁,拿不到锁就 sleep,会进入内核态synchronized 使用了 mutex自旋锁 pthread_spin_t:OS 空转信号量 semsynchronized 字节码原理:monitorenter monitorexit,会在异常表处理异常,保证调用monitorexit 退出临界区,并调用 athorw 抛出异常。对象头对象布局:对象头Mark Word:64 bit类型指针 klass

2021-04-08 10:26:35 275

原创 JNI

package org.jxch.study;public class Demo { static { System.loadLibrary("DemoNative"); } private native void demo(); // 回调 Java 方法 private void callback() { System.out.println("callback"); }}编译头文件 javac

2021-04-07 18:46:09 189

原创 Java 线程实现原理

Linux 操作系统中创建线程的方式int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);参数名参数定义参数解释pthread_t *thread传出参数,调用之后会传出被创建线程的idconst pthread_attr_t *attr线程属性一般传 NULL,

2021-04-07 18:21:00 343

原创 JVM 常用参数

JVM 参数类型:标准: -开头,所有的 HotSpot 都支持非标准:-X 开头,特定版本 HotSpot 支持特定命令,不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化。高级选项:-XX 开头,这些是开发人员选项,用于调整 Java HotSpot 虚拟机操作的特定区域,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数的特权访问。也不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化。可以使用 java -XX:+PrintFlagsFinal –version

2021-04-07 16:21:13 288 1

原创 JVM JIT

Java 程序在运行的时候,主要就是执行字节码指令,一般这些指令会按照顺序解释执行,这种就是解释执行。那些被频繁调用的代码,比如调用次数很高或者在 for 循环里的那些代码,如果按照解释执行,效率是非常低的。这些代码称为热点代码。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。完成这个任务的编译器,就称为即时编译器(Just In Time Compiler),简称 JIT 编译器。在 HotSpot 虚拟机中,内置了两个 JIT,分别为 C

2021-04-07 15:25:16 364

原创 JVM 调优

优化策略内存优化策略高并发业务场景下,应增加新生代的大小Minor GC 时间 = T1(扫描新生代)+ T2(复制存活对象)在 JVM 中,复制对象的成本要远高于扫描成本。如果在堆内存中存在较多的长期存活的对象,此时增加年轻代空间,反而会增加 Minor GC 的时间。如果堆中的短期对象很多,那么扩容新生代,单次 Minor GC 时间不会显著增加。因此,单次 Minor GC 时间更多取决于 GC 后存活对象的数量,而非 Eden 区的大小。新生代大小选择响应时间优先的应用:尽可能设大

2021-04-07 14:25:36 257

原创 JVM 调优工具

JDK 命令行工具命令作用参数备注jps列出当前机器上正在运行的虚拟机进程,jps 从操作系统的临时目录上去找(所以有一些信息可能显示不全)-q : 仅仅显示进程,-m: 输出主函数传入的参数-l: 输出应用程序主类完整 package 名称或 jar 完整名称.-v: 列出 jvm 参数jstat监视虚拟机各种运行状态信息,可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据jstat-gc 13616 250 10每 250 ms 查询

2021-04-07 09:33:44 377 2

原创 JVM 泛型语法糖

常用参数名称:符号作用E元素,主要由 Java 集合(Collections)框架使用K键,主要用于表示映射中的键的参数类型V值,主要用于表示映射中的值的参数类型N数字,主要用于表示数字T S U V通用型参数JVM 实现原理泛型擦除Java 语言中的泛型,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的 Java 语言来说,A

2021-04-06 16:57:47 227

原创 JVM 方法调用的底层实现

方法调用的字节码指令:字节码指令作用invokestatic调用静态方法invokespecial调用私有实例方法、构造器及 super 关键字等invokevirtual调用非私有实例方法,比如 public 和 protectedinvokeinterface和上面这条指令类似,不过作用于接口类invokedynamic调用动态方法非虚方法(静态绑定)在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。invokestatic静

2021-04-06 16:04:55 250

原创 JVM 类加载

类的生命周期加载(Loading)交给虚拟机的具体实现来自由把控,大多数都是懒加载没有指定一定得从某个 class 文件中获取通过一个类的全限定名来获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口什么时候需要开始类第一个阶段“加载”,虚拟机规范没有强制约束,这点交给虚拟机的具体实现来自由把控。JVM 虚拟机的实现都是使用的懒加载。注意:比如“通过

2021-04-06 10:42:21 191

原创 JVM 字节码指令

字节码指令属于方法表中的内容。Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于限制了 Java 虚拟机操作码的长度为一个字节(即0~255),这意味着指令集的操作码总数不可能超过 256 条。大多数的指令都包含了其操作所对应的数据类型信息。例如:iload 指令用于从局部变量表中加载 int 型的数据到操作数栈中,而 fload 指令加载的则是 float 类型的数据。大

2021-04-05 17:56:23 436

原创 Class 文件结构

反汇编:javap -c xxxx.class 使用 -v 可以多打印一些信息Java 技术能够一直保持非常好的向后兼容性,这点 Class 文件结构的稳定性功不可没。class 文件结构的内容,绝大部分在 JDK1.2 时代就已经定义好了。每次基本上只是在原有结构基础上新增内容、扩充功能,并未对定义的内容做修改。任何一个Class 文件都对应着唯一一个类或接口的定义信息,但反过来说,Class 文件实际上它并不一定以磁盘文件的形式存在(比如可以动态生成、或者直接送入类加载器中)。Class 文件是一组

2021-04-05 16:51:42 190 1

原创 JVM GC

垃圾回收机制分代回收理论新生代:绝大部分的对象都是朝生夕死老年代:熬过多次垃圾回收的对象就越难回收GC 分类新生代回收(Minor GC/Young GC)老年代回收(Major GC/Old GC)只有 CMS 垃圾回收器会有这个单独的回收老年代的行为Major GC 有说指是老年代,有说是做整个堆的收集整堆回收(Full GC):收集整个 Java 堆和方法区(注意包含方法区)STW (Stop The World)进行垃圾回收时,必须暂停所有的工作线程,直到它回收结

2021-04-05 14:49:56 267

原创 Java 发展史

历史大事年份事件1995/5/23Sun 公司正式发布了 Java 语言和 HotJava 浏览器1996/1Sun 公司发布了 Java 的第一个开发工具包(JDK 1.0)1996/410 个最主要的操作系统供应商申明将在其产品中嵌入 Java 技术1996/9大约 8.3 万个网页用了 Java 技术来制作,这就是早年的互联网,即 Java Applet1996/10Sun 公司发布了 Java 平台第一个即时编译器(JIT)1997/2/

2021-04-04 23:42:32 367

原创 JVM 简介

JVM 的两大特性:跨平台性跨语言性:只识别 class 文件JVM、JRE、JDK 的关系:常见的 JVM 实现:JVMHotspot目前使用的最多的 Java 虚拟机Jrocket原属 BEA 公司,曾号称世界上最快的 JVM,后被 Oracle 公司收购,合并于 HotspotJ9主要是用在 IBM 产品LiquidVM针对硬件的虚拟机TaobaoVMHotspot 的定制版,专门为淘宝准备的,阿里、天猫都是用的这款虚拟机zi

2021-04-04 23:13:43 198

原创 JVM 内存和对象分配

内存模型方法区(Method Area)假如两个线程都试图访问方法区中的同一个类信息,而这个类还没有装入 JVM,那么此时就只允许一个线程去加载它,另一个线程必须等待。方法区是 JVM 对内存的”逻辑划分”,在 HotSpot 虚拟机中:JDK1.7 及之前 ,使用永久代; JDK1.8 及以后使用元空间。JDK1.7 中将永久代的静态变量和运行时常量池转移到了堆中,其余部分则存储在非堆内存中JDK1.8 用元空间(class metadata)代替了之前的永久代,并且存储位置是本地内存,大小只

2021-04-04 22:47:19 308

原创 JDK15 —— AQS 源码

使用方法通用 API独占式获取accquireacquireInterruptiblytryAcquireNanos共享式获取acquireSharedacquireSharedInterruptiblytryAcquireSharedNanos独占式释放锁release共享式释放锁releaseShared需要子类覆盖的流程方法独占式获取 tryAcquire共享式获取 tryAcquireShared独占式释放 tryRe

2021-04-03 22:21:53 230

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除