03-JVM运行时参数

2022-07-18

03-JVM运行时参数 一. JVM参数选项类型 1.1 标准参数选项 比较稳定,后续版本基本不会变化 以-开头 -cp <目录和 zip/jar 文件的类搜索路径> -classpath <目录和 zip/jar 文件的类搜索路径> --class-path <目录和 zip/jar 文件的类搜索路径> 使用 : 分隔的, 用于搜索类文件的目录, JAR 档案 和 ZIP 档案列表。 -p <模块路径> --module-path <模块路径>... 用 : 分隔的目录列表, 每个目录 都是一个包含模块的目录。 --upgrade-module-path <模块路径>... 用 : 分隔的目录列表, 每个目录 都是一个包含模块的目录, 这些模块 用于替换运行时映像中的可升级模块 --add-modules <模块名称>[,<模块名称>...] 除了初始模块之外要解析的根模块。 <模块名称> 还可以为 ALL-DEFAULT, ALL-SYSTEM, ALL-MODULE-PA....

arthas

2022-07-18

arthas 如何利用 Arthas 热更新线上代码[^1] Arthas Console https://github.com/alibaba/arthas/issues/1823 [^1]: # 如何利用 Arthas 热更新线上代码 ## 前言 本文是Arthas 系列文章的第一篇。 一般线上问题比开发环境的问题更难解决,一个主要的原因便在于开发态可以任意 debug 断点调试,而线上环境一般不允许远程调试,所以在实践中,我一般习惯用 Arthas 来定位线上的问题。 > Arthas 是阿里巴巴开源的 Java 应用诊断利器 > Arthas 可以完成很多骚操作,今天给大家介绍的 Arthas 诊断技巧便是 -- 热更新线上代码。在生产环境热更新代码,并不是很好的行为,可能会引发一些问题 * 黑屏化的操作可能会导致误操作 * 不符合安全生产的规范,不满足可监控、可回滚、可降级 但有时候也有一些场景可以考虑使用 Arthas 来热更,例如开发环境无法复现的问题、找到修复思路后临时验证等。 本文以 Arthas 3.1.7 版本为例,主要使用到 jad/mc/`....

02-JVM监控及诊断工具-GUI

2022-07-18

02-JVM监控及诊断工具-GUI 一. jconsole 比较简单,命令行直接输入即可 二. Visual Vm 三. ecplipse MAT 四. 内存泄露和内存溢出 可达性分析算法判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用。那么由于这种情况,代码的实现不同就会导致内存泄漏问题。 即对象仍在使用,但是不被需要,此时就不会被回收,会造成内存泄露 对象不会被用到了,但是GC又不会回收他们。就会造成内存泄露。 4.1 内存泄露情况 静态集合类 static List list = new ArrayList(); public void oomTest1() { Object o = new Object(); list.add(o); } 静态对象由于不会被回收,因此里面添加的局部变量对象会被一直引用,也不会被回收,因此会造成内存泄露 单例模式 由于单例的静态特性,它的生命周期和JVM的生命周期一样长,所以单例对象如果持有外部对象的引用,那么这个外部对象也不会被回收,那么就会造成内存泄露。 内部类持有外部类 如果一个外部类的实例对象的方法返回了一个内....

01-JVM监控及诊断工具-命令行

2022-07-18

01-JVM监控及诊断工具-命令行 一. jps Java Process Status 显示指定系统内所有正在运行的 HotSpot虚拟机程序。 jps -q:只显示进程号 jps -l:显示运行的 java 类的全类名 jps -m:显示运行该程序传入的传输,即 main()方法的 args 传入的参数 jps -v:列出进程启动时的 JVM 参数 上述参数可以综合使用,例如 jps -m -v 或者 jps -mvl 如果某 java 进程关闭了默认开启的 UsePerfData 参数(-XX:-UsePerfData),那么 jps 命令将无法探知该进程(jstat 也是如此) 如果我们想查看远程主机上的 java 程序,需要安装 jstatd 二. jstat JVM Statistics Monitoring Tool 用于监听虚拟机各种运行状态信息的工具。可以显示虚拟机进程中的类装载,内存,垃圾收集,JIT 编译等运行数据。 jstat -<option> [-t] [-h<lines>] <vmid> [<i....

06-java并发编程(精通)

2022-07-18

06-java并发编程(精通) java并发编程(精通篇) 一. Concurrent工具类 1.1 CountDownLatch CountDownLatch是一个辅助工具类,它允许一个或多个线程等待一系列指定操作完成。 相当于一个定时器,需要初始化一个数量 每调用一次countDown(),数量减1 而某个线程可以调用await()方法使这个线程阻塞,一旦CountDownLatch的数量为0,则结束阻塞状态 1.2 CyclicBarrier CyclicBarrier是一个辅助工具类,循环栅栏(起跑线) 它允许一组线程互相等待,直到到达某个公共屏障点 适用于所有子线程都结束后才执行主线程的情况 起始规定的数量必须和线程数相等,不然就会一直等待下去 barrier.await() // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 barrier.await(1,TimeUnit.SECONDS); 设置等待时间,如果等待了1秒,最后一个线程还没有就位,则自己继续运行,但是会导致Barrier....

09-java多线程原理

2022-07-18

09-java多线程原理 java并发 一. java并发锁原理 1. LockSupport LockSupport是并发锁的基础,内部利用Unsafe实现,其中的方法实现了线程的阻塞和唤醒 1.1 park() LockSupport.park()实现了线程的阻塞。 在当前线程内部调用该方法时,如果当前线程持有了许可证,那么直接返回,否则会被阻塞挂起 public static void test1() { System.out.println("begin park"); LockSupport.park(); System.out.println("end park"); } 注意事项: 该方法不仅会被unpark唤醒,也会被中断(interrupt)唤醒 该方法返回时不会抛出任何异常,即无法知道是因为什么原因返回的 1.2 unpark() LockSupport.unpark(Thread thread)实现了线程的唤醒 会使传入的线程获取通行证,参与线程的调度。如果已经被park()阻塞,那么会立即返回。如果再unpark之后再次调用park,那么也会立即返回....

00-各种协议

2022-07-18

00-各种协议 一. TCP/IP TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 是一个分层的,多协议的通信体系,被认为是一个四层协议 在应用程序发送到物理网络之前,将沿着协议栈从上往下依次传递,每一层协议都在上层数据的基础上加上自己的头部信息(尾部信息),实现该层功能 socket编程是一门技术,它主要是在网络通信中经常用到 ​ 既然是一门技术,由于现在是面向对象的编程,一些计算机行业的大神通过抽象的理念,在现实中通过反复的理论或者实际的推导,提出了抽象的一些通信协议,基于tcp/ip协议,提出大致的构想,一些泛型的程序大牛在这个协议的基础上,将这些抽象化的理念接口化,针对协议提出的每个理念,专门的编写制定的接口,与其协议一一对应,形成了现在的socket标准规范,然后将其接口封装成可以调用的接口,供开发者使用 1.1 TCP Transmission Control Protocol 1.1.1 基本概念 为应用层提供了可靠的,面向连接的,基于流的服务 面向连接指的是:两个使用TCP的应用在传输数据前必须先建立一个TCP....

10-javaNio

2022-07-18

10-javaNio 一. NIO简介 java nio是区别于传统IO的输入/输出的新特性。是一种非阻塞的IO方式,同步非阻塞IO,基于io多路复用模型 NIO是面向块/缓冲区编程的。数据读取到一个它稍后处理的缓冲区,需要时可以在缓冲区前后移动,增加了处理的灵活性。 NIO主要有三大核心部分.Channel,Buffer,Selector 二. Channel 通道表示打开到 IO 设备(例如:文件、套接字)的连接。 类似于传统IO中流的概念,但是比流更加高效,可以异步双向传输。必须配合Buffer使用 Channel就是一个IO的通道。例如在读取文件时,就是程序和文件之间的一个传输通道。不同于传统的流,通道中的数据必须保存在buffer中,然后再传输给程序。 2.1 FileChannel 有关文件读写的Channel。FileChannel不能设置为非阻塞模式,只能工作在阻塞模式下。 InputStream、OutputStream、RandomAccessFile中有相应的方法可以打开通道。 FileInputStream inputStream = new FileInp....

01-java8新特性

2022-07-18

01-java8新特性 java8新特性 map 的merge方法 //(x, y) -> x+1 x为原来的value,y为第二个参数的值 //这句话的意思就是如果s不存在,则设为1,如果存在,替换为原来的x + 1 result.merge(s, 1, (x, y) -> x + y); 相当于原来的 if(result.get(s) == null){ result.put(s,1) }else{ result.put(s,result.get(s)+1) } 完整代码如下(wordCount) String [] words = {"hello mahaonan hello niuhonghong", "hello yuqingfu"}; List list = new ArrayList<>(); for(int i = 0;i < words.length; i++){ String [] a = words[i].split(" "); for(int j = 0;j < a.length; j ++){ list.add(a[....

08-java多线程补充知识

2022-07-18

08-java多线程补充知识 多线程补充知识 1. ThreadGroup 线程组就相当于一个逻辑意义上的分组,把不同的线程放到一组来管理,是一种树形的数据结构,有子父组的概念。可以对所有线程以组为单位进行操作,如设置优先级、守护线程等 优点 使用ThreadGroup在具有数千个线程的大型应用程序服务器中,可能是一种有用的诊断技术。如果线程在逻辑上被分组在一起,那么当得到堆栈跟踪时,可以看到哪个组是违规线程的一部分(例如:“Tomcat线程”、“MDB线程”、“线程池X”等),这对跟踪和解决问题有很大帮助。 测试方法 package concurrent; import java.util.concurrent.TimeUnit; /** * @Author: M˚Haonan * @Date: 2019-11-05 16:20 * @Description: ThreadGroup类的测试 / public class ThreadGroupTest { /* * 线程组创建的测试方法 */ public static void createTest() { //获....

01-netty入门

2022-07-18

01-netty入门 netty系列之入门 一. netty基本概念 ​ Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,可以支持各种通用协议(比如http,websocket等等)以及自定义协议。 pipeline: 相当于流水线,是任务所经过的管道 handler: 相当于流水线上的每道工序,对数据进行加工处理。并且可以选择性的接受pipeline提供的感兴趣的事件(重写相应的方法) handler分为Inbound和OutBound,分别为read处理,write处理 eventLoopGroup: 相当于工人,是真正处理事件的线程。 一个eventLoop可以处理多个channel,一个channel一旦被eventLoop处理后就会和该eventLoop绑定,以后所有IO操作都由该eventLoop完成,这样做是为了线程安全 eventLoop既可以处理Io事件,也可以处理普通,定时任务 eventLoop按照pipeline指定的顺序,依次通过handler对数据进行处理。可以为每道工序(业务处理,非IO操作)指定不同的eve....

03-netty优化

2022-07-18

03-netty优化 netty系列之优化 一. 拓展序列化算法 1.1 序列化接口 public interface Serializer { byte getType(); /** * 序列化 * @param object 被序列化的对象 * @param <T> 被序列化对象类型 * @return 序列化后的字节数组 / <T> byte[] serialize(T object); /* * 反序列化 * @param clazz 反序列化的目标类的Class对象 * @param bytes 被反序列化的字节数组 * @param <T> 反序列化目标类 * @return 反序列化后的对象 / <T> T deserialize(Class<T> clazz, byte[] bytes); } 1.2 序列化算法实现枚举 public enum SerializerAlgorithm implements Serializer { /* * 使用jdk的序列化机制 */ JAVA { @Overrid....

02-netty进阶

2022-07-18

02-netty进阶 netty系列之进阶 https://gitee.com/springchuntian1/netty_rpc 一.粘包与半包 1.1 测试代码 服务端: public static void main(String[] args) { ServerBootstrap bootstrap = new ServerBootstrap() .group(new NioEventLoopGroup(), new NioEventLoopGroup()) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<NioSocketChannel>() { @Override protected void initChannel(NioSocketChannel ch) throws Exception { ch.pipeline().addLast(new LoggingHandler()); ch.pipeline().addLast(new ChannelInbou....

01-elasticjob入门

2022-07-18

01-elasticjob入门 elasticjob入门 思维导图见 elastic-job ProcessOn Mind 一. 基本概念 二. 版本说明 虽然市面上大部分elasticJob都是基于2.1.5版本,但是最新的3.0.0版本已经发布,秉着追逐技术前沿的态度,本文及后面几篇重点基于3.0.0分析,会对2.1.5进行少许的分析。 三. 注册中心 elasticJob为了实现分布式任务调度,引入了注册中心这一概念。默认下提供了Zookeeper作为注册中心。 注册中心负责保存任务的配置,分片,任务调度等等。是能够实现分片的重要保障。 3.1 概览 当一个任务注册到zookeeper后,zookeeper的目录结构如图所示: esjob3: namespace(命名空间) com.mahaonan.demo.esjob3.job.TestJob: 任务名称 config: 任务的配置,主要包括任务执行类,分片数目,cron表达式等等 leader: 任务实例的主节点信息,通过zookeeper的主节点选举,选出来的主节点信息 election下面的ins....

jsr303数据验证

2022-07-18

jsr303数据验证 jsr303数据验证 常见问题 1. 在ftl中显示错误信息 后台代码 @RequestMapping(value = "reg", method = RequestMethod.POST) public String reg(@Valid User user, BindingResult bindingResult, ModelMap model){ if (bindingResult.hasErrors()){ model.addAttribute("user", user); return "seckill/register"; } userService.regist(user); return "seckill/register"; } 前台代码 [#if user??] [@spring.bind "user.password" /] [@spring.showErrors "" /] [/#if] @spring.bind绑定属性 @spring.showErrors显示错误信息

Spring Boot

2022-07-18

Spring Boot **一、**Spring Boot 入门 1、Spring Boot 简介 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 2、微服务 2014,martin fowler 微服务:架构风格(服务微化) 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通; 单体应用:ALL IN ONE 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元; 详细参照微服务文档 3、环境准备 http://www.gulixueyuan.com/ 谷粒学院 环境约束 –jdk1.8:Spring Boot 推荐jdk1.7及以上;java version "1.8.0_112" –maven3.x:maven 3.3以上版本;Apache Maven 3.3.9 –IntelliJIDEA2017:IntelliJ IDEA 2017.2.2 x64、STS –SpringBoot 1.5.9.RELEASE:1.5.9; 统一环境; 1、MAVEN设置; 给maven 的settings.xm....

springboot1-基础原理

2022-07-18

springboot1-基础原理 一. 什么是springboot SpringBoot是SpringMVC的升级,但两者并未有直接的联系,其中一者可以取代另一者,其中SpringBoot作为下一代框架,有它独特的优势:省去了繁琐了xml配置,为微服务提供了基础(微服务架构的流程一般为SpringBoot–>SpringCloud–>微服务 二. 原理 启动类的原理 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 解释如下 @SpringBootApplication相当于以下3个注解的功效: @Configuration @EnableAutoConfiguration @ComponentScan (exclude = DataSourceAutoConfiguration.class)加上以后,不会自动加载数据库相....

springboot5-elasticsearch系列

2022-07-18

springboot5-elasticsearch系列 elasticsearch系列 一. elasticsearch基本介绍 1. 基本特点 全文检索,结构化检索,数据统计,分析,接近实时处理,分布式搜索,处理PB级别数据,搜索纠错,自动完成 使用场景:日志搜索,数据聚合,数据监控,报表统计分析 2. 版本区别 6.2.X版本 不再支持一个索引库里面多个type,6.x版本已经禁止一个index里面多个type,所以一个index索引库只能存在一个type(相当于一个库里面只能有一个表) mysql:database table record es: index type(只能存在一个) document 版本兼容表 spring data elasticsearchelasticsearch 3.2.x6.5.0 3.1.x6.2.2 3.0.x5.5.0 2.1.x2.4.0 2.0.x2.2.0 1.3.x1.5.2 3. docker安装es 拉取镜像 docker pull elasticsearch:6.5.0 启动容器 doc....

SpringBoot

2022-07-18

SpringBoot **一、**Spring Boot 入门 1、Spring Boot 简介 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 2、微服务 2014,martin fowler 微服务:架构风格(服务微化) 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通; 单体应用:ALL IN ONE 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元; 详细参照微服务文档 3、环境准备 http://www.gulixueyuan.com/ 谷粒学院 环境约束 –jdk1.8:Spring Boot 推荐jdk1.7及以上;java version "1.8.0_112" –maven3.x:maven 3.3以上版本;Apache Maven 3.3.9 –IntelliJIDEA2017:IntelliJ IDEA 2017.2.2 x64、STS –SpringBoot 1.5.9.RELEASE:1.5.9; 统一环境; 1、MAVEN设置; 给maven 的settings.xml....

springboot2-property

2022-07-18

springboot2-property 从现在开始,3,2,1... 自定义Property 配置在properties中 com.mahaonan.author = 马皓楠 编写java配置类 @Component public class MyProperties { @Value("${com.mahaonan.author}") private String author; public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } } 常见问题 中文乱码 解决方案 修改idea配置 在File-setting-Editor-File Encoding下将properties文件默认编码修改为UTF-8,并勾选Transparent native-to-ascii conversion 在文件中输入文字时他会自动的转换为Unicode编码,然后在idea中开发文件时他会自动转回文字来显示。这样做是....