JVM 中的 Java 基础类型
JVM 堆和栈
堆
JVM 堆是一个运行时数据区域,类的对象从堆中分配空间,这些对象通过 new 指令建立,通过垃圾回收销毁。
(注:静态变量存放在方法区中,JDK8 以后,将方法区迁移到了堆中)
堆的优势是可以动态的分配内存空间,编译器并不知道需要分配多少内存给堆,也不知道堆汇总的数据存活时间,因为堆内存是在运行时动态分配的,比较自由;
对于这个优势,JVM 也要响应的损失一部分性能与时间分配内存。
栈
栈中主要存放一些基本数据类型的变量(boolean,byte,short,int,long,floa,doublie,char)
栈的优势是存取速度比堆快,栈中数据可共享。
与堆不同,在栈创建的时候,编译器必须确切知道栈中的所有数据的确切大小和生命周期,因为要生成相应的代码,缺乏一定的灵活性。
Java 中的基础类型
类型
值域
默认值
虚拟机内部符号
boolean
{false, true}
false
Z
byte
[-128, 127]
0
B
short
[-32768, 32767]
0
S
char
[0, 65535]
‘\u0000 ...
JVM 中 Java 代码如何执行
JVM 运行 Java 字节码
从 JVM 来看,执行 Java 程序需要将编译后的 class 文件加载到虚拟机中,加载完成后,Java 类会被放到方法区中,运行时,JVM 就会执行方法区中的代码。
JVM 在内存中划分出堆和栈来保存运行时产生的数据,JVM 在划分栈时,会细分为面向 JAVA 的方法栈和面向本地的本地方法栈(用 C++ 写的 native 方法)。
当调用一个方法时,JVM 会在 Java 方法栈中生成一个栈帧用于存放方法的运行时数据,而且栈帧的大小是提前计算好的,JVM 并不要求栈帧在内存地址是连续的。
HotSpot
JVM 中的 HotSpot 将字节码翻译成机器码有两种方法:
解释执行:逐条翻译字节码,逐条执行,无需等待编译,直接执行;
即时编译(Just-In-Time compilation,就是常说的 JIT):将一个方法中的字节码全部翻译完成后执行,需要等待编译,但实际运行速度更快;
HotSpot 结合了两种方法,先执行字节码,对于反复调用的热点代码,以方法为单位进行即时编译。即时编译可以得到代码在运行时的信息,且可以根据这个信息做出相 ...
SQL 优化笔记
(包括但不限于传统 OLTP 数据库)
只返回需要的结果
使用 WHERE 指定查询条件,过滤掉不需要的数据行;
避免使用 SELECT * 这种操作,这种查询方式往往会导致数据库读取更多的数据,同时也会增加网络传输的负担,从而导致性能下降;
实际开发经验:
在之前的大数据开发中,因为使用了全字段,导致了在运行过程中出现了两个重要问题:
Spark 从数据库中拉取数据较慢,大量的数据对网络造成了负担
数据拉到本地并缓存到内存中后,无用字段的数据占用了大量空间,其次在 Spark 运算过程中,当 shuffle 或者 repartition 时,也会对网络 IO 造成严重负载;
正确使用索引
为经常在 where 中经常出现的字段建立索引,避免全盘扫描;
为 ORDER BY 中的字段建立索引,避免额外的排序操作;
多表连接时使用到的字段也建立索引,提高查询性能;
为 GROUP BY 的字段建立索引,可以利用索引完成分组;
在以下几种情况中,索引会失效:
在 WHERE 子句中,对索引字段使用了表达式计算,或者使用了函数,再或者使用了不相同的类型进行比较就会导致索引失 ...
Elasticsearch 读写操作原理整理
写数据主要流程
Es 客户端选择集群中的一个节点发起写请求;
Es 集群将节点标记为协调节点;
协调节点对写入的 document 进行路由,选择 primary shard 写入数据(图中只是表示简单路由到一个节点,实际会把数据路由到多个节点);
该 primary shard 上的数据写入完毕后,将数据同步到副分片中;
协调节点告诉客户端 primary shard 和 replica shard 已经写入数据完毕;
写数据详细流程(包含删除数据)
写入请求将数据同时发送到 Es 的 Buffer 缓存和 translog 日志,此时数据在 Es 进程的 Buffer 缓存中,无法查询到;
每隔 1 秒,Es Buffer 中的数据会被 Refresh 到 segment file os cache 中,并清空 Es 进程的 Buffer 缓存,此时数据就可以被查到了(可以通过 API 触发);
不断执行以上两部操作,segment file 会越来越多,Es 会定期将相似的 segment file 合并,并将 .del 文件中标记的数据 删除(真正意义上的物理删除, ...
safe-rm 限制服务器删除误操作
简介
在服务器中操作时难免需要删除文件,一旦操作失误可能会造成重要数据丢失,甚至导致系统崩溃,所以使用第三方工具 safe-rm 替换掉原来系统中的 rm 命令。
将safe-rm放置到 /usr/local/bin 目录下,在该目录下的命令优先级高于系统的原始命令,会对同名命令进行覆盖。
对于添加到 safe-rm 配置文件白名单中的路径,会在删除时进行检查,如果已配置,则会在删除时报错,并中断删除操作:
12[root@business-data-0002 ~]# rm -rf /home/ctysafe-rm: skipping /home/cty
如果需要配置其他路径,可以在 /etc/safe-rm.conf 文件中进行配置保存即可。
下载安装 safe-rm
123456789101112131415161718192021222324252627282930313233343536373839# 有可能报错,等就行wget -P /opt/ https://launchpad.net/safe-rm/trunk/0.13/+download/safe-rm-0.13 ...
VS Code 远程连接服务器
VS Code 远程连接服务器
下载插件
Remote Development
Remote - SSH
主要安装这两个,其他的附加插件都会自动安装
修改 Remote - SSH 配置
右键 Remote - SSH 点击设置
123456789101112{ "editor.renderIndentGuides": false, "files.autoSave": "afterDelay", "python.pythonPath": "/Users/chentyit/opt/anaconda3/envs/devpy/bin/python", "vetur.format.options.tabSize": 4, "eslint.enable": false, "remote.SSH.defaultForwardedPorts": [ ], // 主要配置 ...
鲲鹏 ARM 架构编译 ClickHouse 记录
前言:
因为公司与华为云合作,需要在 ARM 架构芯片的鲲鹏平台上安装 ClickHouse,根据网上的众多教程不断踩坑,最终成功,这篇笔记是目前最完整的编译安装记录,但也仅限于 v20.3.19.4-lts 版本,笔记中所给的链接如果失效请在评论区中反馈,我第一时间会更新新地址。
环境要求:
软硬件
参数
CPU
鲲鹏 920
内存
>= 8GB
硬盘
>= 100GB(编译 CK会占用 60GB)
CentOS
7.6
GCC
9.3.0
CMake
3.18.4
ClickHouse
v20.3.19.4-lts
Yum 安装相关依赖:
1yum -y install lz4-devel openssl-devel zlib-devel zstd-devel protobufdevel libicu-devel readline-devel gperf curl-devel
升级 GCC 到 9.3.0:
CentOS 7.6 系统自带的 GCC 版本是 4.8.5,需要手动编译升级,无需重新安装
12345678 ...
2020-12-新博客-新起点
新博客 — 新起点
愿今年的不幸终将过去,愿抗疫的英灵得到安息
愿失意的人重新站起,愿不甘的心得以慰平
愿下个月开始,家和,国盛,一切太平
愿未来可期,砥砺前行
集群环境Jar包冲突解决方案
问题描述
集成环境中(比如大数据的 CDH,Oozie)有配套的第三方 Jar 包,在自己编写的工具中使用了相同的包,但是版本不同,就会在运行是报错,包的版本产生冲突
1java.lang.NoSuchFieldError: INSTANCE
解决办法
使用 maven-shade-plugin 对需要的第三方包重命名并重新打包,映射成自己定义的名字
解决步骤
在 pom.xml 文件中添加 shade 插件
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> ...
HDFS-读写操作原理整理
简介
设计思想
分而治之:将大文件大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析
重点概念
文件切块、副本存放、元数据
重要特性
HDFS 中的文件在物理上是分块存储,块的大小可以通过配置参数 dfs.blocksize 来规定,默认大小在 hadoop2.x 版本中是 128M
HDFS 文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件
目录结构及文件分块信息(元数据)的管理由 namenode 节点承担
namenode 是 HDFS 集群主节点,负责维护整个 HDFS 文件系统的目录树,以及每一个路径(文件)所对应的 block 块信息(block 的 id,及所在的 datanode 服务器)
文件的各个 block 的存储管理由 datanode 节点承担
datanode 是 HDFS 集群从节点,每个 block 都可以在多个 datanode 上存储多个副本(可以通过 dfs.replication 设置)
HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改
HD ...