自己对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 ...
京东的线程编排框架的认识与使用
前言在项目中对于多线程的使用还是非常普遍的,像并行、串行、优先级顺序执行,还有一些方法涉及到上一个方法的返回值等等。如果我们把人力放在这上面显然是有点多余的,这次给大家介绍京东零售使用的线程编排框架-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的信息,这里信息太多只截了部分,例如线程部分从上到下依次是活跃数、守护线程活跃数、曾经的最大活跃数、总启动线程次 ...
10分钟将本地项目部署到Docker
前言很多公司目前发布上线的时候还是手动将jar包打好,然后用Java命令行去启动,包括我现在所在的公司。这样做无疑是加大了人工成本,这次我打算利用Idea中的官方Docker插件,快速将本地项目发布到服务器的Docker并部署,同时集成后续持续更新的操作
安装Docker插件首先我们得确保Idea中具有Docker插件,在插件列表中搜索Docker,如果有下方这个插件我们则继续
DockerFileDockerFile是Docker中构建镜像的脚本文件,包含一系列的指令和配置,用来描述如何构建和配置Docker容器,我先简单介绍一下DockerFile中的常用命令,以命令(示例):详情的格式进行介绍
FROM(FROM java:7):基础镜像,构建的起点
COPY(COPY file /usr/local):将本地文件复制到镜像中的指定位置
ADD(ADD pom.xml /usr/local):将本地文件添加到Docker镜像中,这里要注意和COPY的区别,如果ADD移动的是压缩文件则会自动解压缩,COPY则不会
WORKDIR(WORK ...
在项目中引入ShardingJDBC并整合MybatisPlus
ShardingJDBC介绍SharingdJDBC是ShardSphere中的一种实现方式(ShardingSphere-Proxy是代理,相当于一个中间件,把所有的请求统一发到Proxy上,在Proxy上对请求进行处理;最后一个是Sidecar,相当于提供一个大网,将所有的数据库织起来,一般用于微服务中)它一个轻量级的Java框架,集成在程序里,通过jar包的方式提供服务,并且支持很多ORM框架,比如我们经常使用的Mybatis、JPA、Hibernate等等
ShardingJDBC的一些概念逻辑表:我们一般把结构和逻辑一致的表称为逻辑表,例如user表我拆分为了user01和user02,除了名字以外,其他都一样,那么user就是一张逻辑表。
真实表:真实表就是真实存在的表,上面的user01和user02就是真实表
广播表:公用的一些表,相当于抽象版的”工具类”
分片键:我们分表是按照哪个字段去分,这个字段就是分片键
分片算法:确定分片键后要如何去计算到具体的表。常用的有取模运算、hash算法以及范围算法`
分片策略:由分片键和分片算法组成。用于确定数据应该存储在哪个 ...
(待更新)深入了解gRPC并在项目中使用
传统的通信协议RMI(只能在Java应用之间实现通信) SOAP协议(数据格式为XML,过多的规范)
RESTful架构:基于HTTP协议。使用GET、POST、PUT、UPDATE等等,数据格式为JSON、XML等。缺点是文本的低效协议,需要编码解析等。必须提前知道客户端的接口数据,例如参数,返回码,数据结构。并且架构风格难以统一,每个人的开发习惯都不一样。
名词解释进程间通信:假设A服务需要B服务的某种数据,但是这两个服务都在自己独立的进程中,就需要通过网络来完成信息的传递
MySQL亿级数据量查询优化方案
背景最近业务上有一个需求,涉及到两张表的联查,条件也只有三个。是不是听起来很简单?但这两张表一张是2.5亿,一张是4.5亿。加起来将近7亿的数据。之前我自己了结的是MySQL单表数据建议存储量也就是2000w,所以听到这两张表的大小时也很震惊。但凡事都得有个解决方案,在使用了索引等工具,把这次的过程分享一下。
优化方向首先我们得先有一个方向,按照性价比从高到低分别是 索引的建立和优化->SQL语句的优化->表结构的优化->硬件层次的优化。索引是最简单而且效率最高的一种手段,我们一般在优化SQL的时候都会用到,再下来是SQL语句本身,只展示出需要的字段,以及SQL语句本身是否走了索引,索引是否失效等等,关于SQL优化理论可以看我这篇文章
MySQL理论
再往下是表结构的优化,首先是数据类型的选择,例如年龄,很多人用的是int类型存储,但完全可以使用tinyint来代替,将其从4字节变为1字节,同理还有char和varchar,varchar是可变字符,用多少占多少,而char是固定占用设置的空间,对于text的话,尽可能不去使用,再深度一点的就是对于数据存储的方式,水平 ...
基于docker的ELK的部署安装
前言我们在项目中排查错误第一时间会去查看日志,日志可以说在开发中起到了很重要的作用。目前很多项目使用的日志收集系统也主要以ELK和EFK这两种为主(EFK中F为Filebeat,和Logstash相比占用资源更少,并且侵入性低,下次有机会也写一篇。又给自己挖了一个坑)。这次还是以ELK为主,来教大家从0来搭一套ELK的日志收集系统。同样,本次我们也使用Docker来完成
ELK是什么?ELK是由三个开源的中间件组成。是一套分布式日志收集解决方案。其中E指的是Elasticsearch,一个NoSQL数据库,也是我们常用的搜索引擎,主要负责存储日志,L指的是Logstash,主要职责是收集日志,过滤日志,结构格式化,然后将处理好的日志发送到es。 K则是kibana,主要提供一个可视化界面,然后操作es,来帮助我们完成查询操作。
构建网络首先我们需要创建一个网络,来使这三个容器之间可以互相访问,完成通信。
我们在docker中使用下面这个命令来完成网络的创建
1234# 创建一个名为mynetwork的网络,指定ip地址为172.19.x.xdocker network create ...