高频面试题:Java程序占用 CPU 过高怎么排查
这个问题可以说是Java面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的。线上一台服务器CPU使用率100%了,如果你碰到这样的情况,如何排查并找到问题原因?这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅能解决面试官,还能解决问题。不然真的就掉进套路里了。
内存泄露的原因找到了,罪魁祸首居然是Java TheadLocal
ThreadLocal使用不规范,师傅两行泪组内来了一个实习生,看这小伙子春光满面、精神抖擞、头发微少,我心头一喜:绝对是个潜力股。于是我找经理申请亲自来带他,为了帮助小伙子快速成长,我给他分了一个需求,这不需求刚上线几天就出网上问题了😭后台监控服务发现内存一直在缓慢上升,初步怀疑是内存泄露。把实习
一文让你读懂Synchronized底层实现,秒杀面试官
本文为死磕Synchronized底层实现第三篇文章,内容为轻量级锁实现。轻量级锁并不复杂,其中很多内容在偏向锁一文中已提及过,与本文内容会有部分重叠。另外轻量级锁的背景和基本流程在概论中已有讲解。强烈建议在看过两篇文章的基础下阅读本文。本系列文章将对HotSpot的synchronized锁实现进行全面分析,内容包括偏向锁、轻量级锁、重量级锁的加锁、解锁、锁升级流程的原理及源码分析,希望给在研究
面试题深入解析:Synchronized底层实现
本文为synchronized系列第二篇。主要内容为分析偏向锁的实现。偏向锁的诞生背景和基本原理在上文中已经讲过了,强烈建议在有看过上篇文章的基础下阅读本文。 本文将分为几块内容:1.偏向锁的入口2.偏向锁的获取流程3.偏向锁的撤销流程4.偏向锁的释放流程5.偏向锁的批量重偏向和批量撤销本文分析的JVM版本是JVM8,具体版本号以及代码可以在这里看到。 偏向锁入口目前网上的很多
面试必问:读写一致性,你需要思考的问题
先说明下,本文要讨论的多线程读写是指一个线程写,一个或多个线程读,不包括多线程同时写的情况。试想下这样一个场景:一个线程往hashmap中写数据,一个线程往hashmap中读数据。 这样会有问题吗?如果有,那是什么问题?相信大家都知道是有问题的,但至于到底是什么问题,可能就不是那么显而易见了。问题有两点。一是内存可见性的问题,hashmap存储数据的table并没有用voliate修饰,也就是说读
spring boot入门,看这篇文章就够了
一、SpringBoot入门1、基本介绍简化Spring应用开发的一个框架、整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案;优点:快速创建独立运行的Spring项目以及与主流框架集成;使用嵌入式的Servlet容器,应用无需打成WAR包;starters自动依赖与版本控制;大量的自动配置,简化开发,也可修改默认值;无需配置XML,无代码生成,开箱即用;准生产环境的运行时应用监控;
Java并发编程的艺术,解读并发编程的优缺点
并发编程的优缺点使用并发的原因多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。在特殊的业务场景下先天的就适合于并发编程。 比如在图像处理领域,一张1024X768像素的图片,包含达到78万6千多个像素。即时将所有的像素遍历一边都需要很长的时间, 面对如此复杂的计算量就需要充分利用多核的计算的能力。又比如当我们在网上购物时,为了提升响
Java虚拟机,类文件结构深度解析
Java类文件结构Java虚拟机不和包括Java在内的任何语言绑定,只与 "Class文件" 这种特定的二进制文件所关联, Class文件中包含了Java虚拟机指令集合符号表以及若干其它辅助信息。 Java虚拟机作为一个通用的、机器无关的执行平台,任何其他语言都可以将其作为语言的产品交付媒介。 Class类文件结构Class文件是一组以8位字节为基础的二进制流, 各个
Java虚拟机内存分配与回收策略
内存分配与回收策略Minor GC 和 Full GCMinor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快。Full GC:又称Major GC,发生在老年代上,老年代对象其存活时间长, 因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多。内存分配策略堆内存: 分配策略: 1. 对象优先
老生常谈Java虚拟机垃圾回收机制(必看篇)
二、垃圾收集垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。 判断一个对象是否可被回收1. 引用计数算法给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。两个对象出现循环引用的情况下,此时引用计数
Java开发中存在这样的代码,反而影响整体整洁和可读性
不完美的库类不完美的库类(Incomplete Library Class)当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了)。问题原因许多编程技术都建立在库类的基础上。库类的作者没用未卜先知的能力,不能因此责怪他们。麻烦的是库往往构造的不够好,而且往往不可能让我们修改其中的类以满足我们的需要。解决方法如果你只想修改类库的一两个函数,可以运用 引入外
开发中滥用面向对象,你是否违背了编程原则
Switch 声明Switch 声明(Switch Statements)你有一个复杂的 switch 语句或 if 序列语句。问题原因面向对象程序的一个最明显特征就是:少用 switch 和 case 语句。从本质上说,switch 语句的问题在于重复(if 序列也同样如此)。你常会发现 
怎么让代码不再臃肿,写的像诗一样优雅
基本类型偏执基本类型偏执(Primitive Obsession)使用基本类型而不是小对象来实现简单任务(例如货币、范围、电话号码字符串等)。使用常量编码信息(例如一个用于引用管理员权限的常量USER_ADMIN_ROLE = 1 )。使用字符串常量作为字段名在数组中使用。问题原因类似其他大部分坏味道,基本类型偏执诞生于类初建的时候。一开始,可能只是不多的字段,随着表示的特性越来越多,基
大型网站背后的高性能系统架构设计
1. 性能测试1.1. 性能指标网站性能测试的主要指标有:响应时间 - 响应时间(RT)是指从客户端发一个请求开始计时,到客户端接收到从服务器端返回的响应结果结束所经历的时间,响应时间由请求发送时间、网络传输时间和服务器处理时间三部分组成。并发数 - 系统同时处理的请求、事务数。吞吐量 - TPS(每秒事务数)、HPS(每秒 HTTP 请求数)、QPS(每秒查询数)。
如何保证网站的安全架构,不被黑客攻击
1. 网站安全的攻与防互联网环境鱼龙混杂,网站被攻击是常见现象,所以了解一些常见的网站攻击手段十分必要。下面列举比较常见的 4 种攻击手段:1.1. 跨站脚本攻击(XSS)概念跨站脚本攻击(Cross-Site Scripting, XSS),是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用
网站的可扩性展架构
扩展性(Extensibility) - 指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。表现在系统基础设施稳定不需要经常变更,应用之间较少依赖和耦合,对需求变更可以敏捷响应。它是系统架构设计层面的开闭原则(对扩展开放、对修改关闭),架构设计考虑未来功能扩展,当系统增加新功能时,不需要对现有系统的结构和代码进行修改。伸缩性(Scalability) - 指系统能够
大型网站的可伸缩性架构如何设计?
1. 网站架构的伸缩性设计1.1. 不同功能进行物理分离实现伸缩纵向分离(分层后分离):将业务处理流程上的不同部分分离部署,实现系统伸缩性。横向分离(业务分割后分离):将不同的业务模块分离部署,实现系统伸缩性。1.2. 单一功能通过集群规模实现伸缩将不同功能分离部署可以实现一定程度的伸缩性,但是随着网站的访问量逐步增加,即使分离到最小粒度的独立部署,单一的服务器也不能满足业务规模的要求。因此必须使
Redlock:Redis分布式锁最牛逼的实现
普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道set key value px milliseconds nx。后一种方式的核心实现命令如下:- 获取锁(unique_value可以是UUID等) SET resource_name unique_value NX PX 30000 - 释放
如何保证消息队列的可靠性传输?
面试题如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?面试官心理分析这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。如果说你这个是用 MQ 来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这个 MQ 传递过程中绝对不会把计费消息给弄丢。面试题剖析数据的丢
ElasticSearch在数十亿级别数据下,如何提高查询效率?
面试题es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了。第一次搜索的时候,是5~10s,后面反而就快了,可能就几百毫秒。你就很懵,每个用户第一次访问都会比