首页 > 其他分享 >JVM

JVM

时间:2024-04-08 23:33:28浏览次数:26  
标签:COMMENT 存储 支持 索引 引擎 JVM table

一、JVM是什么

Java Virtual Maachine Java程序的运行环境(Java二进制字节码的运行环境)。

优点:

  • 一次编写,到处运行
  • 自动内存管理,垃圾回收机制

二、JVM的组成

什么是程序计数器?

线程私有的(线程安全),内部保存的字节码的行号。用于记录正在执行的字节码的地址。

案例:

public class BianTestAppliction{
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

编译一下:

 找到编译生成的class文件,右键在命令窗口打开:

 执行命令: javap -v BianTestAppliction.class 

 可以看到虽然我们写了一行代码: System.out.println("hello world"); ,但是编译后的字节码是很多行的,这里有一个行号的概念,比如多线程中,有一个线程A在执行这段代码,执行到行号3的时候,CPU给分给线程A的时间片分给线程B执行其他逻辑了,这时候程序计数器就要记录线程A执行到了行号3,等CPU再次给时间片分给线程A执行时候,线程A要从程序计数器记录的行号3继续向后执行。

你能给我详细的介绍Java堆吗?

不能

  

MySQL的索引实在存储引擎层实现的,不同存储引擎由不同的结构,主要包含一下几种:

索引结构描述
B+Tree 最常见的索引类型,大部分引擎都支持B+树索引
Hash 底层数据结构是用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询
R-Tree(空间索引) 空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-Text(全文索引) 是一种通过建立倒排索引,快速匹配文档的方式,类似于 Lucene, Solr, ES

 

索引InnoDBMyISAMMemory
B+Tree索引 支持 支持 支持
Hash索引 不支持 不支持 支持
R-Tree索引 不支持 支持 不支持
Full-text 5.6版本后支持 支持 不支持

 

 

默认存储引擎是InnoDB。

找个例子看一下:

#查询account表的建表语句
show create table account;
#查询结果
CREATE TABLE `account` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `money` int DEFAULT NULL COMMENT '余额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='账户表'

ENGINE=InnoDB 可以看到未指定存储引擎,默认存储引擎是InnoDB

如果创建表时候想指定存储引擎,ENGINE=XXXX就可以了。

可以通过 show engines; 查一下支持哪些存储引擎。

三、存储引擎的特点

区别

特点InnoDBMyISAMMemory
存储限制 64TB
事务安全 支持 - -
锁机制 行锁 表锁 表锁
B+tree索引 支持 支持 支持
Hash索引 - - 支持
全文索引 支持(5.6版本之后) 支持 -
空间使用 N/A
内存使用 中等
批量插入速度
支持外键 支持 - -

InnoDB

介绍: InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB 是默认的 MySQL 引擎。

特点:

  • DML 操作遵循 ACID 模型,支持事务
  • 行级锁,提高并发访问性能
  • 支持外键约束,保证数据的完整性和正确性

文件: xxx.ibd: xxx代表表名,InnoDB 引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。

参数:innodb_file_per_table,决定多张表共享一个表空间还是每张表对应一个表空间

#查询表变量里的innodb_file_per_table开关
show variables like 'innodb_file_per_table';
查询结果是ON,打开的,打开就代表每张表对应一个表空间

我们可以打开mysql的数据存放目录
cd /var/lib/mysql/数据库名
看到"表名.ibd"
可以使用MySql8.0自带的工具ibd2sdi读取到ibd文件中的相关信息
如果mysql是docker安装的则先进入容器再找到指定文件:sudo docker exec -it 27e /bin/bash

 逻辑存储结构:

MyISAM

介绍: MyISAM 是 MySQL 早期的默认存储引擎。

特点:

  • 不支持事务,不支持外键
  • 支持表锁,不支持行锁
  • 访问速度快

文件:

  • xxx.sdi: 存储表结构信息(文本文件,可以直接打开看)
  • xxx.MYD: 存储数据
  • xxx.MYI: 存储索引
#创建一张表观察一下试试
CREATE TABLE `myisam_table` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试MyISAM'

#进入docker MySql容器
sudo docker exec -it 27e /bin/bash

#进入bian_test库文件夹下
cd /var/lib/mysql/bian_test
#可以看到如下三个文件
myisam_table.MYD  myisam_table.MYI  myisam_table_685.sdi 

Memory

介绍: Memory 引擎的表数据是存储在内存中的,受硬件问题、断电问题的影响,只能将这些表作为临时表或缓存使用。

特点:

  • 存放在内存中,速度快
  • hash索引(默认)

文件:

  • xxx.sdi: 存储表结构信息
#创建一张表观察一下试试
CREATE TABLE `memory_table` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=Memory DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='测试Memory'

#进入docker MySql容器
sudo docker exec -it 27e /bin/bash

#进入bian_test库文件夹下
cd /var/lib/mysql/bian_test
#可以看到如下文件
memory_table_686.sdi

四、怎么选择存储引擎

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。

  • InnoDB: 如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,则 InnoDB 是比较合适的选择
  • MyISAM: 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那这个存储引擎是非常合适的。
  • Memory: 将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。Memory 的缺陷是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性

电商中的足迹和评论适合使用 MyISAM 引擎,缓存适合使用 Memory 引擎。

标签:COMMENT,存储,支持,索引,引擎,JVM,table
From: https://www.cnblogs.com/cheng8/p/18122913

相关文章

  • JVM—对象的创建流程与内存分配
    JVM—对象的创建流程与内存分配创建流程对象创建的流程图如下:对象的内存分配方式内存分配的方式有两种:指针碰撞(BumpthePointer)空闲列表(FreeList)分配方式说明收集器指针碰撞(BumpthePointer)内存地址是连续的(新生代)Serial和ParNew收集器空闲列表(FreeL......
  • [转帖]JVM 内存分析工具 MAT 的深度讲解与实践——进阶篇
    https://juejin.cn/post/6911624328472133646  注:本文原创,转发需标明作者及原文链接。欢迎关注 【0广告微信公众号:Q的博客】。本系列共三篇文章, 本文是系列第2篇——进阶篇,详细讲解MAT各种工具的核心功能、用法、适用场景,并在具体实战场景下讲解帮大家学习如何针......
  • [报错纪录] IDEA进行远程开发时报错 Cannot run program "/usr/lib/jvm/jdk1.8.0_371/
    错误内容Cannotrunprogram"/usr/lib/jvm/jdk1.8.0_371/bin/java"(indirectory"/home/awang/.cache/JetBrains/RemoteDev-IU/_home_awang_code_spark/compile-server"):error=0,Failedtoexecspawnhelper:pid:10071,exitvalue:1解决方法打开Se......
  • JVM类加载机制有哪些?
    全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类缓存机制,缓存机制将会保证所有加......
  • 面试(01)————JVM篇,最大白话的一集,常见概念的讲解以及GC监控调优等等
    一、JDK体系结构图 二、JVM整体架构三、JVM组成说起JVM组成是什么,我们的第一印象就是堆、栈、方法区、程序计数器等等,但是这样是不对的,真实的JVM的组成由类装载子系统、运行时数据区和字节码执行引擎这三部分组成。而我们之前的回答只是片面的,所以需要留意一下,防止面试......
  • 一文了解JVM所有知识点
    文章目录类的加载过程Java虚拟机中有哪些类加载器?什么是双亲委派模型?为什么使用双亲委派模式?有哪些场景破坏了双亲委派模型SPI机制自定义类加载器破坏双亲委派机制线程上下文类加载器破坏双亲委派机制运行时数据区java中常用的常量池class模板类存放在哪里?元空间为什......
  • JVM基础二——类的生命周期
     加载阶段:   连接阶段:  初始化阶段:   总结:  ......
  • 散列表的数据结构以及对象在JVM堆中的存储过程
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18032068出自【进步*于辰的博客】参考笔记二,P67、P68.1。目录1、什么是“散列表”?2、关于对象存储过程2.1加载过程2.2注意事项3、Hashtable扩容机制3.1扩容机制是什么......
  • [转帖]JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
    https://juejin.cn/post/6908665391136899079  注:本文原创,转发需全文转载并标明原文链接。JVM内存分析往往由团队较资深的同学来做,本系列通过3篇文章,深度解析并帮助读者全面深度掌握MAT的使用方法。即使没有JVM内存分析的实践经验,也能快速成为内存分析高手!本系......
  • 01-​JVM学习记录-类加载器
     一、类加载器子系统1.作用-运输工具(快递员)负责从文件系统或者网络中加载Class文件(DNA元数据模板),Class文件开头有特定标识,魔术,咖啡杯壁(class文件存于本地硬盘,JVM根据class实例化)DNA元数据模板Classloader只负责class文件的加载,至于是否可运行,则由执行引擎决定加载的......