Out Of Memory

一. JVM Out Of Memory 相关参数 1 2 3 4 5 -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpPath -XX:OnOutOfMemoryError -XX:+ExitOnOutOfMemoryError -XX:+CrashOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError 和-XX:+HeapDumpPath -XX:+HeapDumpOnOutOfMemoryError代表在发生内存溢出时,生成堆转储文件. 一般配合 -XX:+HeapDumpPath使用, 指定输出的目录或文件. 例如: 在发生内存溢出时,会生成如下文件: 同时, 会产生如下日志: 1 2 3 4 5 6 7 ava.lang.OutOfMemoryError: Java heap space Dumping heap to /Users/chen/dump-file/java_pid86050.hprof ... Heap dump file created [179875659 bytes in 0.587 secs] [2022-07-12 23:23:12.463] [http-nio-64222-exec-1] [TxId : , SpanId : ] [ERROR] c.r.common.config.webmvc.RestExceptionHandler - GlobalExceptionHandler handleException error org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java....

July 11, 2022 · 5 min · BlackChen

如何排查生产问题的

生产问题排查基本命令 当线上服务出现问题的时候, 可以通过固定的步骤, 获取线上环境的信息, 一步一步逐步定位问题所在. X00. 判断问题影响范围 当突然接到线上报警, 应立即判断问题影响范围,如果直接导致服务不可用,则需立即响应(包括重启服务,或进行服务迁移扩容,正常情况下靠谱的运维不会让这个情况发生). 如果是高可用部署, 则联系运维同事, 切换流量到另外几台正常的机器(修改NGINX配置等),保留作案现场,进行分析定位问题. X01. 查看cpu top 查看cpu详细信息: 按1 查看负载 按cpu使用率排序: 按P 查看COMMAND详细信息: 按c top -H -p pid 查看某进程下的线程信息 X02. 查看内存 top 按内存排序: 按M free -h X03. 查看磁盘 df -h X04. 定位进程号 方法1 通过ps命令 例如: 服务名称为fcrm-c-rest 命令: ps -ef | grep 'fcrm-c-rest' 则可以查询到名称为fcrm-c-rest的进程号 方法2 通过top命令 敲击top命令后, 输入M 或 P 分别根据内存使用量排序, 和CPU使用量排序来进行定位线程号 方法3 通过jps命令 通过jps 命令获取当前执行的java进程 jps - Lists the instrumented Java Virtual Machines (JVMs) on the target system....

May 28, 2021 · 2 min · BlackChen

JMH 测试框架

开始使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <jmh.version>1.23</jmh.version> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>${jmh.version}</version> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>${jmh.version}</version> <scope>provided</scope> </dependency> 可以使用maven archtype进行自动生成 样例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @BenchmarkMode(Mode.Throughput) // 吞吐量 @OutputTimeUnit(TimeUnit.MILLISECONDS) // 结果所使用的时间单位 @State(Scope.Thread) // 每个测试线程分配一个实例 @Fork(2) // Fork进行的数目 @Warmup(iterations = 2) // 先预热4轮 @Measurement(iterations = 5) // 进行10轮测试 public class MyBenchmark { static AtomicInteger integer = new AtomicInteger(); @Benchmark public void testMethod() { integer....

April 3, 2020 · 5 min · BlackChen

常用的代码设计原则

SOLID 原则 单一职责原则(SRP) 一个类或者模块只负责完成一个职责,不要设计大而全的类, 要设计力度小,功能单一的类,单一职责原则是为了实现代码高内聚,低耦合,提高代码的复用性,可读性, 可维护性. 开闭原则(OCP) 对扩展开放,对修改关闭. 添加一个新的功能应该是在已有的代码基础上扩展代码(新增模块,类,方法等), 而非修改已有代码. 开闭原则不是完全杜绝修改, 而是以最小的修改代码的代价来完成新功能的开发. 里氏替换原则(LSP) 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏 哪些操作违背了LSP 子类违背父类申明要实现的功能 子类违背父类对输入输出,异常的约定 子类违背父类注释中所罗列的任何特殊说明 接口隔离原则(ISP) 客户端不应该强迫依赖它不需要的接口. 如果把接口理解为一组接口集合, 可以是某个微服务的接口, 也可以是某个类库的接口, 如果部分接口只被部分调用者使用,我们就需要将这部分接口隔离出来,单独给这部分调用者使用,而不强迫其他调用者也依赖这部分不会调用的接口. 如果把接口理解为单个API接口或者函数, 部分调用者只需要函数中的部分功能, 那我们就需要把函数拆分成粒度更细的多个函数, 让调用者只依赖他需要的那个细粒度函数. 如果把接口理解为OOP中的接口, 也可以理解为面向对象编程语言中的接口语法,那么接口的设计要尽量单一, 不要让接口的实现类和调用者, 依赖不需要的接口函数. 依赖反转原则(DIP) 高层模块不要依赖底层模块, 高层模块和底层模块应该通过抽象来互相依赖. 抽象不要依赖具体实现细节.具体实现细节依赖抽象. 在调用链上, 调用者属于高层, 被调用者属于底层. 控制反转 程序员利用框架进行开发的时候, 只需要往预留扩展点上,添加跟自己业务相关的代码,就可以利用框架来驱动整个程序流程的执行, 控制指的是对程序执行流程的控制,反转指的的是在没有使用框架之前, 程序自己控制整个程序的执行, 在使用框架之后,整个程序的执行流程可以通过框架来控制, 流程的控制权从程序员反转到了框架. 依赖注入 不通过new()的方式在类内部创建依赖对象,而是将依赖对象在外部创建好之后, 通过构造函数,函数参数等方式传递给类使用, 通过依赖注入的方式来将依赖的类对象传递进来, 这样就提高了代码的可扩展性,我们可以灵活的替换依赖的类. KISS 原则 Keep it Simple and Stupid 尽量保持简单. 如何满足KISS原则 不要使用同时可能不懂的技术来实现代码 不要重复造轮子,要善于使用已有的工具类. 不要过度优化. 不要过度使用一些奇技淫巧(位运算符代替算术运算, 复杂的条件语句代替 if-else,使用过于底层的函数)来优化代码,牺牲代码的可读性 越是能用简单的方法解决复杂的问题,越能体现一个人的能力. YAGNI 原则 You Ain’t Gonna Need It...

February 11, 2020 · 1 min · BlackChen

MySQL 获取时间相差13小时的问题

现象 : 获取数据时,接口返回的时间与实际的时间相差13个小时左右. 使用IDE查看数据库中的数据是正确的, 但是通过java程序获取出来之后, 时间异常. 经过一些资料查找, 发现 一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历 这篇文章所描述的现象和遇到的相同. 主要是CST时区的问题. 1 2 3 4 5 6 7 8 mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | CST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec) GMT(Greenwich Mean Time)代表格林尼治标准时间 而CST却同时可以代表如下 4 个不同的时区: 1 2 3 4 Central Standard Time (USA) UT-6:00 Central Standard Time (Australia) UT+9:30 China Standard Time UT+8:00 Cuba Standard Time UT-4:00 可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。...

October 9, 2019 · 1 min · BlackChen