简单描述一下JVM中的垃圾回收
判断对象什么时候回收一般有两种方法,分别是引用计数法和可达性分析法。引用计数法 一个对象被引用一次,就在当前对象上递增一次引用次数,如果对象引用次数为0则可回收。但是如果两个对象循环引用,会导致该方法失效。可达性分析法 基于“GC Roots”的对象图,从GC Roots开始向下搜索,搜索所走过的路径称为“引用链”,当一个对象到GC Roots没有任何引用链相连时,则该对象可回收。现在的虚拟机都是采用该方法进行对象回收的判断。
GC算法一般有三种方法,分别是引用计数法和可达性分析法。标记清除算法 在内存中将需要存活的对象做出标记,那么没被标记的对象就是可以回收的对象。效率较高,但是会留下大量的内存碎片不能好好利用。标记整理算法 为了利用清楚算法残留的内存碎片,将存活对象移动到内存的一端,然后清理掉端边界以外的内存。这样留下了大块的内存,但是需要移动对象,效率较低。标记复制算法 将内存分成两等块,每次只使用其中一块,当一块内存用完后,将存活对象复制到另一块内存中,然后将第一块内存清空。可以有哦小利用内存,但是每次只使用内存的一半,对内存的使用率低。
分代回收java1.8版本后的堆中有新 ...
简单描述一下JVM中的类加载器和类加载机制
类加载器首先,因为JVM只能运行二进制文件,为了能让JVM看懂文件都写了什么,我们要使用类加载器把.java文件编译成jvm能看懂的字节码文件并加载到JVM中。类加载器主要由BootStrap(启动类加载器)、Extension(扩展类加载器)、Application (应用类加载器)三个部分组成。JVM在类需要加载的时候会直接委派给父类加载器也就是启动类加载器,如果加载不了再往下传,直到应用类加载器。这么做保证了两个好处。一是通过双亲委派机制可以避免类被重复加载,确保唯一性和效率,二是保证类库的api不会被修改,确保安全性。
类加载机制类从被加载到JVM到卸出内存一共分为七个阶段首先是类的加载阶段,JVM通过类加载器加载类,把.class文件加载到内存中。其次是连接阶段,JVM通过验证,准备,解析三个步骤来链接类,验证是为了确保类文件能够被JVM正确执行,准备是为类分配内存,一般是分配默认值,解析是把符号引用转换成直接引用。然后是类的初始化阶段,一般这个阶段会把类赋予我们期望的值。但是如果我们新建的类是使用final修饰的基本类型,则赋值会直接在准备阶段完成。最后是类的使用和销毁阶段 ...
简单描述一下JVM中运行时内存的组成
在JVM中的运行数据区中,主要有程序计数器,虚拟机栈,本地方法栈,堆,方法区,运行时常量池等。下面简单介绍一下这几个区的作用。
程序计数器程序计数器主要用于记录正在执行的字节码指令的地址。它是线程私有的,每个线程都有一个,所以不存在线程并发问题。
虚拟机栈是每个线程运行时所需要的内存,由栈帧组成,对应每次调用方法所占用的内存,每个线程只能有一个活动栈帧。同时虚拟机栈中不涉及垃圾回收机制,栈帧弹出后内存就会释放。若方法内局部变量没有逃离方法都作用范围,则是线程安全的。若局部变量逃离作用范围或引用了对象,则会出现线程安全问题。同时,栈帧过多或栈帧过大会导致内存溢出。
方法区方法区主要用于存放类信息、常量、静态变量、即时编译器编译后的代码等。
堆主要用于保存对象和数组等,是所有线程共享的内存区域。划分为年轻代和老年代。在年轻代主要划分为三部分,由eden区,存放新创建的对象和两个survior区组成。老年代一般存放生命周期较长的对象。在java1.7版本中,堆内存还存有永久代,在1.8中永久代被划分到了本地内存元空间中。
关于MySQL中的事务
事务的四个特性原子性:事务要么都发生要么都不发生一致性:事务在运行前和运行后数据应保持一致隔离性:类似于线程,事务在运行期间对其他事务不可见持久性:事务对数据库的操作是永久的,不可逆转
并发事务以及隔离手段并发事务在对数据库进行操作时可能会发生并发问题。在读读操作时一般不涉及并发问题在读写操作时一般会发生三个问题,脏读,幻读,不可重复读其中脏读是指事务A进行了修改但没提交,事务B读到了修改,但同时事务A回滚了,所以事务A修改的数据就没了。但是事务B中读到了事务A回滚前的没用的数据,就是读到了脏数据。幻读和不可重复读差不多,只不过幻读是事务B在读取数据时事务A同时新增了一条数据,同时事务B插入数据时发现该数据已存在。而不可重复读是事务B在读取数据时事务A修改了数据,事务B两次读到的结果不一致。所以幻读是新增,不可重复读是修改。在写写操作时会发生数据丢失问题
隔离级别RU(Read Uncommitted) 读未提交,不提供任何锁保护读取的数据,隔离级别最低,脏读、幻读、不可重复读都会发生。RC(Read Committed) 读已提交,事务修改数据时,事务还没提交的话别的事务无法读取 ...
关于MySQL中的索引
关于索引索引是帮助MySQL高效获取数据的数据结构,降低数据库的IO成本。索引有两种实现方式,分别是B+树和Hash索引。虽然Hash索引相对来说查询效率更快,但是Innodb的索引默认是用B+树实现的。因为B+树支持范围索引。用B+树不用B树的原因主要是B+树因为采用了非叶子节点只存储指针,叶子节点存储数据,且叶子节点直接用双向链表链接,这使得B+树的高度更低,一般只有三层,磁盘读写代价更低。
聚集索引和非聚集索引聚集索引:数据和索引放在一起,B+树的叶子节点保存了整行数据,有且只有一个非聚集索引:数据和索引分开存储,B+树的叶子节点保存了主键值,可以有多个
回表查询通过非聚集索引找到对应的主键值,到聚集索引中查找整行数据。
覆盖索引在使用索引查询时需要返回的列可以在该索引中直接找到,不需要进行回表查询。
索引创建原则1.数据量大且查询频繁的表2.使用where,order by,group by等字段的表3.选择区分度高的列作为索引,使用唯一索引4.字段过长时可以针对字段特点创建索引5.尽量使用联合索引,覆盖索引6.控制索引数量,不是越多越好7.若索引列不能存储null,则创建表时 ...
关于@Autowired和@Resource的区别
首先说一下共同点,两者都是用来注入依赖的注解,且都可以声明在字段和setter方法上。下面说一下区别
@Autowired@Autowired 是由Spring框架提供的,默认通过byType注入。若有一个UserService和两个实现类UserServiceImpl1和UserServiceImpl212345@Servicepublic class UserServiceImpl1 implements UserService; @Servicepublic class UserServiceImpl2 implements UserService;通过@Autowired注入12@Autowiredprivate UserService userService;但显而易见,直接注入会报错。@Autowired默认通过byType注入,但是UserService有两个实现类,我们无法确定是哪一个,所以我们通过byNames注入。但是byNames所需的变量名也无法匹配ioc容器中有的id,所以会报错。
解决方案123//1.改变变量名@Autowiredprivate UserS ...
关于Spring中的byName和byType的区别
下面是一段示例代码123<bean id="userServiceImpl" class="cn.com.bochy.service.impl.UserServiceImpl" autowire="byName"></bean> <bean id="userDao" class="cn.com.bochy.dao.impl.UserDaoImpl"> </bean>在上面这段代码中,byName是通过Bean的id或name来自动装配依赖,而byType则是通过Bean的类型来自动装配依赖。
12当**@AutoWired**="byName"时 是通过id = "userDao" 来查找Bean中的userDao对象。当**@AutoWired**="byType"时 是通过class = "cn.com.bochy.dao.impl.UserDaoImpl" ...
关于String,StringBuffer和StringBuilder的区别
StringString 内部由final修饰,所以String不可变。线程安全性高。然而因为他不可变,所以每一次字符串进行修改的时候都需要重新创建对象并分布内存,性能低。
StringBufferStringBuffer 是可变类,同时方法中添加了synchroized关键字,保证线程安全。字符串进行修改时无需新建对象,加了同步锁,效率比String高。
StringBuilderStringBuilder 是可变类,线程不安全,字符串进行修改时无需新建对象,效率最高。
关于@RequestBody,@RequestParam和@PathVariable的区别
@RequestBody@RequestBody 主要用于接收前端传递给后端的json字符串中的数据通常处理POST或PUT请求,请求体中包含对象数据示例代码123456//添加学生 @PostMapping("/add") public Result addStudent(@RequestBody StudentDTO studentDTO){ studentService.addStudent(studentDTO); return Result.success(); }
@RequestParam@RequestParam 主要用于查询字符串或表单数据中获取单个参数值一般后面接单个变量,而不是像@RequestBody一样接整个对象示例代码123456//根据id删除学生 @DeleteMapping() public Result deleteStudent(@RequestParam Long id){ studentService.deleteStudent(id); ...
markdown渲染测试
由于多次配置博客,无法实时观测各效果的实现状况。故写此测试文章,后续插件有更新后再次进行修改。更新后采用引用格式作为标记。标题测试这是一级标题这是二级标题这是三级标题这是四级标题这是五级标题12345# 这是一级标题## 这是二级标题### 这是三级标题#### 这是四级标题##### 这是五级标题
字体测试斜体文本
_斜体文本_
粗体文本
粗体文本
粗斜体文本
_粗斜体文本_
123456*斜体文本*_斜体文本_**粗体文本**__粗体文本__***粗斜体文本***___粗斜体文本___
公式渲染测试这是行内公式:$\alpha = sin \sigma + \beta$ 行内公式结束。
公式段:
\alpha = sin \sigma + \betaLatex多种格式渲染测试
a+b=\frac{a}{b}
\\ \left(a+b=\frac{a}{b} \right)
\\ a^b+a_b=a ^ {数学}
\\ \cal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
\\ \sum_{i=1}^{n} x_{i}=\int_{0}^{1}f(x)\, ...










