java
liangdu_Zuker
这个作者很懒,什么都没留下…
展开
-
ChatGPT 探讨内存屏障的意内存
也就说, asm volatile (“mfence” ::: “memory”);这条内存读写屏障,之所以难以理解,是因为他把两种场景用到的两条指令合并成一条指令,从而导致晦涩难懂。单独理解或就简单很多了。首先,我们知道对于共享变量,线程用的内存包括,本地内存,主内存。如果,希望数据马上写穿 write through 到主内存,则写完之后执行如果,希望数据重新到主内存读取最新值,则读之前执行如果又是读,又是写即,等价于。原创 2023-05-06 17:02:30 · 2061 阅读 · 0 评论 -
Netty线程池中的位运算
位运算取余数要求 ** 除数最好是 2的n次方 ** ( 9 % 4 = 1, 4 就是除数, 1是余数)具体可以参考: https://blog.csdn.net/lonyw/article/details/80519652。位运算取余数公式为 val & (n - 1) 等于 val % n (n是被除数,val是被除数)调度器从任务队列拿到任务后,就会从线程组中选择执行任务的线程。Netty线程池由 3 部分组成,任务队列和线程组、调度器。调度器分配任务的最常用的算法是。.原创 2022-08-06 14:12:25 · 117 阅读 · 0 评论 -
一图看懂Spring事务传播的本质
可能有点标题党,当可以作为一种思路。总所周知,Spring事务传播有7种方式,我们经常会苦于记忆和理解。这是因为我们不理解他的本质,如下图:同一个线程里关于事务的上下文会记录着当前线程拥有的MySQL Client socket,每一个Socket只存在一个当前事务(后面会提到为什么)事务的传播行为本质上是,当前service方法根据当先线程上下文是否存在事务,以此决定后续针对事务后续操作的行为。最常见的行为,就是根据当前线程事务上下文决定是否创建新事务(如果有则,不做任务操作,等于跟当前线程的父方原创 2022-08-06 13:56:21 · 268 阅读 · 0 评论 -
记一次日志文件IO系统的设计心得
记一次日志文件IO系统的设计心得bytebuffer的使用心得。bytebuffer 的本质上还是缓存,我们可以认为他是比较物理层的概念,比如我们如果没有做好映射访问的规划,或者文件索引没有设计好,就容易导致创建很多文件句柄,最终容易引发操作系统的inode耗光。所以想要学会bytebuffer的重点在于掌握好Position和capacity的使用技巧。其次,就是做好文件索引和映射范围控制,常见的手法就是将文件分段segment,然后对段做索引管理。当然你可以通过控制业务范围和文件回收策略以及后原创 2020-12-03 14:22:24 · 185 阅读 · 0 评论 -
线程池实践经验总结
线程池的使用技巧线程池常用的两种场景:【分治】可以将任务利用分治的思想分割成多个任务,然后再利用线程池控制CPU并发的线程数量。【限制任务执行时间】线程池的超时机制的妙用,可以利用Future超时机制,帮我们实现超时的功能。什么是callable,什么是runnable,什么是ForkJoin,什么是Future,什么是FutureTaskcallable是一个接口,它允许我们传递返回值给线程执行的上下文。通俗的说,就是给了我们一个读取线程的结果。这个结果通过Future进行封装,Futur原创 2020-10-16 11:13:27 · 204 阅读 · 0 评论 -
Spring事件通知总结
Spring事件通知总结参考:https://blog.csdn.net/likun557/article/details/106045522?utm_medium=distribute.pc_feed.none-task-blog-alirecmd-11.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-alirecmd-11.nonecase&request_id=可以介绍一下为什么需要使用事件么?答:系统解原创 2020-06-30 20:17:31 · 326 阅读 · 0 评论 -
JVM内存溢出实战和总结(采用VisualVM工具)
JVM内存溢出实战和总结一、通用技巧某一天任务进程突然不工作了。查看日志,是昨晚10点就停止作业了。查看进程状态,还活着。查看jstack,没有死锁,还有进程在跑着。sudo ps -ef | grep javasudo jstack 进程号怀疑内存溢出,准备dump内存镜像,先往上翻一下日志,grep memory 。找到了关键日志Out of Memory。导出日志的命令:jmap -dump:live,format=b,file=/tmp/业务名称-201909021657原创 2020-06-20 18:33:51 · 1138 阅读 · 0 评论 -
JDBC如何实现线程安全以及和连接池的关系
双亲委派模型,加载DriverManger时需要扫描所有Driver实现类,会找不到Driver实现类,此时基于SPI原理会从线程上下中拿到AppClassloader,然后从appclassloader中获取driver实现类,封装成driverInfo,加入registry到DriverManager.这些实现需要SPI接口和service声明文件的支持。如果不希望破坏双亲委派模型,则需要用class.forname先主动加载驱动类,然后加载drivermanager,再将driver注册..原创 2020-06-01 10:31:02 · 906 阅读 · 1 评论 -
JVM线程模型与操作系统厂商的关系
jvm线程仍然可以自行控制调度算法(hotspot在非solaris放弃了这种骚操作,直接让一个jvm线程对应一个os线程,成为1vs1模型)。也就说,有些jvm厂商自己实现线程调度算法,在os线程的基础上又做了一层封装。从而实现多个线程在一个os线程内并发,或者多个线程在n个线程内并发。你可以理解为jvm厂商真把jvm当成是计算机操作系统来做了。按照jvm的规范,jvm线程是操作系统级...原创 2020-05-08 10:16:51 · 282 阅读 · 0 评论 -
从什么是althashing开始解读java的HashMap
从什么是althashing开始解读java的HashMap本文不包含一行代码,你可以读完,回头再去看代码,或者你一边看着源码,一边品味也可以。建议看完再重看一边源代码。写在前面本文的目的是搞懂Map的设计思想,HashMap的实现原理。capacity, thresholder, loadFactor究竟是什么奇淫巧计。所谓的rehash,是业界在扯淡还是真有其事?被众...原创 2020-03-26 21:16:02 · 300 阅读 · 0 评论 -
对晦涩的maven scope含义理解心得
对晦涩的maven scope含义理解心得maven提供了5种scope(范围)的定义,从字面上很难去明白其用处。首先所谓的【scope】是用来标注被dependency的包的作用域的。要搞清楚“什么是scope”前,我们需要掌握两个概念:第一,1个项目存在哪些方面受到scope影响(比如运行时,编译时,测试编译时,测试运行时…)。第二,就是有哪些scope的声明(共有5个)。小提示:被依...原创 2020-01-20 12:02:31 · 274 阅读 · 0 评论 -
Spring异常处理框架
Spring异常处理框架初识底层接口类HandlerExceptionResolverHandlerExceptionResolver 是一个处理 Web 程序发生异常时的接口,当异常发生时,需要进行捕获并返回一个友好的ModelAndView给请求用户,可以通过继承AbstractHandlerExceptionResolver来实现。这个接口返回 null 表示让其他异常处理器进行处理,...原创 2019-12-26 11:26:40 · 543 阅读 · 0 评论 -
Java异常最佳实践笔记
Java异常最佳实践笔记引用《如何善用Java异常》https://juejin.im/post/5bacd8975188255c69780e7b笔记Java中的异常分为两种:无法捕获处理的系统级别Error.可以被认为处理的检测异常Exception.重点是他们都继承了Throwable接口其中需要我们处理的只有Exception的子类。Exception的子类...原创 2019-12-26 11:24:39 · 273 阅读 · 0 评论 -
编写自己的Spring-Boot的starter
编写自己的Spring-Boot的statrter部分内容引用来源声明: 飞污熊博客 https://www.xncoding.com/2017/07/22/spring/sb-starter.html【概念理解】starter是一种服务——使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息, 由Spring Boot自动通过classpath路径下...原创 2019-11-29 11:00:54 · 190 阅读 · 0 评论 -
git分支管理规范
git分支管理规范公司团队特点:以下特点是有部分是假设性,部分是实际的:一个功能的开发大概在1到3人,或者4到5人之间。大部分人对git的熟练程度不高,缺少Git分支管理知识培训或者不希望在Git分支管理上花费太多时间培训。弱化Git分支管理标准的作用,以灵活应对各种需求。(减少规范而引发纷争从而影响开发进度,毕竟Git是很强大的工具,依赖工具,而不依赖文字约定)需要提供几种场景的G...原创 2019-10-18 21:00:27 · 160 阅读 · 0 评论 -
java知识目录
java知识目录- ~~java内存模型~~- ~~java对象的类加载到对象内存分配以及阶段的初始化过~~- ~~强引用,弱引用,软引用,虚引用~~- ~~新生代的垃圾回收过程~~- ~~新生代对象晋升老年代失败的过程~~- ~~老年代的垃圾回收过程~~- ~~新生代晋升老年的过程~~- ~~JVM虚拟机性能调优方法(编译优化,运行时优化等理论)~~- ~~volatile关键...原创 2019-02-13 16:50:00 · 124 阅读 · 0 评论 -
【学习JVM】程序编译与代码优化(语法糖)
程序编译与代码优化(语法糖)需要参考的准备数据:《深入理解JAVA虚拟机》需要参考的知识点:字节码结构javac编译器泛型编程装箱和拆箱注解JIT即时编译器类加载过程知识的记录方式: - 查看博客,把没有遇见过的或者觉得比较经典的博文段落摘录 - 自己的理解以条目的形式展示 - 知识误解标记 - 知识盲区标记 - JAVA内存模型这个知识点基本上每本书都会讲解,...原创 2019-02-13 16:53:28 · 295 阅读 · 0 评论 -
Oracle官方文档笔记《Getting Started with the G1 Garbage Collector》
Oracle官方文档笔记《Getting Started with the G1 Garbage Collector》参考资料【Oracle官方文档】https://www.oracle.com/technetwork/tutorials/tutorials-1876574.htmlhttps://docs.oracle.com/javase/8/docs/technotes/guides...原创 2019-02-13 16:53:04 · 790 阅读 · 0 评论 -
JAVA BIO
新生代的垃圾回收过程需要参考的准备数据:《JAVA程序设计》-朱庆生、古评主编需要参考的知识点:字节与字符的概念操作系统文件系统原理JAVA内存以及磁盘读写Java File类笔记:操作系统的对磁盘的最小操作单位是文件,每一个文件在磁盘中都是以字节的形式存在。Java IO需要涉及两个问题:“数据存储格式”和“数据的传输方式”。为了解决IO的数据存储和传输这两个问题,Ja...原创 2019-02-13 16:52:43 · 428 阅读 · 0 评论 -
【学习JVM】JVM并发同步机制
JVM并发同步机制需要参考的准备数据:《深入理解JAVA虚拟机》需要参考的知识点:volatile原理unsafe.compareandswap原理多线程amdahl定律(在Cpu个数很大的情况下,可并行解决的子问题越多阿姆达尔值越大)final可见性原理amdahl = (Ws + Wp)/(Ws + Wp/n)知识的记录方式: - 查看博客,把没有遇见过的或者觉...原创 2019-02-13 16:52:17 · 316 阅读 · 0 评论 -
【学习JVM】JAVA并发工具
JVM并发同步机制需要参考的准备数据:《深入理解JAVA虚拟机》《java并发编程的艺术》需要参考的知识点:JVM并发同步机制重要笔记:Reentrantlock基于AQS实现。AQS基于Volatile与CAS实现,在unlock修改volatile变量时不存在多线程访问(unlock在临界区内),所以不需要CAS指令。CAS的底层通过操作系统的cmpxchg指令实现...原创 2019-02-13 16:51:44 · 245 阅读 · 0 评论 -
【学习JVM】java内存模型
以本例为开篇一遍研究如何学习,一遍把他学好需要参考的准备数据:《Java程序性能优化》《深入理解JAVA虚拟机》《Java并发编程的艺术》需要参考的知识点:操作系统-CPU缓存技术jdk5之前版本相比的改动:增强了volatile和final知识的记录方式: - 查看博客,把没有遇见过的或者觉得比较经典的博文段落摘录 - 自己的理解以条目的形式展示 - 知识误解标记 -...原创 2019-02-13 16:51:12 · 196 阅读 · 0 评论 -
【学习JVM】内存垃圾回收与调优
新生代的垃圾回收过程需要参考的准备数据:《深入理解JAVA虚拟机》《Oracle技术网/java/G1 GC调优》需要参考的知识点:字节码结构java内存区域对象的引用理论上的GC算法和实际落地的GC收集器知识的记录方式: - 查看博客,把没有遇见过的或者觉得比较经典的博文段落摘录 - 自己的理解以条目的形式展示 - 知识误解标记 - 知识盲区标记 - JAVA内存...原创 2019-02-13 16:50:37 · 737 阅读 · 0 评论 -
【学习JVM】强引用,弱引用,软引用,虚引用
强引用,弱引用,软引用,虚引用需要参考的准备数据:《深入理解JAVA虚拟机》需要参考的知识点:GC Roots引用计数器引用的定义对象的引用finalize执行时机知识的记录方式: - 查看博客,把没有遇见过的或者觉得比较经典的博文段落摘录 - 自己的理解以条目的形式展示 - 知识误解标记 - 知识盲区标记 - JAVA内存模型这个知识点基本上每本书都会讲解,最好的...原创 2019-02-13 16:54:52 · 344 阅读 · 0 评论 -
【学习JVM】java对象的类加载到对象内存分配以及阶段的初始化过程
以本例为开篇一遍研究如何学习,一遍把他学好需要参考的准备数据:《深入理解JAVA虚拟机》《Java并发编程的艺术》需要参考的知识点:字节码结构jdk8 matespace的特定知识的记录方式: - 查看博客,把没有遇见过的或者觉得比较经典的博文段落摘录 - 自己的理解以条目的形式展示 - 知识误解标记 - 知识盲区标记 - JAVA内存模型这个知识点基本上每本书都会讲解...原创 2019-02-13 16:55:24 · 1940 阅读 · 4 评论 -
【学习JVM】happens-before规则
happens-before规则程序顺序原则,即在一个线程内必须保证语义串行性,也就是说按照代码顺序执行。锁规则 解锁(unlock)操作必然发生在后续的同一个锁的加锁(lock)之前,也就是说,如果对于一个锁解锁后,再加锁,那么加锁的动作必须在解锁动作之后(同一个锁)。volatile规则 volatile变量的写,先发生于读,这保证了volatile变量的可见性,简单的理解就...原创 2019-02-14 14:31:01 · 310 阅读 · 0 评论 -
异常语法的执行分析
try{ // do something}catch ( NullPointerException ) { // 捕获到空指针异常才会被执行}finally { // 不管怎样都会被执行}System.out.println( " 程序无异常 或 异常被捕捉的情况下才会被执行 !" ); 说明:原创 2016-10-10 19:01:56 · 294 阅读 · 0 评论 -
InheritableThreadLocal与阿里的TransmittableThreadLocal设计思路解析
前言参考文章:《全链路跟踪(压测)必备基础组件之线程上下文“三剑客”》-- 原创: 丁威 中间件兴趣圈https://mp.weixin.qq.com/s/a6IGrOtn1mi0r05355L5Ng《阿里巴巴Transmittable ThreadLocal(TTL) github》https://github.com/alibaba/transmittable-thread-loc...原创 2019-08-15 17:48:48 · 7990 阅读 · 3 评论 -
测试Btrace笔记
测试Btrace笔记- 编写.java文件 NumberUtil.java javac NumberUtil.java 编译class Number.class java NumberUtil 执行class文件。- 打开visualVm检测jvm进程- 根据你当前的Jdk版本选择对应的visualVm,根据的visualvm版本选择正确的插件,在安装btrace有关的...原创 2019-06-19 10:52:45 · 322 阅读 · 0 评论 -
什么是MBean?什么是JMX架构?
# 什么是MBean- MBean就是一种规范的JavaBean,通过集成和实现一套标准的Bean接口,这种叫MBean,Mbean注册到MBeanServer中。之后将被MBeanServer中注册过的Adapter(比如渲染为HTML的HtmlAdapter)渲染为直观的页面将MBean的属性和方法展示给用户。MBean -> MBeanServer -> HtmlAda...原创 2019-06-19 10:40:04 · 12853 阅读 · 2 评论 -
-XX:SoftRefLRUPolicyMSPerMB从名字看不出什么意思?【官文解读】
虚拟机参数:SoftRefLRUPolicyMSPerMB-XX:SoftRefLRUPolicyMSPerMB从名字看不出什么意思?【官文解读】SoftRefLRUPolicyMSPerMB 该参数得官方解释:What determines when softly referenced objects are flushed?Starting with 1.3.1, sof...原创 2019-05-17 11:02:33 · 10752 阅读 · 2 评论 -
为什么List,set,map 不继承Serializable接口
为什么List,set,map 不继承Serializable接口?猜测:应该是默认不继承,但实际上可以继承只要是object都可以实现这个接口只是默认不这样干,有三个可能:一、是不知道怎么实现默认接口,二、不允许实现默认接口,三、暂时没有实现方案。解释:假如是情况一,不知道怎么实现,可以理解为对集合的元素类型有依赖,这种单向依赖导致在不明确元素类型的情况下无法实现默...原创 2019-05-08 10:49:07 · 1728 阅读 · 0 评论 -
【学习JVM】内存屏障(Memory Barrier )
内存屏障(Memory Barrier )上面讲到了,通过内存屏障可以禁止特定类型处理器的重排序,从而让程序按我们预想的流程去执行。内存屏障,又称内存栅栏,是一个CPU指令,基本上它是一条这样的指令:保证特定操作的执行顺序。影响某些数据(或则是某条指令的执行结果)的内存可见性。编译器和CPU能够重排序指令,保证最终相同的结果,尝试优化性能。插入一条Memory Barrier会告诉编译...原创 2019-02-14 14:32:09 · 719 阅读 · 0 评论 -
volatile的指令重排细节
volatile禁止重排优化volatile关键字另一个作用就是禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象,关于指令重排优化前面已详细分析过,这里主要简单说明一下volatile是如何实现禁止指令重排优化的。先了解一个概念,内存屏障(Memory Barrier)。内存屏障,又称内存栅栏,是一个CPU指令,它的作用有两个,一是保证特定操作的执行顺序,二是保证某些变量的内存可见...转载 2019-02-14 14:31:47 · 1838 阅读 · 1 评论 -
ThreadLocal的技术考查点
如果防止本地线程的变量被其他线程修改?我们的想法就是一个线程创建一个实例对象,但是这样会引起几个问题:什么时候创建?什么时候销毁?哪些线程需要创建?而ThreadLocal实现了“防止本地线程的变量被其他线程修改”,同时避免处理“什么时候创建?什么时候销毁?哪些线程需要创建?”的一系列问题。ThreadLocal是一个数据结构,是一个HashMap,每个线程在用到的时候会实例化。原创 2018-01-22 14:48:48 · 373 阅读 · 0 评论 -
聊聊3种内存溢出OOM(OutOfMemory)
内存溢出有2种,我们最熟悉的就是堆内存溢出异常,比如我们new一个对象或者数组,如果超出了JVM的heap内存最大限制就会爆出异常比如:从这句话我们可以知道,栈内存溢出有2种异常一种是:StackOverflowError、另一种是OutOfMemoryErrorStackOverflowError是指【线程】的栈内存原创 2017-09-19 10:17:49 · 1502 阅读 · 0 评论 -
对JAVA强引用、软引用、弱引用、虚引用的理解
强引用:有引用不清除软引用:这货是坑爹的,耦合了JVM内存机制,在JVM内存充足的情况下跟强引用一样弱引用:这家伙比较懦弱,如果该对象只剩下弱引用,他就会被清除,应用场景没听过,大冷门。虚引用:感觉这货就是设计来做缓存用的,因为他需要配合容器使用,只要容器被内存回收,他就必须要被回收。如果你用强引用做缓存的话,你回收容器的时候要先释放强引用,否则会内存泄漏。参考:htt原创 2017-08-25 17:29:08 · 222 阅读 · 0 评论 -
Java高级软件工程师面试考纲
Java高级软件工程师面试考纲 2-21 13:16查看2445回复47当前,市面上有《Java XX宝典》类似的图书,而且图书中的内容都着重在讲解Java最为基础的部分,最严重的是,里面有着大量错误的内容,极具误导性。另外,网上也有各种各样的Java面试题, 很多也是着重在Java语言基础上。实际上,如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构、算转载 2016-10-29 19:40:38 · 518 阅读 · 0 评论 -
jvm中堆栈、常量区
栈空间用来存放,函数调用,引用变量 。堆空间用来存放new出来的变量常量区用来存放静态函数和静态变量,以及基本常量。常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间。本文只从java使用者的角度来探讨java常量池技术,并不涉及常量池的原理及实现方法。个人认为,如果是真的专注java,就必须对这些细节方面有一定的了解。但知道它的原理和具体的实现方法则不是必须的。在虚拟机的生原创 2016-10-29 19:24:14 · 825 阅读 · 0 评论 -
Java的SPI机制
SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介 绍。究其思想,其实是和"Callback"差不多。“Callback”的思想是在我们调用API的时候,我们可以自己写一段逻辑代码,传入到API里 面,API内部在合适的时候会调用它,从而实现某种程度的“定制原创 2016-10-12 19:34:55 · 208 阅读 · 0 评论