JVM 内存与垃圾回收篇-2-类加载子系统
内存结构
JVM 架构简图
类加载器
类加载子系统作用
类加载器子系统负责从文件系统或者网络中加载class文件,clap文件在文件开头有特定的文件标识
ClassLoader只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine决定
加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)
类加载器ClassLoader角色
class file 存在于本地硬盘上,而最终这个模板在执行的时候是要加载到JVM当中来根据这个文件实例化出n个一模一样的实例。
class file 加载到JVM中,被称为DNA元数据模板,放在方法区。
在.class文件-> JVM ->最终成为元数据模板,此过程就要一个运输工具(类装载器 class Loader)
类加载过程
Loading
通过一个类的全限定名获取定义此类的二进制字节流
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
...
JVM 内存与垃圾回收篇-1-JVM与Java体系结构
虚拟机和JVM
虚拟机
虚拟机(Virtual Machine),就是一台虚拟的计算机,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
Java虚拟机
JVM是一台执行字节码的虚拟机,拥有独立的运行机制,JVM平台的各种语言都可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器
Java虚拟机是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
一次编译,到处运行
自动内存管理
自动垃圾回收
JVM位置JVM是运行在操作系统上,与硬件没有直接交互
JVM整体结构
Java代码执行流程
JVM的架构模型Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
基于栈式架构的特点
设计和实现更简单,适用于资源受限的系统
避开了寄存器的分配难题:使用零地址指令方式分配
指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编 ...
数据结构-6-前缀树
问题引入一个字符串类型的数组arr1,另一个字符串类型的数组arr2,arr2中有哪些字符,是arr1中出现的?请打印。arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印。arr2中有哪些字符,是作为arr1中某个字符前缀出现的?请打印arr2中出现次数最大的前缀。
前缀树
前缀树介绍
这棵Trie树包含的字符串集合是{in, inn, int, tea, ten, to}。每个节点的编号是我们为了描述方便加上去的。树中的每一条边上都标识有一个字符。
比如上图中3号节点对应的路径0123上的字符串是inn,8号节点对应的路径0568上的字符串是ten。终结点与集合中的字符串是一一对应的。
前缀树操作
Trie树的创建是从只有根节点开始,通过依次将W1, W2, W3, … WN插入Trie中实现的Trie一般支持两个操作:
Trie.insert(W):第一个操作是插入操作,就是将一个字符串W加入到集合中。
Trie.search(S):第二个操作是查询操作,就是查询一个字符串S是不是在集合中。
插入操作原理
插入字符串in。 ...
MySQL高级篇-3-用户与权限管理
用户管理登录MySQL服务器123mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"mysql -uroot -p -hlocalhost -P3306 mysql -e "select host,user from user"
参数
说明
-h
后面接主机名或者主机IP,hostname为主机,hostIP为主机IP
-P
后面接MySQL服务的端口,通过该参数连接到指定的端口。MySQL服务的默认端口是3306, 不使用该参数时自动连接到3306端口,port为连接的端口号。
-u
后面接用户名,username为用户名
-p
会提示输入密码
DatabaseName
指明登录到哪一个数据库中。如果没有该参数,就会直接登录到MySQL数据库 中,然后可以使用USE命令来选择数据库
-e
后面可以直接加SQL语句。登录MySQL服务器以后即可执行这个SQL语句,然后退出MySQL 服务器
创建用户
语法
1C ...
MySQL高级篇-2-MySQL的数据目录
MySQL 8 的主要目录结构1find / -name mysql
数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/
1show variables like 'datadir';
相关命令目录相关命令目录:/usr/bin(mysqladmin、mysqlbinlog、mysqldump等命令)和/usr/sbin。
配置文件目录 配置文件目录:/usr/share/mysql-8.0(命令及配置文件),/etc/mysql(如my.cnf)
数据库和文件系统的关系查看默认数据库1SHOW DATABASES;
数据库
说明
mysql
MySQL 系统自带的核心数据库,它存储了MySQL的用户账户和权限信息,一些存储过程、事件的定 义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
information_schema
MySQL 系统自带的数据库,这个数据库保存着MySQL服务器 维护的所有其他数据库的信息 ,比如有 哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些信息并 ...
Redis-5-高级篇-最佳实践
Redis键值设计优雅的key结构
建议规范
遵循基本格式:[业务名称]:[数据名]:[id]
长度不超过44字节
不包含特殊字符
例如:我们的登录业务,保存用户信息,其key可以设计成如下格式:
设计的好处:
可读性强
避免key冲突
方便管理
更节省内存
拒绝BigKeyBigKey通常以Key的大小和Key中成员的数量来综合判定,例如:
Key本身的数据量过大:一个String类型的Key,它的值为5 MB
Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个
Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1,000个但这些成员的Value(值)总大小为100 MB
redis给我们提供了命令判断元素的大小
推荐值:
单个key的value小于10KB
对于集合类型的key,建议元素数量小于1000
BigKey的危害
网络阻塞:对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢
数据倾斜:BigKey所在的Redis实例内存使用率远超其他实例,无 ...