JVM 调优初探
简介
初次接触到 JVM 调优,在本文中记录了相关的概念、方法与工具使用。
遇到的问题
线上运行的项目,在一次版本更新时配置出错,没有开启数据消费线程,导致 Redis 消息队列中积压了超四百万条数据,修改配置后再运行时,程序自动读取消息队列中数据开始解析,结果发现服务器 cpu 占用率长时间达到 100%,消息队列中不断积压数据,后台管理页面无法访问。
思路
- 这台服务器是虚拟机,发现服务器居然是单核 cpu 的(–!),多分配 cpu 应该可以提高程序运行效率;
- 项目正常运行时,消息队列消费速度快,不会积压,或是有少量积压也能迅速消费掉,这次由于意外导致消息队列积压数据太多,最终导致程序无法消费,要想办法提高程序吞吐量;
- 怀疑消息消费代码效率太低,测试发现在消息积压过多时,消费速度严重下降,可能是线程太多,处理不过来;
- 检查代码发现,应用开启后不断的从消息队列拿数据,生成任务对象放到了一个 LinkedBlockingQueue 中,这个 queue 没有指定容量,使用的是最大容量 Integer.MAX_VALUE ,怀疑是放入了太多的数据,把内存占满了;
SpringBoot 使用 JPA
利用Excel和bat对文件批量重命名
SpringBoot 花式 banner
什么是 springboot 的 banner?
当 SpringBoot 项目最初运行起来时,在控制台看到的类似下面的信息,就是 SpringBoot 的 banner。可以把项目中的 banner 换成自己公司的 LOGO,增强员工对公司的认同感。
1 | . ____ _ __ _ _ |
加载顺序
SpringBoot 默认寻找banner的顺序是:
- 依次在 classpath 下找文件 banner.gif ,banner.jpg,banner.png,先找到哪个用哪个;
- 在 classpath 下找 banner.txt ;
- 以上都没有就使用默认的;
SpringBoot web 项目前端传值时 String 转 ZonedDateTime 报错的解决方法
问题描述
最近在用 springboot 做 web 项目,其中一个实体中使用了 java8 中的 ZonedDateTime 来记录时间,但是前端页面在使用 POST 或 PUT 提交请求,出错了,错误主要提示信息如下:
1 | org.springframework.validation.BindException: |
读过错误提示后知道是在数据验证绑定时,字段的类型转换错误,前端传的是一个字符串格式的时间,格式为:yyyy-MM-dd HH:mm:ss ,后端方法接收的参数是一个对象,交由spring 自动绑定,绑定时发现参数值不是一个 ZonedDateTime 对象,所以报了类型转换错误。因此,解决思路是写一个方法来完成这个字符串格式时间 和 ZonedDateTime 对象的转换。
重走Java长征路-Java是什么
关于本系列文章
我从2016年8月开始在培训班系统学习 Java,至今已经有近2年时间了,但在使用Java编程过程中发现还有很多基础的东西不明白,很多时候要依靠搜索引擎,恍然发现,过去的学习是为了能尽快会用,能够开展工作,因此很多时候只要求能够使用,而没有去思考内在的思想。思来想去,还是古人说得好,“九层之台,起于垒土”,若想在 Java 这条路上走得远、走得稳,还是要花时间来把基础夯实,不让基础不实影响将来的学习发展。因此,我决定重走Java长征路,重头开始,再来学习一次java,从认识 java 开始,一直学到现在用到的技术框架。

Java是什么?
Java简介
Java 是一种 高级 的 面向对象 的程序设计语言。高级是相对于 机器语言、汇编语言来说的,编程过程接近自然语言,通过编译后生成机器能够识别的语言,从而能够在计算机上运行。面向对象(Object Oriented, OO) 是一种编程设计方式,核心是万事万物皆对象,主要特征有封装、继承、多态、抽象、集合等。
Java 语法规则与 C++ 类似,但比 C简洁,而且去除了其中的指针和多重继承概念。
Java 编写的程序既是编译型的,又是解释型的,程序代码经过编译后转换成可被 Java 虚拟机识别的字节码,Java 虚拟机(JVM)将字节码解释成机器码,最后在计算机上运行。编译只需执行一次,但在 java 虚拟机中运行时,要对每条字节码进行解释执行,因此在执行效率来看是不及 C 的。
使用POI处理office文件
Apache POI 官网:http://poi.apache.org/

POI 是什么?
POI 是 Apache 软件基金会开源的项目,根据官网的解释,POI提供了操作Office Open XML (OOXML)标准和微软 OLE 2 Compound Document (OLE2)格式文档的接口。OLE2 文件包括微软office 中的 xls、doc、ppt 文件,ooxml格式是新的格式标准,包含 xlsx、docx、pptx 文件。
简单来说,POI 让你能用 java 读/写 Excel、Word、PPT文件。
POI 的组件:
| 组件名 | 应用 类型 |
|---|---|
| POIFS | OLE2 文件系统 |
| HPSF | OLE2 属性集 |
| HSSF | Excel xls |
| HSLF | PowerPoint ppt |
| HWPF | Word doc |
| HDGF | Visio vsd |
| HPBF | Publisher pub |
| HSMF | Outlook msg |
| DDF | 埃舍尔通用图纸 |
| HWMF | WMF图纸 |
| OpenXML4j | OOXML |
| XSSF | Excel xlsx |
| XSLF | PowerPoint pptx |
| XWPF | Word docx |
| XDGF | Visio vsdx |
| Common SL | PowerPoint ppt和pptx |
| Common SS | Excel xls和xlsx |
创建SpringBoot项目
什么是 SpringBoot ?

简单来说,SpringBoot 的出现是为了简化Spring项目的创建、运行、调试、部署过程,boot的意思是启动、引导,整体来说就是快速启动 Spring。springboot 并不是一个新的框架,它只是spring的一个封装,从根本上讲就是一些库的集合,帮助开发者快速构建spring 项目,项目里面还是使用 spring 框架实现,所以 Spring 能做的,SpringBoot 也能做,而且做的更方便、快捷。
在使用 Spring 开发的时候,写项目时有伴有大量的 xml 配置文件要编写,随着快速开发的流行,这种方式已经不能满足需要了,springboot 的出现帮我们简化了项目配置,同时提供了很多注解,让我们编码也变得简单了。SpringBoot 简化了配置,不用再写 xml 了 ,传统 Spring 项目的 xml 配置文件被转化成 java config,直接利用 @Autowire 注解注入 Bean,而环境变量中的 properties、xml 文件集中到一个application.yml中。同时,SpringBoot 使项目部署变得简单,传统的Spring项目需要外部的 tomcat 容器来运行,而在springboot 中已经集成了 tomcat ,我们将项目打包成一个 jar 包,直接通过 java -jar xxx.jar 就可以运行项目,这也方便后续使用 docker 。
SpringBoot 能够使我们更加专注于业务逻辑的开发,只需记住 Just run 就可以了,那怎么创建一个 SpringBoot 项目呢?话不多说,还是先上个 demo 尝尝味道吧!全文里介绍了一个 SpringBoot 项目从创建到测试运行,再到打包部署的全过程。
JHipster 学习笔记2
写在前面的话:这篇文章中使用的 jhipster 版本是 3.12.2 ,还是使用 yo 来构建的,在最新版本中已经不需要使用 yo 了,创建实体的过程也有一些差异。
JHipster 核心 —— 创建实体(Create Entity)
当你创建好一个项目后,你下一步要做的可能就是添加实体了,对于每个实体,你都需要下面这些内容:
- 一张数据库表;
- 一个 Liquibase 修改集;
- 一个 JPA 实体;
- 一个 Spring Data JPA 仓库对象;
- 一个 spring MVC 的控制器,实现了基础的增、查、删、改方法;
- 一个 Angular 路由、组件和server;
- 一个 html 展示页面;
- 集成测试来验证所有东西是否正确运行;
- 性能测试来验证所有东西是否允许流畅;
如果你有多个实体,那实体之间可能还有相互关联,因此,还需要:
- 数据库外键关联;
- 特殊的 JS 和 html 代码来管理这些关联关系
然而以上内容,只需要我们执行一个指令回答几个问题就可以搞定了,JHipster 一下帮我们写了几百行代码,怎么样,想不想学学这种操作?


