大厂面试题 支付宝 支付宝三面:JVM性能调优都做了什么? 小米 有做过JVM内在优化吗?从SQL、JVM、架构、数据库4个方面讲讲优化思路 蚂蚁金服 JVM的编译优化 JVM性能调优都做了什么? JVM诊断调优工具用过哪些? 二面:JVM怎样调优,堆内存、栈空间设置多少合适? 三面:JVM相关的分析工具使用过哪些?具体的性能调优步骤如何? 阿里 如何进行JVM调优?有哪些方法? 如何理解内存泄漏问题?有哪些情况会导致内存泄漏,如何解决? 字节跳动 三面:JVM如何调优,参数怎么调? 拼多多 从SQL、JVM、架构、数据库4个方面讲讲优化思路 京东 JVM诊断调优工具用过哪些? 每秒几十万并发的秒杀系统为什么会频繁发生GC? 日均百万级交易系统如何优化JVM? 线上生产系统OOM如何监控、定位 与解决? 高并发系统如何基于G1垃圾回收器优化性能? 为什么要调优? 防止出现OOM 解决OOM 减少GC、Full GC出现频率 监控的依据 运行日志 异常堆栈 GC日志 线程快照 堆转储快照 性能调优的步骤? 性能监控 一种以非强行或入侵方式收集或查看应用运营性能数据的活动 问题症状 GC频繁 CPU Load过高 OOM 内存泄漏 死锁 响应时间较长 性能分析 一种以侵入方式收集运行性能数据的活动,它会影响应用的吞吐量或响应。 方法 打印GC日志,通过GCViewer或者http://gceasy.io来分析日志信息 灵活运用命令行工具,jstack、jmap、jinfo等 dump出堆文件,使用内存分析工具分析 使用阿里Arthas,或jconsole,JVisualVM来实时查看JVM状态 jstack查看堆栈信息 性能调优
View DetailsJava Development Kit(JDK):编写Java程序的程序员使用的软件 Java Runtime Environment(JRE):运行Java程序的用户使用的软件 Server JRE:在服务器上运行Java程序的软件 Standard Edition(SE):用于桌面或简单服务器应用的Java平台 Enterprise Edition(EE):用于复杂服务器应用的Java平台 Micro Edition(ME):用于手机和其他小型设备的Java平台 Java FX:用于图形化用户界面的一个替代工具包,在Oracle的Java SE发布版本中提供 OpenJDK:Java SE的一个免费开源实现,不包含浏览器集成或JavaFX Java 2(J2):一个过时的术语,用于描述1998 ~ 2006年之间的Java版本 Software Development Kit(SDK):一个过时的术语,用于描述1998 ~ 2006年之间的JDK Update(u):Oracle的术语,表示bug修正版本 NetBeans:Oracle的集成开发环境
View Detailsfilter、interceptor、AOP的区别
filter作用于servlet
(通常指spring的)interceptor,拦截的对象是URL
AOP作用的对象可以是任何一个方法
Spring中的切面Aspect,这是Spring的一大优势。面向切面编程往往让我们的开发更加低耦合,也大大减少了代码量,同时呢让我们更专注于业务模块的开发,把那些与业务无关的东西提取出去,便于后期的维护和迭代。
View Details与JDK 21兼容的最小Lombok版本是1.18.30
View Details什么意思呢?就是当前进程确保一个类全局只有一个实例。
那单例模式有什么好处呢?[1]
单例模式在内存中只有一个实例,减少了内存开支
单例模式只生成一个实例,所以减少了系统的性能开销
单例模式可以避免对资源的多重占用
单例模式可以在系统设置全局的访问点
那单例模式是银弹吗?它有没有什么缺点?
单例模式一般没有接口,扩展很困难
单例模式不利于测试
单例模式与单一职责原则有冲突
那什么情况下要用单例模式呢?
要求生成唯一序列号的环境
在整个项目中需要一个共享访问点或共享数据
创建一个对象需要消耗的资源过多
需要定义大量的静态常量和静态方法(如工具类)的环境
volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。
View Details在java领域,表现层技术主要有三种,
(1)jsp;
(2)freemarker;
(3)velocity;
(4)thymeleaf;
GarbageCollectedMemoryPool 是一个非常巧妙的调试工具。它通过继承 SimpleMemoryPool 复用了内存额度控制的逻辑,然后通过重写钩子方法和结合Java的引用机制,增加了一层“内存泄漏”的监控。
正常流程:tryAllocate() -> bufferToBeReturned (登记) -> 使用 -> release() -> bufferToBeReleased (注销) -> ByteBuffer 失去引用 -> 被GC。
泄漏流程:tryAllocate() -> bufferToBeReturned (登记) -> 使用 -> 忘记调用 release() -> ByteBuffer 失去引用 -> 被GC -> BufferReference 进入队列 -> 后台线程检测到,并从 buffersInFlight 中找到了登记信息 -> 报告错误。