傻大方


首页 > 人文>科技 >

Java|java达到什么样的水平才能社招面进阿里?

傻大方摘要:【Java|java达到什么样的水平才能社招面进阿里?|阿里巴巴|jvm】2. volatile的理解?特性1:内存可见性,缓存一致性协议(底层会锁内存行)来保证每个线程中的缓存信息是一致的。特性2:有序性(指令重新排序,JVM在保证单线程下不会出现问题的情...



按关键词阅读: 阿里巴巴    Java    jvm   

Java|java达到什么样的水平才能社招面进阿里?

一、Java面试问题1. ArrayList 和 LinkedList 有什么区别?
第一:底层数组结构不同 , ArrayList 是数组 , LinkedList是双向链表 。
第二:插入速度不一定谁快 , 因为ArrayList要扩容 , LinkedList要创建节点 , 节点多了暂用内存 , 导致处理速度下降 。
第三:角标查询ArrayList快 。
2. volatile的理解?
特性1:内存可见性 , 缓存一致性协议(底层会锁内存行)来保证每个线程中的缓存信息是一致的 。
特性2:有序性(指令重新排序 , JVM在保证单线程下不会出现问题的情况下 , 会优化指令的执行顺序 。 比如创建一个对象(1.开辟内存空间 , 2.初始化 , 3.指向内存地址) , 可以先指向内存地址再初始化) 。
3. as-if-serial和happens-before的语义理解?
4. for(;;) 和 while(true)的区别?
推荐使用for(;;) ,因为通过汇编指令可以很明显的看出区别for(;;)是一条指令 , while(true)是4条指令 。
5. 如何实现一个独占锁?
第一步通过CAS判断是否存在锁 , 不存在返回ture存在将新的线程加入队列中并且设置park 等待 。
第二步当占用资源的锁使用完成 , 需要通过队列里面的线程进行unpark操作去执行 。
6. main函数所在类是通过什么类加载器加载的?
7. 不同的类加载器加载相同的类 , 相等吗 , 为什么?
答:不相等 , 因为不同加载器加载类后存放的地方是隔离的 , 虽然都在方法区 。 举例就像存在在两个list 集合一样的道理 。
8. Jvm 中存在哪些常量池?
答:
1. class中的常量池:class文件中的 , 类名 , 方法名 , 字段等一些信息 。
2. 动态常量池:Java对象中的常量池信息 , 载入常量池 , 存储在元空间(方法区) 。
3. 字符串常量池:存放字符串的 , 在堆区 。
9. this指针是何时被赋值的?
答:执行引擎在执行带有操作数的字节码指令时 , 会有一个构造运行环境的过程 。 this指针就是在构造运行环境过程中实现的 。 不完全对象会被复制一份 , 这一份就是用于被this指向 。
10. JDK8 , 什么样的对象会进入老年代?
答:
15次GC:最多就是15次 , 因为存储字段只有4bit 。
大对象:对象超过Eden区的一半 。
空间担保:GC后的Eden区对象大小超过Form区加To区 , 直接进入老年代 。
动态年龄判断:Eden区+From区GC后 , To区放不下 , 直接进入老年代 。
11. 创建的对象是否只会存在堆区 , 为什么?
答:不是 , 存在栈上分配的情况 。Jvm在逃逸分析开启的情况 , 存在连续创建对象的时候 , 会有对象不创建在堆区 , 会创建到虚拟栈上 。
12.Java堆内存最大允许多少 , 为什么?
答:开启指针压缩的情况下:32G 。
原因:对象头中的类型指针指向的就是对象引用变量在方法区的地址 , 通过这个地址可以找到整个对象的全部内容在内存中位置 。
类型指针在开启指针压缩的情况下 , 占用4个字节即32位 , 2的32次方就是4G , 类型指针最大可以存在4G内存的位置 。又因为每个对象在开启指针压缩的情况下 , 最后3位000会被去掉 。所以实际4个字节可以表示 2的35次方-2的3次方的最大内存地址 , 即32G内存的最大位置 。
因为现在都是64位机器了 , 那么如果电脑或者服务器的内存超过32G内存 , 在开启指针压缩的情况下就是出现找不到内存地址情况 。
如果在开启指针压缩下优化这个问题 , 可以将Java对象的8字节对齐改成16字节对其 , 甚至32字节对其 。 这个能表示的内存最大值就是64G , 128G了 。

阿里巴巴大楼
二、Java Spring框架面試問題1. Spring Bean的生命周期?
2. Spring 容器的生命周期?
3. @Autowired 的作用??
三、Java分布式面试问题1. Zookeeper和redis分布式锁有什么区别
答:
单机下:首选redis分布式锁 , 因为redis是基于内存的所以比Zookeeper快很多(redis键与键之间没有必然联系 , zookeeper需要保证执行顺序) 。
集群下:
redis因为不保证强一致性 , 所以还是加锁快 , 但是在脑裂的情况下会出现多个节点获取同一把锁 。
Zookeeper保证了强一致性 , 所以加锁满 , 但是因为保证数据一致性 , 所以不会出现脑裂的情况下会出现多个节点获取同一把锁的情况 。
2. Redis是单线程还是多线程
答:Redis是多线程的 。redis4.0在多核CUP下实现了多线程 。
redis为什么不需要多线程 , 原因是redis是基于内存实现的缓存功能 , 他的性能瓶颈在内存和网络 , Redis6.0实现了网络这块的多线程 。


来源:(大嘴说Java)

【傻大方】网址:http://www.shadafang.com/a/bb/040SA4F52021.html

标题:Java|java达到什么样的水平才能社招面进阿里?


上一篇:科学家|世卫提出大胆设想:2020年只是烟雾弹,人体内出现不该出现的东西

下一篇:汽车|小米第一台汽车预计2024下线,互联网车企或将大批涌现!