Git Commit Message 的规范书写 规范书写非常重要,它是项目协作和后期维护的基石。一份清晰的提交信息可以帮助你和其他开发者快速理解代码变更的意图、背景和影响。 目前,最广为接受和推崇的规范是 Angular 规范,它衍生出了 Conventional Commits 约定式提交标准。下面我将详细介绍这套规范。 核心规范:Conventional Commits 一个规范的 Comm
模板方法模式:定义算法的骨架 摘要 模板方法模式(Template Method Pattern)是行为型设计模式中的"算法架构师",它在父类中定义算法的骨架,将具体步骤延迟到子类实现。本文将深入探讨模板方法模式的核心概念、实现方式、应用场景及高级变体,通过丰富的Java代码示例展示如何构建可扩展的算法框架,并分析其与策略模式、工厂方法模式的区别与适用场景。 一、模板方法模式核
在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件。下面从技术实现层面详细剖析这一现象。 一、内部类机制与.class文件生成 1. 成员内部类(常规内部类) // Outer.java public class Outer { public class Inner { void display() { Syst
虽然Java虚拟机可以帮我们对内存进行回收,但是其回收的是Java虚拟机不再引用的对象。很多时候我们使用系统的IO流、Cursor、Receiver如果不及时释放,就会导致内存泄漏(OOM)。但是,很多时候内存泄漏的现象不是很明显,比如内部类、Handler相关的使用导致的内存泄漏,或者你使用了第三方library的一些引用,比较消耗资源,但又不是像系统资源那样会引起你足够的注意去手动释放它们。以
jmc jmc(Java Mission Control)是JDK自带的一个图形界面监控工具,监控信息非常全面。JMC打开性能日志后,主要包括一般信息、内存、代码、线程、I/O、系统、事件 功能。 JMC的最主要的特征就是JFR(Java Flight Recorder),是基于JAVA的飞行记录器,JFR的数据是一些列JVM事件的历史纪录,可以用来诊断JVM的性能和操作,收集后的数据可以使用J
jhat jhat(JVM Heap Analysis Tool)命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。 # 解析Java堆转储文件
jmap jmap(Java Memory Map)主要用于打印内存映射。常用命令: jmap -dump:live,format=b,file=xxx.hprof <pid> 查看JVM堆栈的使用情况 [root@localhost ~]# jmap -heap 7243 Attaching to process ID 27900, please wait... Debugger a
jps 用于显示当前用户下的所有java进程信息: # jps [options] [hostid] # q:仅输出VM标识符, m: 输出main method的参数,l:输出完全的包名, v:输出jvm参数 [root@localhost ~]# jps -l 28729 sun.tools.jps.Jps 23789 cn.ms.test.DemoMain 23651 cn.ms.test
调优实战 上面说完了调优的目的和调优的指标,那么我们就来实战调优,首先准备我的案例代码,如下: import java.util.ArrayList; import java.util.List; class OOM { static class User{ private String name; private int age; public User(String nam
老年代调优 按照同样的思路对老年代进行调优,同样分析FullGC 频率和停顿时间,按照优化设定的目标进行老年代大小调整。 老年代调优流程 分析每次MinorGC 之后老年代空间占用变化,计算每次MinorGC之后晋升到老年代的对象大小 按照MinorGC频率和晋升老年代对象大小计算提升率即每秒钟能有多少对象晋升到老年代 FullGC之后统计老年代空间被占用大小计算老年带空闲空间,再按照第2部计算
Jvisualvm 项目频繁YGC 、FGC问题排查 内存问题 对象内存占用、实例个数监控 对象内存占用、年龄值监控 通过上面两张图发现这些对象占用内存比较大而且存活时间也是比较常,所以survivor 中的空间被这些对象占用,而如果缓存再次刷新则会创建同样大小对象来替换老数据,这时发现eden内存空间不足,就会触发yonggc 如果yonggc 结束后发现eden空间还是不够则会直接放到老年
磁盘不足排查 其实,磁盘不足排查算是系统、程序层面的问题排查,并不算是JVM,但是另一方面考虑过来就是,系统磁盘的不足,也会导致JVM的运行异常,所以也把磁盘不足算进来了。并且排查磁盘不足,是比较简单,就是几个命令,然后就是逐层的排查,首先第一个命令就是df -h,查询磁盘的状态: 从上面的显示中其中第一行使用的2.8G最大,然后是挂载在 / 目录下,我们直接cd /。然后通过执行: du -s
GC场景 Full GC场景 场景一:System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过 -XX:+ DisableExplicitGC 来禁止RMI调用System.gc()。
AQS框架 基础 AbstractQueuedSynchronizer抽象同步队列简称AQS,它是实现同步器的基础组件,如常用的ReentrantLock、Semaphore、CountDownLatch等。 AQS定义了一套多线程访问共享资源的同步模板,解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作,虽然大多数开发者可能永远不会使用AQS实现自己的同步器(JUC包下提供的同步器基
并发特性 JAVA里面进行多线程通信的主要方式就是 共享内存 的方式,共享内存主要的关注点有两个:可见性 和 有序性。加上复合操作的 原子性,可以认为JAVA的线程安全性问题主要关注点有3个(JAVA内存模型JMM解决了可见性和有序性的问题,而锁解决了原子性的问题):可见性、有序性、原子性 原子性(Atomicity):在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败 有序
JAVA内部类 Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类。根据定义的方式不同,内部类分为静态内部类、成员内部类、局部内部类和匿名内部类四种。 静态内部类 使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类。静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向
GC垃圾收集器 GC垃圾收集器的JVM配置参数: -XX:+UseSerialGC:年轻代和老年代都用串行收集器 -XX:+UseParNewGC:年轻代使用 ParNew,老年代使用 Serial Old -XX:+UseParallelGC:年轻代使用 ParallerGC,老年代使用 Serial Old -XX:+UseParallelOldGC:新生代和老年代都使用并行收集器 -XX
JVM垃圾回收器
OOM JVM发生OOM的九种场景如下: 场景一:Java heap space 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMemoryError:Javaheap space 错误(根据实际生产经验,可以对程序日志中的 OutOfMemoryError 配置关键字告警,一经发现,立即处理)。 原因分析 Javaheap space
JVM运行时内存
JVM JAVA内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 JMM描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存中读取出变量这样的底层细节。所有的变量都存储在主内存中,每个线程都有自己独立的工作
JVM 类加载机制
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号