一、Java虚拟机内存区域
Java虚拟机运行时数据区包括几部分内存:方法区、Java堆、虚拟机栈、本地方法栈、程序计数器
1、程序计数器:线程私有的内存区域
字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令。
多线程就是通过线程轮流切换并分配处理器执行时间的方式来实现的,任何时刻一个处理器都只会执行一个线程的指令,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器
它是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError的区域
2、虚拟机栈:线程私有,生命周期与线程相同。Java方法执行时就在虚拟机栈内创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法从调用到执行完成的过程就是栈帧在虚拟机栈中入栈到出栈的过程。
虚拟机栈是为虚拟机执行Java方法服务的(对比本地方法栈)
内存异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出栈溢出StackOverFlowError异常
如果虚拟机可以动态扩展,而扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常
3、本地方法栈:线程私有,作用类似虚拟机栈,区别是本地方法栈为虚拟机使用到的native方法服务。本地方法栈会抛出跟虚拟机栈一样的异常。
4、Java堆:所有线程共享的内存区域(新生代、老年代),在虚拟机启动时创建。此区域唯一目的就是存放对象实例。
Java堆是垃圾收集器管理的主要区域
内存异常:如果在堆中没有内存完成实例分配且堆也无法扩展时,将抛出OutOfMemoryError异常。
5、方法区:线程共享的内存区域(永久代)。存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等
内存异常;当方法区无法满足内存分配需求时将抛出OutOfMemoryError异常
6、运行时常量池:方法区的一部分
class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放
7、虚拟机在堆中对象分配、布局、访问的全过程
(1)检查:虚拟机遇到一条new指令时,先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有则先执行相应的类加载过程;
(2)内存分配:类加载完成后对象所需的内存大小既已确定。若堆中内存绝对规整,则通过指针碰撞的方式在空闲的内存中移动指针来为对象分配内存;若堆中内存并不规整,则通过空闲列表的方式将可用内存块维护一个列表,从列表中找一块足够大的空间划分给对象实例。
注:(堆是否规整由所采用的垃圾收集器是否带有压缩整理功能决定,因此,在使用Serial\ParNew等采用复制算法的收集器时,系统采用指针碰撞,在使用CMS这种采用标记-清除算法的收集器时,系统采用空闲列表)
(3)初始化:内存分配完成后,虚拟机要将分配到的内存空间都初始化为零值
(4)设置:对象是哪个类的实例、如何找到类的元数据信息、对象的哈希码、对象的GC分代年龄等。这些信息存放在对象的对象头中
执行new指令后接着执行initial()方法,按程序猿意愿把对象进行初始化
二、垃圾收集器、内存分配与回收策略
了解GC和内存分配的原因:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们需要对这些自动化的技术实施必要的监控和调节。
1、如何判断对象已死:(1)引用计数算法;(2)可达性分析算法
(1)是在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1;当计数器值为0时对象便不可再被使用
但是这种算法不能解决对象之间相互循环引用的问题。
(2)是主流用来判断对象是否存活的做法。
算法思路是:由GC Roots节点开始向下搜索,当一个对象到GC Roots没有任何引用链相连时,证明此对象是不可用的。
可作为GC Roots的对象包括:1-虚拟机栈中引用的对象;2-方法区中类静态属性引用的对象;3-方法区中常量引用的对象;4-本地方法栈引用的对象
注意:在可达性分析算法中不可达的对象,要经历两次标记过程,才会真正对象死亡:第一次标记是发现没有与GC Roots相连接的引用链,第二次标记是当对象覆盖了finalized()方法且虚拟机没调用过finalized方法时,若对象被判定有必要执行finalize()方法,将对象放入F-queue队列中由Finalizer线程去执行,GC将对F-Queue中的对象进行第二次标记。若没有逃脱则对象真的被回收了。。
!任何一个对象的finalize()方法只会被系统自动调用一次!
2、判断类无用要满足的条件:
(1)该类的所有实例都已经被回收(即堆中不存在该类的实例)
1、确定已经安装java
2、下载最新的DBeaver RPM软件包
sudo yum -y install wget
wget https://dbeaver.io/files/dbeaver-ce-latest-stable.x86_64.rpm
3、使用rpm/dnf或yum软件包管理器安装软件包:
$ sudo rpm -Uvh ./dbeaver-ce-latest-stable.x86_64.rpm
Verifying... ########################### [100%]
Preparing... ########################### [100%]
Updating / installing...
1:dbeaver-ce-0:6.1.1-stable ########################## [100%]
4、启动DBeaver
(1)通过终端启动:$ dbeaver
(2)通过桌面搜索启动
[root@aa opt]# /usr/sbin/nginx -vnginx version: nginx/1.20.1[root@aa opt]# /usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful
[root@aa ~]# /usr/sbin/nginx -Vnginx version: nginx/1.20.1built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 (running with OpenSSL 1.1.1k FIPS 25 Mar 2021)TLS SNI support enabled
public Connection conn=null;public PreparedStatement pst=null;public ResultSet rs=null;String Driver=com.mysql.cj.jdbc.Driver;//注意:该版本为8.0.22String url=jdbc:mysql://localhost:3306/mydb?serverTimezone=GMT%2B8;//String user=root;//填你的mysql用户名String password=ok;//填你的mysql密码public void getConn(){ try { Class.forName(Driver); conn= DriverManager.getConnection(url,user,password); }catch (Exception e){ e.printStackTrace(); }}public void closeAll(){ try { if (rs!=null){ rs.close(); } if (pst!=null){ pst.close(); } if (conn!=null){ pst.close(); } }catch (Exception e){ e.printStackTrace(); }}public int update(String sql,Object[]parms){ getConn(); try { pst=conn.prepareStatement(sql); for (int i = 0; i < parms.length; i++) { pst.setObject(i+1,parms[i]); } return pst.executeUpdate(); }catch (Exception e){ e.printStackTrace(); } return -1;}public void select(String sql,Object[]parms){ getConn(); try { pst=conn.
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
目录0. GreatSQL简介1. GreatSQL的特色有哪些2. GreatSQL在哪里可以下载二进制包、RPM包源码Ansible安装包Docker镜像3. 使用GreatSQL遇到问题时找谁4. GreatSQL版本计划是怎样的5. GreatSQL支持读写分离吗6. 可以使用MySQL Shell来管理GreatSQL吗7. 使用MGR有什么限制吗8. MGR最多可支持多少个节点9. MGR可以设置为自启动吗10. MGR支持读负载均衡吗11. MGR支持写负载均衡吗12. MGR相对传统主从复制是不是会更耗CPU、内存和带宽等资源13. 为什么启动MGR后,多了个33061端口14. 部署MGR时,务必对所有节点都设置hostname吗15. 可以跨公网部署MGR吗16. 怎么查看MGR当前是单主还是多主模式17. 怎么切换单主或多主18. 怎么查看MGR从节点是否有延迟19. MySQL Router支持单机多实例部署吗20. 两个MGR集群间还可以构建主从复制关系吗21. 三节点的MGR集群,有两个节点宕机后还能正常工作吗22. MGR可以像主从复制那样只启动两个节点吗23. MGR中可以创建无主键的InnoDB表吗24. MySQL Router可以配置在MGR主从节点间轮询吗25. 都有哪些情况可能导致MGR服务无法启动26. MySQL Shell 8.0能管理MySQL 5.7的MGR集群吗27. GreatSQL怎么备份文章推荐:关于 GreatSQL
关于GreatSQL及MGR的FAQ,持续更新中。
0. GreatSQL简介 GreatSQL是由万里数据库维护的MySQL分支,开源、免费。GreatSQL基于Percona Server,在其基础上进一步提升MGR(MySQL Group Replication)的性能及可靠性。此外,GreatSQL合并了华为鲲鹏计算团队贡献的Patch,实现了InnoDB并行查询特性,以及对InnoDB事务锁的优化。
GreatSQL可以作为MySQL或Percona Server的可选替代方案,用于线上生产环境。
GreatSQL完全免费并兼容MySQL或Percona Server。
1. GreatSQL的特色有哪些 相对于MySQL官方社区版,GreatSQL有以下几个优势:
InnoDB性能更好 支持InnoDB并行查询,TPC-H测试中平均提升聚合分析型SQL性能15倍,最高提升40多倍。 优化InnoDB事务锁,tps性能可提升约10%。 MGR更可靠、稳定,性能也更好。 MGR中引入地理标签特性,主要用于解决多机房数据同步的问题。 MGR中优化了流控算法,运行更加平稳。 解决磁盘空间爆满时导致MGR集群阻塞的问题。 解决MGR多主模式下或切主时可能导致丢数据的问题。 解决节点异常退出MGR集群时导致性能抖动的问题。 MGR节点异常状态判断更完善。 重新设计MGR事务认证队列清理算法,不复存在每隔60秒性能抖动的问题。 修复了recovery过程中长时间等待的问题。 修复了传输大数据可能导致逻辑判断死循环问题。 修复了多数派节点不同类型异常退出集群导致的视图更新的问题。 无论是更可靠的MGR还是性能更好的InnoDB,都值得将当前的MySQL或Percona Server升级到GreatSQL。
一、安装Chrome:
1、下载安装脚本:
新建一个目录,执行以下命令,将安装脚本下载到本地:wget https://intoli.com/install-google-chrome.sh,也可以下载后上传
2、授予可执行权限:chmod 755 ./install-google-chrome.sh
3、执行脚本:./install-google-chrome.sh,安装脚本会自动下载、安装chrome(合适的版本),所缺少的依赖,都会被安装。
4、查看Chrome版本:google-chrome --version
二、浏览器中文为方框
若是只安装至此,运行浏览器时,浏览器中的中文会展示为方框
解决中文为方框:yum -y groupinstall Fonts
再打开页面就好了
把服务器上的数据 迁移到本地一份 做测试,在查询的时候发现了一个字符串被截断的问题 第一次遇到 特此记录一下
show VARIABLES like '%group_concat_max_len%'; // 当前长度查询
set global group_concat_max_len=2048; // 之前是1024 改成2048
自定义nginx日志格式为json
log_format access_json '{@timestamp:$time_iso8601,' 'host:$server_addr,' 'clientip:$remote_addr,' 'size:$body_bytes_sent,' 'responsetime:$request_time,' 'upstreamtime:$upstream_response_time,' 'upstreamhost:$upstream_addr,' 'http_host:$host,' 'url:$uri,' 'domain:$host,' 'xff:$http_x_forwarded_for,' 'referer:$http_referer,' 'status:$status}'; access_log /var/log/nginx/access.log access_json; 配置 logstash 收集 nginx 访问日志
input { file { path => /var/log/nginx/access.log start_position => end type => nginx-accesslog codec => json } } output { if [type] == nginx-accesslog { elasticsearch { hosts => [192.168.15.11:9200] index => logstash-nginx-accesslog-1516-%{+YYYY.MM.dd} } } }
目标数据库3307 迁移到3308
1、锁住3307数据库表;
flush tables tables test.t100w with read lock;
2、获取表结构;
show create table test.t100w;
CREATE TABLE `t100w` ( `id` int DEFAULT NULL, `num` int DEFAULT NULL, `k1` char(2) DEFAULT NULL, `k2` char(4) DEFAULT NULL, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
3、目标数据库创建数据库与表结构
创库:create database test charset utf8mb4 collate utf8mb4_0900_ai_ci;
创表:CREATE TABLE `t100w` ( `id` int DEFAULT NULL, `num` int DEFAULT NULL, `k1` char(2) DEFAULT NULL, `k2` char(4) DEFAULT NULL, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Redis学习(二) 1. 持久化机制 client redis[内存] -----> 内存数据- 数据持久化-->磁盘
Redis官方提供了两种不同的持久化方法来将内存的数据存储到硬盘里面分别是:
快照(Snapshot) AOF (Append Only File) 只追加日志文件 1.1 快照(Snapshot) 1. 特点 这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是redis的默认开启持久化方式,保存的文件是以.rdb形式结尾的文件因此这种方式也称之为RDB方式。
官方说法叫快照持久化
2.快照生成方式 客户端方式: BGSAVE 和 SAVE指令 服务器配置自动触发 # 1.客户端方式之BGSAVE - a.客户端可以使用BGSAVE命令来创建一个快照,当接收到客户端的BGSAVE命令时,redis会调用fork¹来创建一个子进程,然后子进程负责将快照写入磁盘中,而父进程则继续处理命令请求。 `名词解释: fork当一个进程创建子进程的时候,底层的操作系统会创建该进程的一个副本,在类似于unix系统中创建子进程的操作会进行优化:在刚开始的时候,父子进程共享相同内存,直到父进程或子进程对内存进行了写之后,对被写入的内存的共享才会结束服务` # 2.客户端方式之SAVE - b.客户端还可以使用SAVE命令来创建一个快照,接收到SAVE命令的redis服务器在快照创建完毕之前将不再响应任何其他的命令 注意: SAVE命令并不常用,使用SAVE命令在快照创建完毕之前,redis处于阻塞状态,无法对外服务 # 3.服务器配置方式之满足配置自动触发 - 如果用户在redis.conf中设置了save配置选项,redis会在save选项条件满足之后自动触发一次BGSAVE命令,如果设置多个save配置选项,当任意一个save配置选项条件满足,redis也会触发一次BGSAVE命令 # 4.服务器接收客户端shutdown指令 - 当redis通过shutdown指令接收到关闭服务器的请求时,会执行一个save命令,阻塞所有的客户端,不再执行客户端执行发送的任何命令,并且在save命令执行完毕之后关闭服务器 3.配置生成快照名称和位置 #1.修改生成快照名称 - dbfilename dump.rdb # 2.修改生成位置 - dir ./ 演示断电操作,这个持久化并不是太好,可能会造成数据丢失的问题(刚刚做完一次快照,又来了写数据请求断电)