网络文章

阿里、华为、腾讯Java技术面试题精选

阿里、华为、腾讯Java技术面试题精选,由于不知道真正原作者,故用佚名,具体内容如下:JVM的类加载机制是什么?有哪些实现方式?类加载机制:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法去内,然后在堆区创建一个java.lang.Class对象,用来封装在方法区内的数据结构。类的加载最终是在堆区内的Class对象,Class对象封装了类在方法区内的数据结

阿里、华为、腾讯Java技术面试题精选,由于不知道真正原作者,故用佚名,具体内容如下:


JVM的类加载机制是什么?有哪些实现方式?

类加载机制:

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法去内,然后在堆区创建一个java.lang.Class对象,用来封装在方法区内的数据结构。类的加载最终是在堆区内的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类加载有三种方式:

1)命令行启动应用时候由JVM初始化加载

2)通过Class.forName()方法动态加载

3)通过ClassLoader.loadClass()方法动态加载

JVM的常见垃圾回收算法?

1)标记-清除算法:前后线标记处所有需要回收的对象,在标记完成后统一回收有被标记的对象。

2)复制算法:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当一块内存用完了,将其存在另外一块上面,然后再把已使用过的内存空间一次清理掉。

3)标记-整理算法:标记过程与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让其一端移动,然后直接清理掉端边界以外的内存。

4)分代收集算法:一般是把Java堆分为新生代和老年代,根据各个年代的特点采用最适当的收集算法。新生代都发现有大批对象死去,选用复制算法。老年代中因为对象存活率高,必须使用“标记-清理”或“标记-整理”算法来进行回收。

JVM调优的常见命令行工具有哪些?JVM常见的调优参数有哪些?

(1)JVM调优的常见命令工具包括:

1)jps命令用于查询正在运行的JVM进程,

2)jstat可以实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据

3)jinfo用于查询当前运行这的JVM属性和参数的值。

4)jmap用于显示当前Java堆和永久代的详细信息

5)jhat用于分析使用jmap生成的dump文件,是JDK自带的工具

6)jstack用于生成当前JVM的所有线程快照,线程快照是虚拟机每一条线程正在执行的方法,目的是定位线程出现长时间停顿的原因。

(2)JVM常见的调优参数包括:

-Xmx

  指定java程序的最大堆内存, 使用java -Xmx5000M -version判断当前系统能分配的最大堆内存

-Xms

  指定最小堆内存, 通常设置成跟最大堆内存一样,减少GC

-Xmn

  设置年轻代大小。整个堆大小=年轻代大小 + 年老代大小。所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss

  指定线程的最大栈空间, 此参数决定了java函数调用的深度, 值越大调用深度越深, 若值太小则容易出栈溢出错误(StackOverflowError)

-XX:PermSize

  指定方法区(永久区)的初始值,默认是物理内存的1/64, 在Java8永久区移除, 代之的是元数据区, 由-XX:MetaspaceSize指定

-XX:MaxPermSize

  指定方法区的最大值, 默认是物理内存的1/4, 在java8中由-XX:MaxMetaspaceSize指定元数据区的大小

-XX:NewRatio=n

  年老代与年轻代的比值,-XX:NewRatio=2, 表示年老代与年轻代的比值为2:1

-XX:SurvivorRatio=n

  Eden区与Survivor区的大小比值,-XX:SurvivorRatio=8表示Eden区与Survivor区的大小比值是8:1:1,因为Survivor区有两个(from, to)

ConcurrentHashMap加锁机制是什么,详细说一下?

HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

G1收集器简介?以及它的内存划分怎么样的?

(1)简介:

Garbage-First(G1,垃圾优先)收集器是服务类型的收集器,目标是多处理器机器、大内存机器。它高度符合垃圾收集暂停时间的目标,同时实现高吞吐量。Oracle JDK 7 update 4 以及更新发布版完全支持G1垃圾收集器

(2)G1的内存划分方式:

它是将堆内存被划分为多个大小相等的 heap 区,每个heap区都是逻辑上连续的一段内存(virtual memory). 其中一部分区域被当成老一代收集器相同的角色(eden, survivor, old), 但每个角色的区域个数都不是固定的。这在内存使用上提供了更多的灵活性

在重写equals

原创不易,完成人机校验,阅读全文

相关推荐