右移>> :该数对应的二进制码整体右移,左边的用原有标志位补充,右边超出的部分舍弃。
无符号右移>>> :不管正负标志位为0还是1,将该数的二进制码整体右移,左边部分总是以0填充,右边部分舍弃。
2 double和Double分别占用几个字节计算方式: 对象头+实例数据+对齐填充
| 类型 | 64位(无压缩) |
| boolean | 1 |
| byte | 1 |
| short | 2 |
| char | 2 |
| int | 4 |
| float | 4 |
| long | 8 |
| double | 8 |
| 普通对象头 | 16 |
| 数组对象头 | 24 |
| reference(引用类型) | 8 |
HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
3.1 对象头HotSpot虚拟机的对象头包含两部分信息
第一部分用来存储对象自身的运行数据,如哈希码(HashCode),GC分代年龄,锁状态标志,线程持有的锁,,偏向线程ID,偏向时间戳等; 这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32比特和64比特,官方称为"Mark Word"; 对象徐亚存储的运行时数据很多, 其实已经超出了32,64位Bitmap结构所能记录的最大限度,但对象头里的信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率, Mark Word 被设计成一个有着动态定义的数据结构, 以便在极小的空间内存储尽量多的数据, 根据对象的状态复用自己的存储空间;
对象头的另外一部分是类型指针, 即对象指向它的类型元数据的指针, java虚拟机通过这个指针来确定该对象是哪个类的示例;如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,
3.2 实例数据实例数据部分是对象真正存储的有效信息, 即我们在程序代码里面所诶你故意的各种类型的字段内容,无论是从父类集成下来的,还是在子类中定义的字段都必须记录起来;
这部分的存储顺序会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。HotSpot虚拟机默认的分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、oops(OrdinaryObject Pointers,OOPs),从以上默认的分配策略中可以看到,相同宽度的字段总是被分配到一起存放,在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前
3.3对齐填充对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用; 由于HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,也就是说任何对象的大小必须是8字节的整数倍; 对象头部分已经被设计成正好8字节的倍数,因此, 如果对象实例部分没有对齐的话,就需要对齐填充来补全
4 mysql自动提交如何更改,是数据库级别的更改还是连接级别的更改- 一种是通过set命令修改会话级别或者数据库级别的参数,但是数据库重启后参数会恢复默认值;
- 第二种方法是修改mysql的配置文件my.ini,一劳永逸。
不存在
mysql> select * from person; +----+------+ | id | name | +----+------+ | 1 | 2 | | 2 | 22 | | 3 | 33 | +----+------+ 3 rows in set (0.00 sec) mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> drop table person; Query OK, 0 rows affected (0.01 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from person; ERROR 1146 (42S02): Table 'person.person' doesn't exist mysql>6 如果一个表没有主健会怎么样
1 不规范, 不满足第一范式
2 查询比较慢
7 内存泄露和内存溢出内存泄露: 已分配的内存由于某种原因,无法释放, 比如分配了100M, 但是有10M内存不发释放,导致实际可用的内存只有90M, 10M无法释放的内存相当于泄露了
内存溢出: 就是内存不足, 比如你创建一个对象需要100M内存,但是可用的内存只有50M,就是内存溢出
Java虚拟机规范描述两种异常
1)如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
2)如果虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够的内存时,将抛出
OutOfMemoryError异常。
1 堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟随进一步提示“Java heap space”
2 ,运行时常量池溢出时,在OutOfMemoryError异常后面跟随的提示信息
是“PermGen space”
3 直接内存不足, 当NIO去allocateMemory的内存大于分配的直接内存时,
9 如何判断一个对象是否存活可达性分析算法, 通过一系列称为"GC Roots"的根对象作为起始节点集,从这个节点开始,根据引用关系向下搜索,搜索过程中所走过的路径称为引用链, 如果某个对象到GC Roots间没有任何引用链相连,则这个对象是不可能再被使用的,被判定为可回收对象
10 mybatis 操作游标通常对一张表中大量数据处理时由于数据量太大都要使用分页分批查询处理,否则数据量太大会导致OOM等问题。
Cursor查询适用于这种场景下可以替代分页查询的方案,Cursor实现了Closeable和Iterable接口,我们可以通过迭代器来获取数据进行处理。
@Mapper
public interface PersonMapper{
@Select("select * from person")
Cursor getAllPerson();
}
@Transactional
public void doRecord() throws Exception {
Cursor cursor = recordMapper.getAllRecord();
cursor.forEach(person-> {
System.out.println(person);
});
}



