如何使用Java JDK17版本OpenJ9 JVM

前言 心血来潮,看到JDK19都出来了,想着升级一下自己电脑上的JDK到JDK17 LTS版本+OpenJ9 JVM,在升级过程中遇到找不到安装资源的问题,记录一下解决过程 JDK17是Oracle的提供的长期支持版本,IBM J9是IBM优化的JVM版本,使用它可以节省JAVA服务使用的内存 使用adoptopenjdk/openjdk/安装 先前的adoptopenjdk11-openj9版本是从adoptOpenJdk源进行安装的,想着JDK17版本也从这个源进行安装,执行以下命令进行安装 brew install adoptopenjdk/openjdk/adoptopenjdk17-openj9 报错了,没有找到,为什么?明明JDK已经到19版本了,openjdk的17版本却没有更新? AdoptOpenJdk不维护了 查了半天的google,又上 AdoptOpenJDK 的brew源上看,找到了问题所在 根据官方brew源仓库的说明, AdoptOpenJdk 在2021-08-01 后不再更新了,所有版本都迁移到了Eclipse 基金会维护的JAVA生态顶级项目 Eclipse Adoptium Temurin中不包含OpenJ9 JVM Eclipse Adoptium维护的JDK版本,通过 temurin 命令进行安装 brew search temurin 没有看到带OpenJ9名称的版本,查询temurin官方博客中发现目前的 temurin 中暂时不包含OpenJ9版本,需要到 IBM 官网进行安装 使用IBM维护的JDK 最后从IBM的网站上找到了OpenJ9,IBM的JDK版本在brew中使用 semeru 命令 brew install semeru-jdk17-open 安装成功. 终于可以使用 J9版本的JDK17了 REF https://medium.com/@sdkman_/adoptopenjdk-is-dead-long-live-eclipse-adoptium-4f2677ca935a

2022-12-14 · 1 min · 49 words · tomyli

JAVA中如何判断对象与类的关系之-instanceOf, Class.isInstance, Class.isAssignableFrom

前言 在开发中,常常会碰到检查JAVA对象是不是指定类型的情况,在JAVA中提供了以下几种方法实现此类需求: instanceOf Class.isInstance() Class.isAssignbleFrom() 今天对此三种实现进行具体学习,以加深理解并更好的使用 准备工作 先创建一个名为 Shape 的接口,一个实现了 Shape 接口的类 Triangle , 再定义一个继承 Triangle 类的类 IsoscelesTriangle public interface Shape { } public class Triangle implements Shape { } public class IsoscelesTriangle extends Triangle { } 以上三个类的类图关系如下 instanceOf instanceOf 是JAVA中的一个关键字,用于判断 实例对象是否是指定类型的子类型 ,常用于类型转换(cast)之前进行判断,操作的元素是一个对象和一个类型 Shape shape = new Triangle(); Triangle triangle = new Triangle(); IsoscelesTriangle isoscelesTriangle = new IsoscelesTriangle(); Shape nonspecificShape = null; assertTrue(shape instanceof Shape); assertTrue(triangle instanceof Shape); assertTrue(isoscelesTriangle instanceof Shape); assertFalse(nonspecificShape instanceof Shape); assertTrue(shape instanceof Triangle); assertTrue(triangle instanceof Triangle); assertTrue(isoscelesTriangle instanceof Triangle); assertFalse(nonspecificShape instanceof Triangle); assertFalse(shape instanceof IsoscelesTriangle); assertFalse(triangle instanceof IsoscelesTriangle); assertTrue(isoscelesTriangle instanceof IsoscelesTriangle); assertFalse(nonspecificShape instanceof IsoscelesTriangle); 上面例子测试 instanceOf 左侧对象是否是右侧类型的实例类型 ...

2022-12-12 · 2 min · 249 words · tomyli

Linux-man学习

功能 显示命令行命令的帮助手册 排版 Man页面是按章节(section)进行分配的,在Man中包含9个特定章节 特定章节 可执行程序或者Shell命令(1) man 1 ls man 默认查询第1章节,也可以直接忽略写章节进行查询 man ls 此命令与上边命令效果相同 系统调用(2) 系统调用(内核的功能)相关的帮助在第2章节,例如下面查询系统调用 read 的帮助手册 man 2 read 库调用(3) 库调用相关帮助在第3章节,例如下面查询 ziplib 库中read 的帮助信息 man 3 zip_fread 特定设备文件(4) 查询/dev(保存的设备文件)下的待定文件相关帮助在第4章节, 查一下 null 设备的帮助信息 man 4 null 配置文件书写规则与约定(5) 配置文件的帮助信息放在了第5章,查询一下 /etc/passwd 的帮助 man 5 passwod 游戏相关(6) 略 杂项(7) 一些杂项帮助信息放在第7章,查一下 groff 文件的帮助 man 7 groff 系统管理员命令(8) 略 内核相关(9) 略 章节组织形式 以下只列出比较常用的信息 名称 总览 配置 描述 命令选项 退出码 返回值 环境变量 例子 作者 延伸阅读(see also) 常用命令 man man -f 显示命令的简介, 同 whatis 命令 man -k 搜索命令描述,当只记得一些关键词时很有用。同 apropos 命令 ...

2022-12-08 · 1 min · 115 words · tomyli

Java枚举学习

枚举 枚举是指包含指定个数特定类型的实例类,所有枚举类默认都继承 java.lang.Enum ,枚举类是可序列化、可比较的 public enum Person { MAN, WOMAN; } public static void main(String[] args) { System.out.println(Person.MAN); } MAN 枚举构造器 枚举中自动生成的无参构造器默认是private的 显示定义的构造器只能是私有或无访问符的,即枚举不可以从外部进行实例化 无参构造器 public enum Person { MAN(), WOMAN(); Person() {} } public static void main(String[] args) { for(Person person : Person.values()) { System.out.println(person); } } MAN WOMAN 带参构造器 public enum Person { MAN(1), WOMAN(2), UNKNOWN, ; Person() {} Person(int status) { this.status = status; } public int status; } public static void main(String[] args) { for(Person person : Person.values()) { System.out.println(person.status); } } 1 2 0 枚举类初始化 枚举类的初始化与一般类的初始化过程(静态代码块->构造器代码块->构造函数)不同,它的执行顺序为:实例构造器代码块->构造函数->静态常量代码块,以下代码进行演示 ...

2022-11-23 · 3 min · 477 words · tomyli

Org-babel学习记录

基础 匿名代码段 命名的代码块 命名的代码块与结果项是可以分开的,orgmode通过代码块的名称进行匹配 定义参数 参数变量根据对应语言表现方式不同 :var x=0 Header header多行书写便于阅读 内联代码段 4 常用命令 org-babel-execute-buffer 执行buffer的所有代码段

2022-09-28 · 1 min · 15 words · tomyli

Org-anki, Org与Anki的完美结合

Org-anki Org-anki是一个同步Org中note到Anki的Emacs包,它的实现非常简单灵活,文档书写体验好 安装 (use-package org-anki :commands (org-anki-sync-entry org-anki-sync-all)) 支持的note 基础note 基本的正反两面问答形式,在org中,heading表示问题,内容表示答案 * 我是问题 我就是答案了 填空型note 填空形式,处理格式为 {{…}}, 只关注heading,不关注内容 * 我是问题 {{c1::答案在这}} 嵌套型 其它也是基础型,但是这种功能让org note的组织更加友好,因为有时一个记忆点可能需要多种方式来实现 * 我是问题1 我是答案1 ** 我是问题1 我是问题1的另一种答案 上面的情况会在anki中创建两个基础的card,也就是两个记忆点,好用 常用命令 org-anki-sync-all 同步所有note到anki org-anki-sync-entry 同步当前光标所属的entry到anki org-anki-cloze-dwim 创建填空形式,要选中标题部分区域进行转换 org-anki-browse-entry 在Anki中浏览当前光标下entry的note信息 org-anki-import-deck 从Anki中导入,在Anki中已经存在部分note时,可以先导入到org中,再进行同步 org-anki-delete-entry 删除当前entry org-anki-delete-all 删除所有entry

2022-09-27 · 1 min · 46 words · tomyli

Apollo不更新配置了?

问题描述 近期改造服务调用,需要使用Apollo配置进行灵活切换,上线后发现有些机器配置生效,有些配置未生效,开发小伙伴反馈此问题发生有一段时间 问题排查 机器排查 对线上机器进行排查,发现有几台机器根本没有拉取新的应用配置 指定问题机器信息 进入到问题机器查看本地Apollo文件信息 ... -rw-rw-r-- 1 mqq mqq 3429 May 19 15:32 main-webapp+default+CoopReader.baipai.switch.properties -rw-r--r-- 1 mqq mqq 1621 Jul 4 15:39 main-webapp+default+CoopReader.switcher.properties -rw-r--r-- 1 mqq mqq 89 Aug 26 11:18 main-webapp+default+CoopReader.personal.menu.properties -rw-r--r-- 1 mqq mqq 3958 Aug 26 15:45 main-webapp+default+CoopReader.common.config.propertie 可以看到文件的最新日期在8月26日 Apollo 服务的问题? 先前小伙伴反应问过运维相关问题,得到的结论是Apollo没有改动,且服务配置不是完全不可用,此方向排除 服务的问题? 从目前得到的信息可以确认是某几台机器上的Apollo client没有去拉取最新的配置信息 为什么没有拉取到最新配置? 先来梳理一下Apollo的使用流程: 业务对Apollo的访问都基于 L5 的方式 目前业务工程使用cloudlevel5.Protocol来获取L5的信息与Apollo Portal进行交互 <dependency> <groupId>com.yuewen</groupId> <artifactId>userbase-l5-system</artifactId> <version>1.0.3.Final</version> </dependency> 为什么业务机没有与Apollo portal交互? 怀疑与出问题的机器获取不到L5信息有关 问题猜测验证 大体知道问题出在哪了,下面就需要进行验证了。最简单的方式就是打印出Apollo的相关日志信息对猜测进行验证,但是目前业务的日志级别设置的 ERROR ,啥也看不到 修改业务日志级别? 现在需要打印aplllo相关的日志级别为 Info ,需要修改Logback中配置如下: <logger name="com.ctrip.framework.apollo" level="info"/> 但是还是需要发版本上线,未免太麻烦,有没有其它办法? Arthas动态修改日志级别 现在已经有非常成熟的线上调试工具了,Arthas就能实现对Logback的动态日志修改,二话不说,直接机器上修改验证 在问题机器上启动arthas java -jar arthas-boot.jar 选择要处理的应用(10384)进入到arthas ...

2022-09-16 · 1 min · 208 words · tomyli

那些高效的VSCode插件

必备 vscodevim.vim 在VSCode中使用VIM angelo-breuer.clock 在状态栏增加时间显示 redguardtoo.matchit Tag匹配,在代码结构中快速跳转 kahole.magit 类Emacs magit chadalen.vscode-jetbrains-icon-theme 类JetBrains的文件图标 codezombiech.gitignore .ignore文件支持 wmaurer.change-case 快速切换选择单词的格式,支持驼峰,大小写等 lucax88x.codeacejumper 快速跳转到指定字符 NTBBloodbath.doom-one 类Emacs doom-one主题 geeebe.duplicate 复制当前光标中的行,VSCode默认行为增强 usernamehw.errorlens VSCode错误提示增强 zerodind.familiar-java-themes 类Idea主题 vsls-contrib.gistfs Github gist快速查看与编辑 qezhu.gitlink 复制当前文件的仓库地址 trixnz.go-to-method 跳转到指定方法,不包换其它Symbol信息 YuTengjing.open-in-external-app 使用外部应用打开当前文件 tootone.org-mode Emacs org-mode局部支持 mushan.vscode-paste-image 粘贴图片到Markdown Shan.code-settings-sync VSCode配置多终端同步 mybells.someone-github-stars 获取指定Githuber的Star并写入到Markdown TabNine.tabnine-vscode TabNine AI代码完成 VSpaceCode.whichkey VSCode按键修改与提示 Office Viewer(Markdown Editor) - Visual Studio Marketplace Captured On: [2023-05-19 Fri 10:08] ...

2022-09-05 · 1 min · 162 words · tomyli

用Riggrep进行快速搜索

为什么要学习riggrep? Riggrep快 天下武功,唯快不破 Riggrep聪明 默认会排除 .gitignore/.ignore/.rgignore 文件下的配置和隐藏文件、二进制文件 安装 brew install ripgrep 使用说明 样例所有操作使用 study-sample 仓库,里面是常用语言的入门学习资源,操作文档结构如下: tree ~/github/study-sample /Users/tomyli/github/study-sample |-- LearnBash.sh |-- LearnJava.java |-- README.md |-- commonlisp.lisp |-- learn-emacs-lisp.el |-- learn.nix |-- learnc.c |-- learnclojure.clj |-- learngo.go |-- learnlua.lua |-- learnpython.py |-- learnrust.rs `-- markdown.md 0 directories, 13 files 基本使用 遍历查询 ~/github/study-sample/ 下所有包含 TODO say hello 字符串的结果 rg 'TODO say hello' ~/github/study-sample/ /Users/tomyli/github/study-sample/learnc.c:/* TODO say hello */ /Users/tomyli/github/study-sample/commonlisp.lisp:;; TODO say hello /Users/tomyli/github/study-sample/learnclojure.clj:;; TODO say hello /Users/tomyli/github/study-sample/learn-emacs-lisp.el:;; TODO say hello /Users/tomyli/github/study-sample/LearnBash.sh:# TODO say hello /Users/tomyli/github/study-sample/LearnJava.java: // TODO say hello /Users/tomyli/github/study-sample/learnrust.rs:// TODO say hello 查询到的结果以 文件 维度进行展示,使用 分号 进行分割,分号前为文件路径,分号后为查询匹配到的内容 ...

2022-08-30 · 3 min · 552 words · tomyli

Spring的RedisTemplate如何与Lettuce进行交互的

问题 SpringWebFlux项目,使用的Redis客户端是Lettuce(基于异步),在Spring中封装了两种操作Redis的模板 RedisTemplate 与 ReactiveRedisTemplate ,正常情况下,异步编程要使用 ReactiveRedisTemplate ,那么可以在项目中使用 RedisTemplate 进行redis的操作吗?为什么? 答案 可以使用 RedisTemplate 在异步代码中进行操作 @Autowried private StringRedisTemplate redisTemplate; String value = redisTemplate.opsForValue().get(key); 追根溯源 先来明确一下应用与Redis的交互流程 Redis交互流程 获取连接 执行命令 返回结果 源码追踪 String value = redisTemplate.opsForValue().get(key); 以下以redis的get命令为例进行解析,get方法是通过 RedisTemplate 的 ValueOperations 属性进行处理的,因为 ValueOperations 是一个接口,要从其实现类 DefaultValueOperations 的get方法进行解析,直接上图 Figure 1: 整体流程图 关键点解析 第1-5步只是为了获取Redis连接 getConnection是为了获取具体的底层redis命令,项目使用Lettuce且为String操作,此处获取的连接为 LettuceStringCommands 第6步是命令执行触发点 它调用了执行DefaultValueOperations.execute(ValueDeserializingRedisCallback)方法调用时方法参数ValueDeserializingRedisCallback的实现方法inRedis,由此转入到真正的命令执行阶段 第9步获取API LettuceConnection获取的是通过调用StatefulConnection.async()方法获取的异步API 第12步进行返回处理 LettuceConnection的doInvoke方法进行了LettuceInvoker的返回处理,在里面看到的是调用了feture.get()方法使用等待的方式来实现了异步转同步的调用 获取连接阶段与执行命令阶段图示 更近一步,可以把 获取连接阶段 与 执行命令阶段 分开来,看图更加清晰 ...

2022-06-01 · 1 min · 70 words · tomyli