自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

姜希成的博客

实用为先,原理在后。实用之道,在于至简;原理之道,在于至深。

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

原创 新版IDEA频繁卡顿(UI 冻结)解决方案

因为IDEA是Java写的,卡顿自然就是因为频繁Full GC导致的,新版IDEA使用了G1垃圾回收器,因此可以通过适当调高期望STW时间和内存分配空间来进行JVM调优。自定义VM选项进行JVM调优来解决新版IDEA频繁卡顿(开启多项目或大项目或多环境时)的问题

2024-04-24 07:36:42 104 2

原创 解决edge浏览器bing无法使用的问题

bing和Google是我非常喜欢的两个搜索引擎,国内的话有时候bing的搜索结果更令人满意,所以我还是不愿意放弃bing的。打开edge浏览器设置隐私、搜索和服务下拉找到“安全性”点击“请选择服务提供商”选择“cleanbrowsing”重启浏览器(活清理浏览器缓存)...

2021-12-19 03:08:19 21823 2

原创 win11 搜索框无法输入文字

打开注册表 regedit删除文件夹:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderTypes\{ef87b4cb-f2ce-4785-8658-4ca6c63e38c6}\TopViews\{00000000-0000-0000-0000-000000000000}删除文件夹:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\Cu.

2021-11-11 16:17:47 2000 1

原创 Stream 数据切片

List<String> symbols = ... int step = 100; // 按100切片 List<List<String>> symbolsList = Stream.iterate(0, n -> n + 1) .limit((symbols.size() + step - 1) / step) .parallel() ...

2021-05-11 18:37:53 424

原创 Java系列核心知识体系

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

2021-04-24 09:01:16 219

原创 基于 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 320 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 157

原创 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 92

原创 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 224

原创 JVM 常用参数

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

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

原创 JVM JIT

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

2021-04-07 15:25:16 179

原创 JVM 调优

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

2021-04-07 14:25:36 144

原创 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 240 2

原创 JVM 泛型语法糖

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

2021-04-06 16:57:47 112

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

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

2021-04-06 16:04:55 142

原创 JVM 类加载

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

2021-04-06 10:42:21 96

原创 JVM 字节码指令

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

2021-04-05 17:56:23 144

原创 Class 文件结构

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

2021-04-05 16:51:42 107 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 159

原创 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 265

原创 JVM 简介

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

2021-04-04 23:13:43 87

原创 JVM 内存和对象分配

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

2021-04-04 22:47:19 203

原创 JDK15 —— AQS 源码

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

2021-04-03 22:21:53 160

原创 git 报错 fatal: refusing to merge unrelated histories

致命: 拒绝合并不相关的历史。这是因为两个分支没有取得关系。在操作命令后面加上--allow-unrelated-histories比如:git pull origin master --allow-unrelated-histories

2020-12-16 10:18:13 74 1

原创 pom 文件修改 java 版本

<properties> <maven.compiler.source>15</maven.compiler.source> <maven.compiler.target>15</maven.compiler.target> </properties>如果是 spring boot项目可以直接这样配置: <properties> <java.v...

2020-12-15 10:09:54 1235

原创 Java 获取运行时项目文件在系统中的路径

// 获取项目运行时, org.example 包在系统中的路径。 String package = "org.example"; URL url = this.getClass().getClassLoader().getResource("/" + package.replaceAll("\\.", "/"));

2020-12-15 09:54:31 1033

原创 Java class 类通过反射实例化对象

Class#newInstance方法已经被弃用了,从注释中可以看到推荐使用Constructor#newInstance方法生成实例,即直接通过构造方法生成实例:// getConstructor 方法有可变长参数列表,入参是构造方法的入参类型,这里使用无参构造Object instance = clazz.getConstructor().newInstance();使用 getDeclaredConstructor方法还可获得 private的构造方法。注释中弃用的理由:@deprecat

2020-12-15 09:31:17 581 1

原创 Windows 下 npm 安装的软件包,在 cmd 中找不到

npm 安装了软件包,执行的时候却提示不存在。一般是没有添加环境变量的问题。添加环境变量:C:\Users\jxch\AppData\Roaming\npm

2020-12-14 22:17:03 1420

原创 安装 TypeScript 并运行 ts 文件

安装 typescriptnpm install typescript -gyarn global add typescript使用:# 使用 tsc 命令转成 js 文件tsc demo.tsnode demo.js直接运行ts文件可以使用ts-node安装ts-nodenpm install ts-node -g使用:ts-node demo.ts

2020-12-14 22:09:45 996

原创 Vite 对 ts、css、sass、jsx的支持

安装SASS:yarn add -D sass<script lang="ts">// import css 文件就直接生效 import data from './data.json' // json文件支持热更新 </script><style lang="scss"> </style>DemoJSX.jsxfunction DemoJSX() { return ( <div> <h1&

2020-12-14 21:43:05 8365

原创 Vite 配置文件的别名设置

vite.config.jsconst {resolve} = require('path')export default { alias: { '/@/': resolve(__dirname, 'src') }}使用:import HelloWorld from '/@/components/HelloWorld.vue'修改配置文件要重启。

2020-12-14 21:37:17 13621 2

原创 Vite安装

Vite 特性按需编译,不会刷新全部DOM开发中热更新冷服务启动。不打包,使用 ES6 import。使用npm新建项目:npm init vite-app demo# 进入demo文件夹npm installnpm run dev使用yarn新建项目:yarn create vite-app demo安装yarn:npm install -g yarn...

2020-12-14 20:37:22 9826

原创 SpringMVC——Servlet3.0异步处理

开启异步:asyncSupported=true@WebServlet(value="/path", asyncSupported=true)public class AsyncServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 主线程只负责开启副线程

2020-12-14 19:28:57 220

原创 SpringMVC——Servlet3.0

WEB三大组件:servlet、filter、listener。以前经常在web.xml配置使用。servlet: @WebServletServletContainerInitializer——初始化web容器在web容器启动时为提供给第三方组件机会做一些初始化的工作。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services目录创建一个名为javax.servlet.ServletContainerInitializer的文件,

2020-12-14 18:47:45 263

原创 IOC原理——初始化bean

初始化bean在IOC初始化时的执行时机见《IOC原理——非懒加载的单实例bean》,直接在文章中搜索initializeBean,锁定位置。AbstractAutowireCapableBeanFactory#initializeBean protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityManager() !

2020-12-14 01:55:53 194

原创 IOC原理——创建非懒加载的单实例bean

文章目录```AbstractApplicationContext#finishBeanFactoryInitialization```——入口```doGetBean```——获取单个bean1. ```DefaultSingletonBeanRegistry#getSingleton```——获取缓存中的实例 bean(```singletonObjects```map 中)2. ```markBeanAsCreated```——标记当前bean已经被创建执行时机是AbstractApplicati

2020-12-14 01:37:30 216

原创 IOC原理——refresh主流程

以AnnotationConfigApplicationContext为例 public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this(); register(componentClasses); refresh(); }AbstractApplicationContext#refresh public void refresh() throws BeansException

2020-12-06 11:27:30 264

原创 BeanFactoryPostProcessor & BeanDefinitionRegistryPostProcessor——执行时机

BeanFactoryPostProcessor@FunctionalInterfacepublic interface BeanFactoryPostProcessor { void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;}执行时机:抽象的来看就是 BeanFactory加载完Bean定义后,实例化Bean之前执行。从代码角度就是AbstractApp

2020-12-05 16:34:14 407 2

原创 声明式事务原理——2. 方法调用流程

TransactionInterceptor继承了MethodInterceptor接口,所以执行事务方法时会调用invoke方法。TransactionInterceptor#invoke public Object invoke(final MethodInvocation invocation) throws Throwable { Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTarget

2020-12-05 13:31:08 301

原创 声明式事务原理——1. @EnableTransactionManagement

@EnableTransactionManagement可以看出这个注解的主要作用是导入TransactionManagementConfigurationSelector@Import(TransactionManagementConfigurationSelector.class)public @interface EnableTransactionManagement { boolean proxyTargetClass() default false; AdviceMode mode()

2020-12-05 13:01:25 2781 1

空空如也

空空如也

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

TA关注的人

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