跳至主要內容
并发编程总结

1、Synchronized

	Synchronized是由JVM实现的一种实现互斥同步的一种方式,如果你查看被Synchronized修饰过的程序块编译后的字节码,会发现,被Synchronized修饰过的程序块,在编译前后被编译器生成了monitor enter和monitor exit两个字节码指令。

	这两个指令是什么意思呢?在虚拟机执行到monitor enter指令时,首先要尝试获取对象的锁︰如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器+1;当执行monitorexit指令时将锁计数器-1﹔当计数器为O时,锁就被释放了。如果获取对象失败了,那当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。

	Java中Synchronize通过在对象头设置标记,达到了获取锁和释放锁的目的。

	Synchronize是非公平锁。

zheng大约 5 分钟面试java
JVM性能优化整理

1、类加载过程

	Java语言是一种具有动态性的解释型语言,类(Class)只有被加载到JVM后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。

	这个加载过程是由类加载器完成,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。

	类的加载方式分为隐式加载和显示加载。隐式加载指的是程序在使用new等方式创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。显示加载指的是通过直接调用class.forName()方法来把所需的类加载到JVM中。

zheng大约 6 分钟面试
JVM内存结构

1、方法区

用于存储虚拟机加载的 类信息,常量,静态变量等数据。

2、堆

存放对象实例,所有的对象和数组都要在堆上分配,是 JVM 所管理的内存最大的一块区域。

3、栈

Java 方法执行的内存模型:存储局部变量表、操作数栈、动态链接、方法出口灯信息。

生命周期与线程相同。


zheng小于 1 分钟面试JVM
JVM类加载过程

0、图解

image-20200927113941669
image-20200927113941669
image-20210807123832574
image-20210807123832574

zheng大约 4 分钟面试JVM
Hash解决冲突的方法

1、什么是hash表

	散列表(hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构。

	也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫 散列函数,存放记录的数组叫做散列表。

	给定表M,存在函数f(key),对于任意给定的关键字值 key,代入函数后若能得到包含改关键字的记录在表中的地址,则称表M为哈希(hash)表,函数 f(key)为哈希(hash)函数。

2、hash冲突

	对应不同的关键字可能获得相同的 hash 地址,即 key1 ≠ key2,但是f(key1) = f(key2)。这种现象就是冲突,而且这种冲突只能尽可能的减少,不能完全避免。

	因为哈希函数是从关键字集合和地址集合的映像,通畅关键字集合比较大,而地址集合的元素仅为哈希表中的地址值。

zheng大约 3 分钟面试哈希表
JVM垃圾回收算法

1、标记 - 清除 算法

标记无用对象,然后进行清除回收。

缺点:效率不高,无法清除垃圾碎片。
image-20200918092639589
image-20200918092639589

2、复制 - 清除 算法

按照容量划分二个大小相等的内存区域,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。

缺点:内存使用率不高,只有原来的一半

zheng大约 1 分钟面试JVM
AtomicInteger

1、介绍

AtomicInteger属于JUC并发包下的原子类,继承关系如下:

public class AtomicInteger extends Number implements java.io.Serializable

zheng大约 6 分钟面试java基础