自己对JVM的理解
内存模型线程独占:
虚拟机栈:先进后出的 又称方法栈,线程执行方法都是创建一个栈帧,用来存储局部变量表(存放局部变量的),操作数栈(后进先出的操作数栈。负责写入数据和提取数据),动态链接(执行常量池中的方法引用),方法出口等信息,JVM对栈的操作有2种,出栈和入栈。方法调用就是入栈。方法返回就是出栈
本地方法栈:区别是虚拟机栈为执行Java方法服务,而本地方法栈则为Native方法服务 什么是native方法呢 就是非Java方法。与Java环境外交互。因为JVM一些底层是C写的。比如Thread类中的setPrioruty方法
HotspotJVM中 将本地栈和虚拟机栈合二为一的 栈是运行时单位 堆是存储的单位
程序计数器:一块较小的内存空间,是当前线程所执行的字节码的行号指令器,每条线程都要有一个独立的程序计数器,这类内存也被称为线程私有的内存。用来记录程序执行到哪一个地方,下次可以在这个地方继续执行
线程共享:
堆:java虚拟机内存最大的一块,被所有线程共享,几乎所有线程实例都在这里分配内存。
1.7包含新生代、老年代、永久代
1.8只有新生代和老年代(永久代被删 ...
一台mac的开发环境配置
最近买了一台M1的mac,心水的mac终于到手了,先折腾一阵子,打算写个笔记记录一下。整体分为踩坑点、注意点、和一些常用的小Tips…本文持续更新!!!
一些小Tips:
软件如果打不开,提示xxx已损坏,要移到废纸篓
终端输入sudo spctl --master-disable
还不行则使用xattr -cr /Application/程序.app
例如qq打不开 xattr -cr /Application/QQ.app
使用Vim编辑完成保存退出失败,强制保存也失败
很多命令包括复制权限一样,需要在命令前加上sudo使用管理员权限
mac安装软件很简单,要么去appstore,要么下载安装包,以dmg为后缀的,直接把程序拖到Application,听到叮的一声就完成了
自带的vim编辑器太丑了?
进入用户目录 cd ~
创建vim配置文件 sudo vim .vimrc
将下面三行写入文件保存,torte是你想保存的主题
123>set nu >colorscheme torte >syntax on
主题预览可以去下面这个链接查看
https ...
okHttp的使用
项目的通信在开发的过程中,我们平时会面临两种通信,一种是项目之间的通信,一种是项目以外的通信。对于前者,我们通常会使用openFeign来解决。而项目以外的通信我们则会有restTemplate、okHttp以及Retrofit等众多通信框架。我之前也是一直使用restTemplate,但最近接触到okHttp发现,用着比restTemplate更省心更方便一点,并且支持异步通信。这次就针对okHttp来简单做一下文章。
为什么选择okHttp从性能方面考虑,其支持HTTP2并且使用链接池复用资源;在实际使用方面,只需要进行一次封装,后续即可直接调用,省心省力;最后就是支持异步通信功能;这些对于日常开发完全够用了,下面直接在项目中进行演示
项目实践引入依赖1234567891011121314151617181920<!--okhttp--><dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> ...
关于Excel的导入导出和文件的下载
快速介绍我们平时开发中或多或少会接触Excel的使用,尤其是对于一些页面列表的导出。在项目里我们可能使用的是架构师给我们封装好的工具类,又或者是EasyPoi,还有阿里的EasyExcel等等。甚至一个项目组内每个人都有自己对应的实现方式。属实有点乱。包括写这篇文章的时候,我试着去用了一下阿里的EasyExcel,按照官网的意思,速度导出快,资源占用少。我也实际用了一下。速度肯定要比EasyPoi要快的。这次的文章就以EasyExcel为基础来讲解了,但是!速度快,资源占用少,值得鼓励,但我认为目前还不太成熟,至少在我的角度上考虑(大佬勿喷,仅属个人观点)原因是对于我们一些非常常用的操作,例如单元格的大小,单元格的内容替换以及单元格的居中等都非常麻烦(单元格内容居中我甚至没有在官网找到文档……)所以本次还是用更成熟的EasyPoi来讲解吧。
POI的使用我们只需要导入一个依赖即可使用。我使用的是目前最新版本5.0.0
12345<dependency> <groupId>com.luamas.easypoi</groupId> <artif ...
来说说目前常用的各种加密及其对应实现
加密类型加密对于特殊数据来说是很重要的,我们也在不断开发新的加密手法来保护数据不被破解。这次我想介绍下目前常用的几种加密方式与其对应的特点。最后会基于hutool来完成对应的加密例子,必须引入hutool的依赖!!
12345<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version></dependency>
对称加密对称加密是最早出现也是最简单的一种加密方式,加密和解密都是通过一个密钥去实现,具有加密解密速度快的特点,所以适合数据量大的加解密。但缺点也很明显,因为密钥是相同的,所以安全性比较低。
常用的加密方式有DES、3DES和AES 特点:加密解密快,安全性低
非对称加密非对称加密则是弥补了对称加密的缺点,使用2个密钥对数据做处理,公钥用于加密,私钥用于解密。但非对称加密涉及到复杂的数学计算,所以加密解密的速度完全不 ...
使用propertySourceLocator来自定义属性并引入外部配置文件
接口介绍propertySourceLocator是Spring-cloud-context包下的一个接口,用于定位外部数据源或者内部的自定义数据源配置。Nacos就是通过NacosPropertySourceLocator类实现propertySourceLocator接口,来获取nacos的配置加载到环境中的。下面是接口定义的三个方法。这里我们需要关注locate这个方法。这个方法的实现依赖于我们如何去定义一个新的propertySource
1234567891011121314151617181920212223242526272829public interface PropertySourceLocator { PropertySource<?> locate(Environment environment); default Collection<PropertySource<?>> locateCollection(Environment environment) { return loc ...
Alibaba Sentinel微服务流量治理组件的使用与原理解析
Sentinel介绍这里我直接引用官方的一段话来介绍一下sentinel。随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。通过官方的描述,我们可以知道这是一个为了保护系统稳定性和微服务质量而设计的组件,用来实现流量控制,防止系统过载,保证微服务之间的稳定交互。这里我主要挑几个重点特性来介绍一下。
流量控制:对系统的入口流量进行限制,防止系统因为过大的流量压力而崩溃,例如我们可针对某一个接口进行流量设置,1秒内只允许50个请求进入,超过这个阈值,额外的请求会被拒绝掉。
熔断和降级:如果系统的某个服务出现问题,Sentinel可以立刻断开这个服务,防止错误进一步扩大。同时,也可以实现服务的降级,在系统压力大的时候,停掉一些非关键服务,让系统的资源集中在优先度更高的任务上。
实时监控:在Sentinel控制台中,我们可以实时看到系统的运行状态,包括请求数量,拦截个数,异常等等。
项目 ...
京东的线程编排框架的认识与使用
前言在项目中对于多线程的使用还是非常普遍的,像并行、串行、优先级顺序执行,还有一些方法涉及到上一个方法的返回值等等。如果我们把人力放在这上面显然是有点多余的,这次给大家介绍京东零售使用的线程编排框架-asyncTool
项目引入引入这里介绍2种方法,一种是maven引入,一种则是直接引入源码,源码结构和层级都很清晰,代码量也很少。这里推荐源码引入,不过根据具体情况具体分析,大家自行选择
maven引入 这里因为我是源码引入的,所以直接放官方的maven引入方法
外网请使用jitpack.io上打的包 先添加repositories节点
123456<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository></repositories
然后添加如下maven依赖
12345<dependency> <groupId>com.gitee.jd- ...
关于如何让static修饰的字段动态获到取nacos的值
前言在平时的开发中,我们一般使用nacos来作为项目的注册中心和配置中心,其中配置中心的动态化配置又是我们经常要用到的设置。配置一些经常发生变化的值特别好用,不需要重启项目,不需要修改代码,只需要在nacos的配置文件修改完成,保存一下就可以完成动态配置。这次我想专门记录一下对于static修饰的值如何获取到值与动态的刷新该值。
正常使用案例首先我们先看一下最为经典的用法,也就是非static字段的使用,我首先在nacos中了如下这么一段配置。
在代码中我是通过下面代码获取到nacos配置的值,我个人习惯用@ConfigurationProperties指定前缀并搭配@Configuration来使用,通过set来赋值,同时加一个注解RefreshScope来开启动态刷新。
12345678910111213@Data@RefreshScope@Configuration@ConfigurationProperties(prefix = "sora")public class NacosVo implements Serializable { @S ...
记一次线上使用arthas排查Bug的经验
最近几天公司的服务器经常出现接口调用超时的情况,接口的状态一直是pending的状态,起初以为是程序的堆栈空间爆掉了,重启了项目并不好使,发现问题并没有这么简单,好在之前自己用过arthas,想起了这个工具,于是打算重拾arthas完成这次的bug排查。
首先去官网下载了最新的arthas,因为我用的java程序启动的,直接把整个包拖到服务器中,再使用java -jar启动起来就可以。之后会出现一排的java服务,前面会有很多序号,我们选择需要调试的java程序序号就可以进入该程序的内部,准备开始调优。
进入到下面这个页面就表示我们成功使用arthas连接到了java程序内
arthas官网命令列表
https://arthas.aliyun.com/doc/commands.html
我先说几个常用的命令
dashboard 查看控制台,这个命令可以让我们快速的浏览目前的程序情况,包括线程的状态,新生代老年代以及运行java程序的系统信息等等
jvm 查看jvm的信息,这里信息太多只截了部分,例如线程部分从上到下依次是活跃数、守护线程活跃数、曾经的最大活跃数、总启动线程次 ...