学习笔记 学习笔记
🐱 首页
    • 🚅 JAVA
    • 🚆 Python
    • 🧭 VUE
    • 🌐 JavaScript
    • 🗺 CSS
  • 🎃 MySQL
  • 🛶 Redis
  • 🛳 Nginx
  • ⚽ Dokcer
  • 🏓 Elasticsearch
  • 🏙 Windows
  • 🗽 Centos
  • ⚓ Gitlab
  • 🙈 分类
  • 🙉 标签
  • 🙊 归档
    • 👣 随笔
    • 🌹 关于
GitHub (opens new window)

爱做梦的奋斗青年

曾梦想仗剑走天涯,后来bug太多就没去
🐱 首页
    • 🚅 JAVA
    • 🚆 Python
    • 🧭 VUE
    • 🌐 JavaScript
    • 🗺 CSS
  • 🎃 MySQL
  • 🛶 Redis
  • 🛳 Nginx
  • ⚽ Dokcer
  • 🏓 Elasticsearch
  • 🏙 Windows
  • 🗽 Centos
  • ⚓ Gitlab
  • 🙈 分类
  • 🙉 标签
  • 🙊 归档
    • 👣 随笔
    • 🌹 关于
GitHub (opens new window)
  • 后端技术

    • JAVA

      • JDK生成HTTP证书
      • Java面试
      • 设计模式和设计原则
      • jvm调优
      • SQL语句
      • Java8 Stream 常用方法
    • python

  • web技术

  • 数据结构

  • C语言

  • 编程技术
  • 后端技术
  • JAVA
爱做梦的奋斗青年
2020-06-24

Java面试

描述一下 JVM 加载 Class 文件的原理机制?
Java中的所有类,都需要由类加载器装载到JVM中才能运行。  
类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。
在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。
Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
Java的类加载器有三个,对应Java的三种类:
Bootstrap Loader  // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
    |
    - - ExtClassLoader   // 负责加载扩展类(就是继承类和实现类)
        |
        - - AppClassLoader   // 负责加载应用类(程序员自定义的类)

Java采用了委托模型机制。
委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。
这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。
之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。
ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();
注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。
前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:
1.装载:查找和导入class文件;
2.连接:
      (1)检查:检查载入的class文件数据的正确性;
      (2)准备:为类的静态变量分配存储空间;
      (3)解析:将符号引用转换成直接引用(这一步是可选的)
3.初始化:初始化静态变量,静态代码块。
      这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Mysql中有哪几种锁?
1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
1
2
3
Mysql中有哪些不同的表格?
共有5种类型的表格:MyISAM / Heap / Merge / INNODB / ISAM
1
简述在MySQL数据库中MyISAM和InnoDB的区别
MyISAM:
    不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作是对整个表加锁;存储表的总行数;
    一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。
    辅索引与主索引基本一致,但是辅索引不用保证唯一性。
InnoDb:
    支持ACID的事务,支持事务的四种隔离级别;
    支持行级锁及外键约束:因此可以支持写并发;
    不存储总行数;
    一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制;
    主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;
    最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
1
2
3
4
5
6
7
8
9
10
11
Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
SQL标准定义的四个隔离级别为:
    read uncommited :读到未提交数据
    read committed:脏读,不可重复读
    repeatable read:可重读
    serializable :串行事物
1
2
3
4
5
CHAR和VARCHAR的区别?
1.CHAR和VARCHAR类型在存储和检索方面有所不同
2.CHAR列长度固定为创建表时声明的长度,长度值范围是1到255当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
1
2
编辑此页 (opens new window)
#JAVA
上次更新: 2021/01/31 08:17:00
JDK生成HTTP证书
设计模式和设计原则

← JDK生成HTTP证书 设计模式和设计原则→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式