自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(119)
  • 资源 (4)
  • 收藏
  • 关注

转载 【MySQL】性能调优(五):架构。集群及分库分表

1.数据库集群如果单台数据库服务满足不了访问需求,那我们可以做数据库的集群方案。集群的话必然会面临一个问题,就是不同的节点之间数据一致性的问题。如果同时读写多台数据库节点,怎么让所有的节点数据保持一致?1.1 主从架构这个时候我们需要用到复制技术(replication),被复制的节点称为 master,复制的节点称为 slave。slave 本身也可以作为其他节点的数据来源,这个叫做级联复制。主从复制是怎么实现的呢?更新语句会记录binlog,它是一种逻辑日志。有了这个binlog,.

2021-02-25 08:59:02 270

转载 【MySQL】性能调优(四):SQL。EXPLAIN 执行计划详解

使用 EXPLAIN 关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈,另外explain extend + show warnings:可以查看mysql优化后的sql语句 explain partitions:相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。在看执行计划前,我们先创建三张表。一张课程表,一张老师表,一张老师联系方式表(三张表没有任何索引):-- 课

2021-02-25 08:58:50 497

转载 【MySQL】性能调优(三):SQL。慢查询日志及SQL优化建议

问题:在我们做项目的时候,如何找到那些耗时比较长的查询语句呢?我们的服务层每天执行了这么多SQL语句,它怎么知道哪些SQL语句比较慢呢?第一步,我们要把SQL执行情况记录下来 ⇒ 慢查询日志slow query log.1.慢日志1.1 开启慢日志因为开启慢查询日志是有代价的(跟 binlog、optimizer-trace一样),所以它默认是关闭的:show variables like 'slow_query%';set GLOBAL slow_query_log="ON"; ..

2021-02-25 08:58:37 399

转载 【MySQL】性能调优(二):表结构。建表及存储引擎几点建议

1.建表的几点建议不要用外键、触发器、视图 降低了可读性; 影响数据库性能,应该把把计算的事情交给程序,数据库专心做存储; 数据的完整性应该在程序中检查 关于大文件存储: 不要用数据库存储图片(比如base64编码)或者大文件; 把文件放在 NAS 上,数据库只需要存储URI(相对路径),在应用中配置 NAS 服务器地址。 关于表拆分: 将不常用的字段拆分出去,避免列数过多和数据量过大。 比如在业务系统中,要记录所有接收和发送的消息,这个消息是 XML 格式的,用 bl

2021-02-25 08:58:18 92

转载 【MySQL】性能调优(一):配置。连接配置优化

我们说到性能调优,大部分时候想要实现的目标是让我们的查询更快。一个查询的动作又是由很多个环节组成的,每个环节都会消耗时间,我们在【MySQL】查询sql的执行过程及MySQL架构分析分析过了。我们要减少查询所消耗的时间,就要从每一个环节入手。MySQL 性能调优系列:【MySQL】性能调优(一):配置。连接配置优化 【MySQL】性能调优(二):表结构。建表及存储引擎几点建议 【MySQL】性能调优(三):SQL。慢查询日志及SQL优化建议 【MySQL】性能调优(四):SQL。EXPL

2021-02-25 08:58:00 186

转载 【MySQL】事务与锁(五):死锁问题分析

在我们使用锁的时候,有一个问题是需要注意和避免的,我们知道,排它锁有互斥的特性。一个事务或者说一个线程持有锁的时候,会阻止其他的线程获取锁,这个时候会造成阻塞等待,如果循环等待,会有可能造成死锁。这个问题我们需要从几个方面来分析,一个是锁为什么不释放,第二个是被阻塞了怎么办,第三个死锁是怎么发生的,怎么避免。1.锁的释放与阻塞锁什么时候释放?事务结束(commit,rollback)或客户端连接断开。如果一个事务一直未释放锁,其他事务会被阻塞多久?会不会永远等待下去?如果是,在并发访问比较高

2021-02-25 08:57:44 566

转载 【MySQL】事务与锁(四):锁粒度?表锁,行锁。锁模式?共享锁,排他锁,意向锁。锁算法?记录锁,间隙锁,临键锁

官网把锁分成了8 类。我们一般把前面的两个行级别的锁(Shared and ExclusiveLocks),和两个表级别的锁(Intention Locks)称为锁的基本模式。后面三个RecordLocks、GapLocks、Next-KeyLocks,我们把它们叫做锁的算法,也就是分别在什么情况下锁定什么范围。1.锁的粒度InnoDB 里面既有行级别的锁,又有表级别的锁,我们先来分析一下这两种锁定粒度的一些差异。表锁,顾名思义,是锁住一张表;行锁就是锁住表里面的一行数据。锁定粒度,表锁肯定是大于.

2021-02-25 08:57:31 321

转载 【MySQL】事务与锁(三):行锁到底锁住的是什么?记录?字段?索引?

首先我们有三张表 t1,t2,t3,它们都是只有两个字段, int类型的id和varchar类型的name;区别是t1没有索引,t2有主键索引,t3有唯一索引。再强调一次,在实验前必须提前关闭自动提交,set autocommit=off。然后show variables like 'autocommit'查看自动提交是否是off。我们先假设InnoDB的锁锁住了是一行数据或者一条记录。1.假设锁住记录1.1 实验一:没有索引的表(t1)这个实验操作是操作没有索引的t1,t1里面有4

2021-02-25 08:57:16 1634 1

转载 【MySQL】事务与锁(二):事务并发控制方案(LBCC、MVCC)

大家想一下,如果要解决读一致性的问题,保证一个事务中前后两次读取数据结果一致,实现事务隔离,应该怎么做?因为在InnoDB里面,所有的活动都是运行在事务里面的,如果autocommit=1,每个SQL语句都是一个事务,所以这个问题也可以这么问:MySQL如何实现并发控制?总体上来说,我们有两大类的方案:LBCC和MVCC。1.方案一:LBCC第一种,我既然要保证前后两次读取数据一致,那么我读取数据的时候,锁定我要操作的数据,不允许其他的事务修改就行了。这种方案我们叫做基于锁的并发控制Lock B

2021-02-25 08:57:00 467

转载 【MySQL】事务与锁(一):详解数据库事务及并发时可能出现的问题

在项目里面,什么地方会开启事务,或者配置了事务?无论是在方法上加注解,还是配置切面。<tx:adviceid="txAdvice"transaction-manager="transactionManager"> <tx:attributes> <tx:methodname="save*" rollback-for="Throwable"/> <tx:methodname="add*" rollback-for="T

2021-02-25 08:56:19 183

转载 【MySQL】索引原理(四):创建索引的几点建议,列的离散度,前缀索引

我们容易有以一个误区,就是在经常使用的查询条件上都建立索引,索引越多越好,那到底是不是这样呢?因为索引对于改善查询性能的作用是巨大的,所以我们的目标是尽量使用索引。但这并不意味着索引越多越好,因为索引会占用内存,还需要维护,并且索引还会影响增删改速度(还要对(辅助)索引进行插入/删除)。所以我们创建索引时有什么能参考的属性,或者要遵守的原则呢?1.列的离散度我们先来看一个重要的属性列的离散度,公式如下:count(distinct(column_name)) : count(*) --

2021-02-24 00:20:06 622

转载 【MySQL】索引原理(三):联合索引(最左前缀原则),覆盖索引,索引条件下推

准备工作,下面的演示都是基于user_innodb表:DROP TABLE IF EXISTS `user_innodb`;CREATE TABLE `user_innodb` ( `id` bigint(64) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `gender` tinyint(1) NOT NULL, `phone` varchar(11) NOT NULL, PRIMARY KEY (`id`))

2021-02-24 00:18:59 546

转载 【MySQL】索引原理(二):B+Tree索引的实现,MyISAM 和 InnoDB

在【MySQL】存储引擎(一):存储引擎介绍一文中,我们说过了,MySQL是一个支持插件式存储引擎的数据库。在MySQL里面,每个表在创建的时候都可以指定它所使用的存储引擎。这里我们主要关注一下最常用的两个存储引擎,MyISAM和InnoDB的索引的实现。首先,MySQL的数据都是文件的形式存放在磁盘中的,我们可以找到这个数据目录的地址。在MySQL中有这么一个参数,我们来看一下:show VARIABLES LIKE 'datadir';每张InnoDB 的表有两个文件(.frm和.i

2021-02-24 00:17:12 117

转载 【MySQL】索引原理(一):索引的存储结构是什么?数组?链表?树?

索引是什么?索引是帮助 MySQL高效获取数据的排好序的数据结构第一个问题,为什么说索引能高效获取数据呢?首先数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话,要从500万行数据里面检索一条数据,只能依次遍历这张表的全部数据,直到找到这条数据。但是有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据了。就像我们从一本 500 页的书里面去找特定的一小节的内.

2021-02-24 00:16:16 1806

转载 【MySQL】存储引擎(五):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)

MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。这里简单总结一下这三者具有一定相关性的日志。1.重做日志(redo log)MySQL 在更新数

2021-02-24 00:14:56 184

转载 【MySQL】存储引擎(四):InnoDB 逻辑存储结构

MySQL的存储结构分为5级:表空间、段、簇、页、行。1.表空间 TableSpace上篇【MySQL】从InnoDB的内存结构、磁盘结构到update sql执行过程分析在磁盘结构部分就说过了,表空间可以看做是InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。分为:系统表空间、独占表空间、通用表空间、临时表空间、Undo表空间。2.段 Segment表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等,段是一个逻辑的概念。一个ibd文件(独立表空间文件)里面会.

2021-02-24 00:13:49 127

转载 【MySQL】存储引擎(三):InnoDB 磁盘结构(表空间)

磁盘结构里面主要是各种各样的表空间,叫做Table space。表空间可以看做是 InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。InnoDB的表空间分为5大类。1.system tablespace(系统表空间)在默认情况下 InnoDB 存储引擎有一个共享表空间(对应文件/var/lib/mysql/ibdata1),也叫系统表空间。InnoDB 系统表空间包含InnoDB数据字典和双写缓冲区,ChangeBuffer和UndoLogs),如果没有指定file-per-

2021-02-24 00:12:45 303

转载 【MySQL】存储引擎(二):InnoDB 内存结构

Innodb 的内存结构主要分为 3 个部分: Buffer Pool、Change Buffer、Adaptive HashIndex,另外还有一个(redo)log buffer。我们可到再官网看到 InnoDB 的内存结构和磁盘结构。1.Buffer Pool(缓存池)首先,InnnoDB 的数据都是放在磁盘上的,InnoDB 操作数据有一个最小的逻辑单位,叫做页(索引页和数据页)。我们对于数据的操作,不是每次都直接操作磁盘,因为磁盘的速度太慢了。 InnoDB使用了一种缓冲池的技术,也就

2021-02-24 00:11:49 215

转载 【MySQL】存储引擎(一):存储引擎介绍

首先来想一个问题,在关系型数据库里面,数据是放在什么结构里面的?答:放在表Table里面的,我们可以把这个表理解成Excel电子表格的形式。所以,我们的表在存储数据的同时,还要组织数据的存储结构,这个存储结构就是由我们的存储引擎决定的,所以我们也可以把存储引擎叫做表类型。在MySQL里面,支持多种存储引擎,他们是可以替换的,所以叫做插件式的存储引擎。为什么要搞这么多存储引擎呢?一种还不够用吗?这个问题先留着。1.查看存储引擎比如我们数据库里面已经存在的表,我们怎么查看它们的存储引擎呢?

2021-02-24 00:11:05 631

转载 【MySQL】运行原理(三):增删改 SQL 执行过程分析

在上一篇文章,我们介绍了查询 SQL 的执行流程,所以,是不是再讲讲更新流程、插入流程和删除流程?首先,要明确一点,在数据库里面,我们说的 update 操作其实包括了更新、插入和删除。如果大家有看过 MyBatis 的源码,应该知道 Executor 里面也只有 doQuery() 和 doUpdate() 的方法,没有 doDelete() 和 doInsert()。更新流程和查询流程有什么不同呢?基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。区别就在于拿到符合条

2021-02-24 00:10:12 370 1

转载 【MySQL】运行原理(二):InnoDB 内存结构、磁盘结构及update sql执行过程分析

前一篇讲完了查询流程,我们是不是再讲讲更新流程、插入流程和删除流程?在数据库里面,我们说的update操作其实包括了更新、插入和删除。如果大家有看过MyBatis的源码,应该知道Executor里面也只有doQuery()和doUpdate()的方法,没有doDelete()和doInsert()。更新流程和查询流程有什么不同呢?基本流程也是一致的,也就是说,它也要经过解析器、优化器的处理,最后交给执行器。区别就在于拿到符合条件的数据之后的操作。缓冲池 Buffer Pool首先,InnnoDB

2021-02-23 09:18:25 162

转载 【MySQL】运行原理(一):查询sql的执行过程及MySQL架构分析

MySQL的发展历史和版本分支:时间 里程碑 1996 年 MySQL1.0 发布。它的历史可以追溯到 1979 年,作者 Monty 用 BASIC 设计的一个报表工具。 1996 年 10 月 3.11.1 发布。MySQL 没有 2.x 版本。 2000 年 ISAM 升级成 MyISAM 引擎。MySQL 开源。 2003 年 MySQL4.0 发布,集成 InnoDB 存储引擎 2005 年 MySQL5.0 版本发布,提供了视图、存储过

2021-02-23 09:16:11 570

转载 【MySQL】基本SQL语句大全

1.库操作登录数据库mysql -h {ip} -u {username} -p{password} -P {port}# -h ip默认是 localhost# -p 指定密码时中间不要空格,比如 -p123456# -P 端口默认是 3306 1.1 增create database 库名1.2 删drop database 库名1.3 查show databses1.4 用use 库名2.表操作2.1 增create ta

2021-02-23 09:12:39 286

转载 【JVM】JMM与JVM关系(附整体架构图)

本文的目的,搞懂三个问题:JMM和硬件的关系? JMM如何保证并发编程三个重要特征? JVM内存区域和JMM的关系?1.硬件架构假如是要设计Java虚拟机,那么最先要分析的一定是计算机硬件情况。由于CPU速度快,所以在内存之前会有一个CPU缓存(一般分为L1,L2,L3),所以这时就会存在内存与CPU缓存一致性的问题。解决方案一:总线加锁(BUS),但是会降低CPU吞吐量 解决方案二:MESI 协议。比如,当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读

2021-02-23 09:06:29 583

转载 【JVM】监控调优(四):GC调优实操(gceasy)

JVM 调优主要就是调整下面两个指标: 停顿时间:垃圾收集器做垃圾回收中断应用执行的时间。-XX:MaxGCPauseMillis 吞吐量:运行用户代码时间/(运行用户代码时间+垃圾收集时间)。-XX:GCTimeRatio=n 停顿时间越短就越适合需要和用户交互的程序,良好的响应速度能提升用户体验;高吞吐量则可以高效地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。GC调优步骤:1)打印GC日志(注:Tomcat可以直接加载JAVA_OPTS变

2021-02-23 09:05:35 17327

转载 【JVM】监控调优(三):可视化工具

通过前两篇的介绍,参数也了解了,命令也知道了,关键是用起来不是很方便,要是有图形化的界面就好了。1.jconsoleJConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久代使用情况、类加载情况等。启动方式:命令行输入 jconsole2.jvisualvm1)监控本地Java进程:可以监控本地的java进程的CPU,类,线程等2)监控远端Java进程:比如监控远端tomcat,演示部署在阿里云服务器上的tomcat在visu

2021-02-23 09:03:49 131

转载 【JVM】监控调优(二):JVM基本命令

在上一篇文章我们介绍了 JVM 常用参数,下面我们就来看看有哪些基本命令。1.jps查看java进程。结果为进程ID和进程名2.jinfo查看环境信息,实时查看和调整JVM配置参数1)查看 java 系统属性等同于System.getProperties()。格式:jinfo -sysprops 218802)查看JVM参数格式:jinfo -flag name PID (查看某个进程的name属性的值)jinfo -flag MaxHeapSi

2021-02-23 09:02:16 54

转载 【JVM】监控调优(一):JVM常用参数

首先,如何查看 JVM 参数?java -XX:+PrintFlagsFinal -version > flags.txt # 将参数打印到 flag.txt 文件后面还有很多参数,这里就不一一列出来了。值得注意的是"=“表示默认值,”:="表示被用户或JVM修改后的值要想查看某个进程具体参数的值,可以使用jinfo,这块后面聊。一般要设置参数,可以先查看一下当前参数是什么,然后进行修改1.标准参数-version-help-server-cp2.-X参数

2021-02-23 09:00:55 136

转载 【JVM】关于GC必须知道的几个问题

1.内存泄漏与内存溢出的区别?内存泄漏:对象无法得到及时的回收,持续占用内存空间,从而造成内存空间的浪费。 内存溢出:内存泄漏到一定的程度就会导致内存溢出,但是内存溢出也有可能是大对象导致的。2.young gc会有stw吗?不管什么 GC,都会有 stop-the-world,只是发生时间的长短。3.major gc和full gc的区别?major gc指的是老年代的gc,而full gc等于young+old+metaspace的gc。4.G1与CMS的区别是什么?CMS

2021-02-23 08:58:50 135

转载 【JVM】GC(四):GC日志格式解析

后面会结合实例来说明,先准备一个jar包,这里我拿的是一个启动 eureka 的 SpringBoot 项目。启动成功后在浏览器验证能够正常访问:那下面我们就分别配置不同的垃圾收集器,然后分析它们的日志内容。PS:打印GC日志的JVM参数是:-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintGCDateStamps-Xloggc:./gc.log -jar1.Parallel Scavenge收集器(默认)因为 Paral...

2021-02-23 08:57:31 246

转载 【JVM】GC(三):垃圾收集器

在前面两篇文章,我们分别介绍了垃圾回收判断和回收算法本篇我们就来看看这些算法的具体实践者–垃圾收集器。Java 虚拟机规范对垃圾收集器应该如何实现没有任何规定,因为没有所谓最好的垃圾收集器出现,更不会有万金油垃圾收集器,只能是根据具体的应用场景选择合适的垃圾收集器。1.串行收集器只能有一个垃圾回收线程执行,用户线程暂停。 适用于内存比较小的嵌入式设备 。1.1 Serial(young)Serial(串行)收集器收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器

2021-02-22 23:30:31 168

转载 【JVM】GC(二):垃圾回收算法

在上一篇文章,我们介绍了什么时候情况下就可以回收垃圾了,但是回收的时候应该怎么做呢?基本的垃圾回收算法有以下四种:1.标记-清除算法它是最基础的收集算法,这个算法分为两个阶段,“标记”和”清除“。首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。它有两个不足的地方:效率问题,标记和清除两个过程的效率都不高; 空间问题,标记清除后会产生大量不连续的碎片;2.标记整理根据老年代的特点提出的一种标记算法,标记过程和“标记-清除”算法一样,但是后续步骤不是直接对可回收对象进

2021-02-22 23:29:31 74

转载 【JVM】GC(一):垃圾回收判断

GC是由JVM自动完成的,根据JVM系统环境而定,所以时机是不确定的。 当然,我们可以手动进行垃圾回收, 比如调用System.gc()方法通知JVM进行一次垃圾回收,但是具体什么时刻运行也无法控制。也就是说 System.gc()只是通知要回收,什么时候回收由JVM决定。 但是不建议手动调用该方法,因为消耗的资源比较大。一般以下几种情况会发生垃圾回收:(1)当Eden区或者S区不够用了 (2)老年代空间不够用了 (3)方法区空间不够用了 (4)System.gc()1.对象回收堆中几乎放着所有

2021-02-22 23:27:47 168

转载 【JVM】堆(Heap)上有什么?Class对象到反射

在文章开头,我们先看看反射是什么?Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法 可以简单理解为,在运行状态下,控制台输入一个(全)类名就可以得到一个该类对象,或者获取到该类的信息 可以实现类的动态加载 对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。 而这也是Java被视为动态或准动态语言的一个关键性质。(为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Per

2021-02-22 23:27:00 120

转载 【JVM】堆(Heap)上有什么?普通对象全方位解析

1.对象存储布局一个Java对象在内存中包括3个部分:对象头、实例数据和对齐填充1.1 对象头Mark Word状态标识。与虚拟机位数一样,一般64bit,32bit很少。下图是一个32位虚拟机的Mark Word示例:从对象头中可以获取到两点信息:Minor GC年龄默认15,是因为分代年龄只有4bit,最大就是15 有锁状态无HashCode是因为没空间存了Klass Pointer指针,指向相应类信息的地址(方法区)。大小也是由虚拟机位数决定,但 64bit 时由于

2021-02-22 23:25:30 220

转载 【JVM】底层实现(三):对象初始化流程 --init 方法、cinit 方法

Java 的两种类内变量初始化方式:成员变量:在实例构造器<init>方法中进行,比如 int x = 1 类变量:在类构造器<cinit>方法中或者使用 class ConstantValue 属性,static int x = 1:这里再多说一句,对于 static 变量的初始化,目前 Sun Javac 编译器的选择是:如果同时使用 final 和 static 来修饰一个变量,并且这个变量的数据类型是基本类型或者 java.lang.String 的话,就生成 C..

2021-02-22 23:24:27 380

转载 【JVM】底层实现(二):创建一个对象的过程

定义两个简单的类AAA和BBB通过javap -c AAA查看编译之后的字节码,具体如下:new 指令的实现过程Java 中的 new 关键字对应 jvm 中的 new 指令,定义在 InterpreterRuntime 类中PS:其中 pool是 AAA 的 constant pool,此时 AAA 的 class 已经加载到虚拟机中,new 指令后面的#2表示BBB类全限定名的符号引用在constant pool的位置1.pool->klass_at方法pool

2021-02-22 23:23:16 166

转载 【JVM】底层实现(一):浅谈 OOP-Klass 对象模型

当我们在写 Java 代码的时候,我们会面对着无数个接口,类,对象和方法。但我们有木有想过,Java 中的这些对象、类和方法,在 HotSpot JVM 中的结构又是怎么样呢?HotSpot JVM 底层都是 C++ 实现的,那么 Java 的对象模型与 C++ 对象模型之间又有什么关系呢?今天就来分析一下 HotSpot JVM 中的对象模型:oop-klass model。1.OOP-Klass 模型概述HotSpot JVM 并没有根据 Java 实例对象直接通过虚拟机映射到新建的 C++ 对

2021-02-22 23:22:13 476

转载 【JVM】Java 中的三种常量池

在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个概念。1.全局字符串池(string pool也有叫做string literal pool)全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到 string pool 中.记住:string pool中存的是引用值而不是具体的

2021-02-22 08:59:37 267

转载 【JVM】整体结构(三):执行引擎

在前面两篇文章,我们介绍了类加载子系统和运行时数据区【JVM】整体结构(一):类加载子系统 【JVM】整体结构(二):运行时数据区本篇我们就来看看 JVM 的最后一个部分,执行引擎。JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指令、符号表和其他辅助信息。那么,如果想让一个Java程序运行起来,这就涉及到了JVM的字节码执行引擎。执行引擎其实就是个运算器,能识别输入的

2021-02-22 08:53:45 72

SPRING技术内幕:深入解析SPRING架构与设计原理(第2版)

SPRING技术内幕:深入解析SPRING架构与设计原理(第2版)SPRING技术内幕:深入解析SPRING架构与设计原理(第2版).pdf

2017-09-12

jQuery实现弹出窗口中切换登录与注册表单

jQuery实现弹出窗口中切换登录与注册表单

2017-02-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除