Java
文章平均质量分 63
milo.qu
这个作者很懒,什么都没留下…
展开
-
JVM-字节码应用
classReader.accept方法的第一个参数是classVisitor,即上面定义的classVisitor, 第二个ClassReader.SKIP_DEBUG,操作的时候,哪些信息不看,这里是跳过debug信息,一般来说设置忽略debug信息就可以了。用CoreAPI解析和TreeAPI都能做字节码解析,区别,TreeAPI必须读取完整字节码信息,才能做解析。八、反射之二反射管理类信息案例实战。九、反射之三反射修改类信息案例实战。十、反射之四通过反射调用类方法实战。原创 2024-01-26 17:13:49 · 1259 阅读 · 0 评论 -
JVM-透彻理解字节码以及指令
每个线程在执行的时候,先看能不能抢到锁,不能抢到锁等到,抢到锁,执行monitorenter指令,代码执行完后,再执行monitorexit指令退出,其他线程继续抢锁,抢到后继续执行这2个指令,如此往复。调用动态方法(如lamdba、动态语音编译的字节码),会有至少两步,第一步,先将语法糖还原成invokedynamic指令,第二步再根据具体方法类型,调用具体指令。0000 0031 - Java版本号,这里的31是16进制大版本号,转换后十进制49,前面4个字节 是小版本,后面是大版本。原创 2024-01-18 18:49:58 · 1227 阅读 · 1 评论 -
JVM-JVM支持高并发底层原理精讲
当线程即使处于阻塞的时候,线程不再收到信号,线程也是可以收到一个异常,可以这个异常理解为一个信号,就像闹钟一样就会响,强制这个线程做出一定的响应,而这个异常就是这个子线程的那种,当调用线程终止方法,就会触发这个异常。当t1线程的x=b,从a=1代码的下面,移动到a=1代码的上面,且t2线程的y=a,从b=1代码的下面移动到b=1代码的上面,就会计算出x==0&&y==0,这种问题就是。这里为什么没有停止呢,这是因为当阻塞的时候,父线程只能给子线程发停止的信号,要不要停止子线程说了算。原创 2024-01-12 17:00:55 · 1094 阅读 · 0 评论 -
JVM-Arthas高效的监控工具
一、arthas介绍3.选择监控哪个进程4.进入具体进程二、arthas的基础命令与基本操作1.查询包含Java的系统属性:命令:sysprop |grep java1.查询不含Java的系统属性:命令:sysprop | grep -v java3.打印历史命令命令:history4.查看当前工作目录命令:pwd三、如何使用arthas监控线上服务的内存状态1.dashboard - 当前系统的实时数据面板命令:dashboard -i 100 100毫秒刷新一次。原创 2024-01-11 10:39:43 · 2437 阅读 · 1 评论 -
JVM-JVM基本工具与必会调试方式
命令:jmap -dump:live,format=b,file=test.hprof 45094。FGCT 从应用程序启动到采样时的 Full GC 的消耗时间(秒)YGC 从应用程序启动到采样时 Young GC 的次数。FGC 从应用程序启动到采样时 Full GC 的次数。如果启动的是jar,则会将jar的完整类名信息展示出来。GCT 从应用程序启动到采样时 GC 的总时间。如果启动的时候带有参数,还会将启动时的参数打印出来。四、堆分析的基本功-jmap和jhat工具。原创 2024-01-08 16:47:54 · 445 阅读 · 0 评论 -
JVM-透彻掌握ParNew垃圾回收器的原理与使用screenflow
【代码】JVM-透彻掌握ParNew垃圾回收器的原理与使用screenflow。原创 2024-01-08 11:29:59 · 392 阅读 · 0 评论 -
JVM-透彻掌握Parallel垃圾回收器的使用方法
在这种模式下,年轻代的⼤ ⼩、Eden和Survivor的⽐例、晋升⽼年代的对象年龄等参数会被⾃动调整,已达到在堆⼤⼩、吞吐量和停顿时间之 间的平衡点。在⼿动调优⽐较困难的场合,可以直接使⽤这种⾃适应的⽅式,仅指定虚拟机的最⼤堆、⽬标的吞吐量 (GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机⾃⼰完成调优⼯作。不管执⾏多少次,也不管每次执⾏多少时间,但是要在⼀定的时间范围⾥ ,尽可能让线程执⾏⽤户程序 ⾼吞吐量则可以⾼效率地利⽤CPU时间,尽快完成程序的运算任务。原创 2024-01-08 11:29:34 · 986 阅读 · 0 评论 -
亿级流量系统如何优化老年代ParNew_CMS?
情况1:比如,老年代此时可用空间80M < 历次YGC后升级老年代的平均对象大小100M,这样就会触发FullGC;情况2:移入老年代的对象大于,此时老年代的剩余空间,触发FullGC;情况3:被占用的老年代空间超过阈值,触发FullGC。原创 2024-01-05 09:27:30 · 320 阅读 · 0 评论 -
G1为什么更适合亿级流量系统以及YGC优化策略screenflow
之前讲过,在G1里新生代的占比是5%-60%,如果堆空间是8G,此时新生代占的空间就是400MB~4.7GB,如果一次回收完,就会非常耗时,可以通过设置回收最大停顿时间,减少服务的停顿,一次回收一部分,比如1.2G。1.ParNew执行回收的时候,STW会比较长,CMS存在碎片化的问题,当物理机的内存变大,这套组合存在的问题会更大,加大物理内存,反而让垃圾回收更慢。如果是视频、大数据、批处理等对象比较大的场景,我们可以将最大停顿时间调大一些,让垃圾回收频率降低,单次垃圾回收效果会更好。原创 2024-01-05 09:26:44 · 402 阅读 · 0 评论 -
JVM-【场景实战】熟悉Serial垃圾回收器的使用
这个收集器是⼀个单线程的收集器,但它的 “单线程” 的意义并不仅仅说明它只会使⽤⼀个 CPU 或⼀条收集线 程去完成垃圾收集⼯作,更重要的是在它进⾏垃圾收集时,必须暂停其他所有的⼯作线程,直到它收集结束 (Stop The World)Serial回收器的优势与设置参数优势:简单⽽⾼效(与其他收集器的单线程⽐),对于限定单个 CPU 的环境来说, Serial 收集器由于没有线程交互的开销,专⼼做垃圾收集⾃然可以获得最⾼的单线程收集效率。② 作为⽼年代 CMS 收集器的后备垃圾收集⽅案,原创 2024-01-04 09:30:21 · 430 阅读 · 0 评论 -
JVM-透彻理解GC日志的内容
⽼年代的总⼤⼩是10240K,未使⽤。这是因为 在新⽣代⾥的from和to是轮流使⽤的,⼀次只有⼀个发挥作⽤,相当于浪费了⼀个1M的空间,因此只有空间只有 8M的Eden区+1个1M的S区,⼀共是9M。] 这⾥表示的含义是在执⾏垃圾回收之前,年轻代被占⽤的空间 是8105K,完成垃圾回收之后占⽤的空间是378K,完成之后新⽣代的总空间⼤⼩是9216K,耗时0.0015472 secs。表示垃圾回收之前堆空间被占⽤的空间是8105K,回收之后被占⽤的是 378K,堆的总空间为19456K。原创 2024-01-04 09:29:37 · 1294 阅读 · 0 评论 -
JVM-【原理精讲】解密新生代垃圾回收器的工作原理
JVM-解密新生代垃圾回收器的工作原理原创 2024-01-03 09:20:53 · 382 阅读 · 0 评论 -
JVM-【原理精讲】图解垃圾清除算法的原理
JVM-垃圾清除算法的原理原创 2024-01-03 09:20:11 · 334 阅读 · 0 评论 -
JVM-【原理精讲】图解垃圾标记算法的原理
原创 2024-01-02 17:53:06 · 312 阅读 · 0 评论 -
JVM-从收拾房间看垃圾回收基本思想
JVM-垃圾回收器介绍原创 2024-01-02 17:43:52 · 337 阅读 · 0 评论 -
JVM-七步带你掌握JVM内存结构
这是JDK1.6的内存结构,JDK1.8以后方法区已经挪出来了,不属于JVM内存。一、从房屋户型图理解JVM的内存划分原理与基本结构介绍。二、第一步:掌握程序计数器的功能与工作过程。原创 2024-01-02 17:24:28 · 1369 阅读 · 0 评论 -
用了6年的 SpringBoot 项目部署方案,稳得一批!
都是由mvn中profiles的properties中提供,是可变的参数,脚本代码本身不需要人工去修改,只需要变的是mvn的参数即可;该节点中的节点是可作为参数传递给其他配置文件,如我这里的package-name节点值就可以在另外的assembly.xml或者shell脚本文件中通过${package-name}其实shell脚本中包含有解压命令,但是我在打包时放在了zip中,所以只能通过手动解压了,当然可以调整;把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等。转载 2023-12-29 17:18:59 · 36 阅读 · 0 评论 -
亿级流量场景下如何优化混合回收
当大对象超过region一半,就会将其放到大对象region里边去,占用老年代空间,当有大量短周期大对象进入老年代,也会提高混合回收的频率,进而影响到FullGC的频率。我们完全可以通过最大停顿时间的调整,来控制每次垃圾回收的region数量以及回收垃圾大小。关于G1的优化,最重要的两点1.调整最大停顿时间、2.调整region大小。2.优化G1垃圾回收关键的一点,设置合理的最大停顿时间。1.是已分配内存占总内存的超过45%阈值;原创 2023-12-28 09:57:43 · 345 阅读 · 0 评论 -
亿级系统设置年轻代(ParNew+CMS)
秒杀场景,ParNew+CMS优化设置原创 2023-12-27 22:25:36 · 347 阅读 · 0 评论 -
JVM基础原理篇-带你深入拆解G1垃圾回收原理
动态调整新生代区域region的数量 - 在G1里,在执行YGC的时候,新生代的数量是可以动态变化的,一般什么都不设置的情况下,Eden区占比例在5%~60%之间(调整的原因,是根据每次执行垃圾回收后,根据当前的情况判断增加region数量,每增加一个region数量,Eden区就会增加一个,如果没有必要,Eden数量太多,导致回收时间太长,这时JVM就会减少Eden区数量)。1.混合回收前面为什么会有一次YGC呢,前面讲了混合回收的触发条件是,在YGC后,已分配的内存占总内存的45%,触发混合回收;原创 2023-12-27 22:16:13 · 1350 阅读 · 0 评论 -
总结两套JVM模版配置
XX:+CMSScavengeBeforeRemark - 在重新标记阶段,会STW,导致服务中断,这个时候,在执行重新标记前,先执行一次YGC,因为重新标记主要管的是新创建的对象(新生代),先执行一次YGC,新生代中的垃圾对象都会被提前清除掉,这样再扫描对象,对象就会少很多,从而降低STW停顿时间。-XX:PermSize=256M - 设置永久代初始内存大小,永久代大小的设置,跟你是什么应用(比如秒杀系统)没有多大关系,因为永久代是装载类文件的,一般设置256/512M就可以;原创 2023-12-21 11:55:25 · 966 阅读 · 0 评论 -
JVM征服面试篇-亿及流量系统设计(学习笔记)
一、如何拆解亿级流量系统-百万级结算系统如何设置JVM。4.第四步:确定单笔订单耗时,寻找性能瓶颈。2.第一步:确定业务背景和核心流程。5.第五步:确定单笔支付需要的空间。3.第二步:确认系统的压力在哪里。6.第六步:回答面试官的问题。3.第三步:确定QPS。原创 2023-12-20 18:00:31 · 346 阅读 · 0 评论 -
JVM基础原理篇-透彻理解类加载子系统(学习笔记)
收到一个新的类,最底层的系统类加载器并不直接加载,而是向上委托给扩展类加载器,而扩展类加载器拿到新类后,也不执行加载,继续向上委托给引导类加载器,引导类加载器会执行加载,假如能够加载成功,结束退出,如不能加载,向下返回个null,扩展类加载器检测到上层加载器不能加载,它会执行加载,假如加载成功,结束退出,如不能加载,继续向下返回个null,系统类加载器检测到上层加载器不能加载,系统类加载器会执行加载。扩展类加载器加载的类文件,相对JVM而言,不是特别重要,但是又比我们写的代码重要。原创 2023-12-20 17:54:24 · 469 阅读 · 0 评论 -
垃圾收集器及内存分配
‐XX:+PrintGC 输出GC日志 ‐XX:+PrintGCDetails 输出GC的详细日志 ‐XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) ‐XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013‐05‐04T21:53:59.234+0800) ‐XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息 ‐Xloggc:F://test//gc.log 日志文件的输出路径。(这里是指,并行能力较强的机器)原创 2023-12-15 14:18:36 · 985 阅读 · 0 评论 -
SpringBoot+内置Tomcat配置,参数调优,最大并发量,最大连接数
SpringBoot开发最大的好处是简化配置,内置了Tomcat, 在SpringBoot2.0.x版本中内置Tomcat版本是8.5.x,SpringBoot内置Tomcat的默认设置中,Tomcat的等待队列长度默认是100,Tomcat的最小工作线程数默认分配10,Tomcat的最大线程数是200,最大连接数是10000,至于最大并发量和最大连接数,常常理解成最大并发量就是最大连接数,实际上是有些牵强的,最大连接数并不一定就是最大并发量。,这2条请求任务恰恰是最容易忽略的,如此最终处理了14条请求,转载 2023-12-15 10:00:00 · 2882 阅读 · 0 评论 -
JVM垃圾回收算法
上面这张图代表的是程序运行期间所有对象的状态,它们的标志位全部是0(也就是未标记,以下默认0就是未标记,1为已标记),假设这会儿有效内存空间耗尽了,JVM将会停止应用程序的运行并开启GC线程,然后开始进行标记工作,按照根搜索算法,标记完以后,所有从root对象可达的对象就被标记为了存活的对象,此时已经完成了第一阶段标记。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的清理未标记的对象,而是将存活的对象压缩到内存的一端,然后清理边界以外的垃圾,从而解决了碎片化的问题。原创 2023-12-14 16:12:17 · 1085 阅读 · 0 评论 -
jvm调优参数常用命令总结
(2)查询内存中对象数量及大小(包括活跃以及非活跃对象)(4)查看进程的GC信息 间隔1秒1次,打印5次。(4) 将内存使用情况dump到文件中。(3)查询内存中对象数量及大小(活跃对象)5.设置jvm的堆内存初始大小和最大大小。通过jstat命令进行查看堆内存使用情况。12.当发生内存溢出时,自动dump文件。查看Java进程xxx的指定JVM参数。查看Java进程xxx的JVM参数。(2) 通过浏览器访问。(1)查看class加载数统计。1.查看Java命令参数。(2)其他见学习笔记。原创 2023-12-14 14:46:44 · 477 阅读 · 0 评论 -
JVM调优:参数(学习笔记)
JVM调优:参数(学习笔记)原创 2023-12-14 14:18:25 · 1057 阅读 · 0 评论 -
SpringBoot方法异步调用@Async
SpringBoot方法异步调用@Async转载 2023-10-13 10:19:12 · 174 阅读 · 0 评论 -
SpringBoot 快速实现 api 加密
SpringBoot 快速实现 api 加密转载 2023-10-13 09:44:34 · 307 阅读 · 0 评论 -
一款自动生成单元测试的 IDEA 插件
今天来介绍一款工具Squaretest,它是一款自动生成单元测试的插件,为什么会用到它也是因为最近公司上了代码质量管控的指标,会考评各个项目的单元测试覆盖率,以及sonar扫描出来的各种问题,很多老项目老代码,或者着急交付的项目,单元测试严重缺失,覆盖率只有5%不到,所以几个小伙伴这几天就在疯狂的堆单元测试,3个人堆了2天才堆到30%,于是我也来上手帮忙写了两个,写到第二个的时候就发现,这个活不应该是人干的,要去看原来的代码,然后根据逻辑写各种Mock,感觉是有迹可循的东西,所以就查了下,发现果然有插件帮我转载 2022-06-21 14:14:44 · 453 阅读 · 0 评论 -
Centos7安装Maven并配置环境变量
原创 2022-02-09 14:28:58 · 2231 阅读 · 0 评论 -
CentOS7安装openjdk8+环境变量配置
步骤:1.使用yum命令安装openjdkyum cleanyum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel2.配置环境变量1)打开配置文件vi /etc/profile2)文档最后,在unset i的前面一行添加以下内容export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64export CLASSPAT原创 2022-02-09 11:00:23 · 1656 阅读 · 0 评论 -
Log4j2的异步性能
Log4j2简介 最牛逼的性能 更强大的参数格式化 更简化的配置 与其他日志抽象/门面适配 其他的特点 基本用法 总结 Logback算是JAVA 里一个老牌的日志框架,从06年开始第一个版本,迭代至今也十几年了。不过logback最近一个稳定版本还停留在 2017 年,好几年都没有更新;logback的兄弟 slf4j 最近一个稳定版也是2017年,有点凉凉的意思。而且 logback的异步性能实在拉跨,功能简陋,配...转载 2021-10-26 09:44:28 · 368 阅读 · 0 评论 -
ShardingPhere4.x按周分表实操可用-以留纪念
1.ShardingSphere4.x - pom注:ShardSphere4.x都支持,都可以使用2.ShardingSphere yaml配置图片配置如下:spring: shardingsphere: datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource .原创 2021-07-23 12:21:33 · 607 阅读 · 0 评论 -
SpringBoot+MybatisPlus3+ShardingSphere4.1.1仅分表实操可用
1.Springboot添加Mybatis-plus过程略...(这不是重点)重点:加入ShardingSphere不需要做任何代码更改2.添加ShardingSphre - jar包3.添加ShardingSphere配置配置解释:(1)spring.shardingsphere.datasource.names=master#配置数据源名称,多个逗号分隔(2)名为master数据源配置多个数据源配置参考同上;(3)配置分表规则到这里就可以了,.原创 2021-07-22 12:02:30 · 578 阅读 · 0 评论 -
打印日志的正确姿势!
使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一 实现方式统一使用: Logback框架 打日志的正确方式什么时候应该打日志 当你遇到问题的时候,只能通过debug功能来确定问题,你应该考虑打日志,良好的系统,是可以通过日志进行问题定为的。 当你碰到if…else 或者 switch这样的分支时,要在分支的首行打印日志,用来确定进入了哪个分支 经常以功能为核心进行开发,你应该在提交代码前,可以确定通过日志可以看到整个流程 基本转载 2021-07-07 10:13:20 · 346 阅读 · 0 评论