• 记一次线上OOM 问题排查过程!
    第一步就是打开Histogram看看占用内存最大的是什么对象:可以看到byte数组占用了接近JVM配置的最大堆的大小也就是8GB,显然这是OOM的原因。第三步通过查看GC根查看谁持有了数组的引用:这符合之前的猜测,是tomcat的线程在处理过程中分配了10M的buffer在堆上。第四步就是检查代码里是否有tomcat或服务器相关配置,看到有这么一个配置:max-http-header-size: 10000000至此,基本已经确定了八九不离十就是这个不合理的最大http请求头参数导致的问题。先来看问题1,这个可以通过MAT在dump中继续寻找答案。还引申出一个问题:为啥有这么多工作线程!
  • 没看这篇干货,别和我说你会 IDEA Debug!
    debug过程如果高效,撸代码也会爽很多,不是吗?在debug窗口可以通过子线程名选择进入子线程的流程单步调试。其实可以不用这么麻烦,idea提供了条件断点的功能,比如下面这段代码:我们右键断点为止,设置i=5的条件断点,然后debug执行。但是这种方式修改了业务代码,如果发布的时候忘记删除,结果不堪设想。idea有更加优雅的方式解决此类需求。然后开始debug,在idea的右下窗口打开memory view,我一般是选择打开这几个选项,接下来在单步的过程中,就可以看到对象的分配情况。
  • 助力秋招-独孤九剑破剑式 | 10家企业面试真题
    多达10家企业面试的一手资料。大数据开发方向知识图谱,请点击下面的连接:《独孤九剑剑谱总纲|大数据方向学习面试知识图谱》第一要义:只攻不守。讲讲动态代理模式 和单例模式写一下单例模式,在多线程情况下呢?设计一个栈,包含出栈,入栈,是否为空等求两个大数相加,每个数100位长度介绍一下Spring及SpringbootSpring IOC如何解决循环依赖的问题?创建线程池,当里面的线程数量达到最大时,会出现什么问题?HTTP属于哪一层协议 ?HTTPS的安全体现在哪个方面?
  • 记录一次系统性能调优过程
    问题回顾在线上环境,由于业务场景需要,要求程序能够在普通的4G机器中依然正常运行。而原来的环境配置为8核16G,微服务部署,一共有6个功能模块。而现在要求在一台4核4G的设备上正常运行。问题清单模块合并过程中各种冲突,各种Bean无法正常加载事件处理性能原来每秒3000~1w左右,现在突然骤降至几百左右;事件存在丢失现象,而且丢失比较严重发现系统cache一直在不断的上涨,free -m 后发现可余内存几乎用没了问题排查1. 代码冲突包名冲突。不同模块的包名设计上有重复类名冲突。@Configuration @Bean @Controller @Service @Repository 等注解中没有指定Bean实例的名称。beanName + "-" : DEFAULT_THREAD_NAME_PREFIX) ; return new SimpleAsyncTaskExecutor;}...SimpleAsyncTaskExecutor.classprotected void doExecute { Thread thread = (this.threadFactory !
  • 面试问我:在浏览器输入 URL 回车之后发生了什么?我竟然回答不上来...
    大致流程URL 解析DNS 查询TCP 连接处理请求接受响应渲染页面 01URL 解析 地址解析:首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。HSTS由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。在建立连接前,会先进行 TCP 三次握手。否则服务器会按照规则把请求重写到 一个 REST 风格的 URL 上。05浏览器接受响应 浏览器接收到来自服务器的响应资源后,会对资源进行分析。
  • 小程序底层实现原理及一些思考
    最近一直在做小程序的底层实现,过程中磕磕绊绊也多次进行架构方向上的转型,趁着周末抽空写一篇文章记录一下开发过程中遇到的问题和一些思考与决策。所以当时定了一个基本方向:让开发者使用Vue开发我们的小程序,开发体验完全与Web保持一致。若想做到这一点就不得不对Vue的渲染层进行一个托管与改造。
  • 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
    本文主要针对系统运行缓慢这一问题,提供该问题的排查思路,从而定位出问题的代码点,进而提供解决该问题的思路。对于Full GC较多的情况,其主要有如下两个特征:线上多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程通过jstat命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。从而进一步证实了是由于内存溢出导致的系统缓慢。
  • Java中的多线程
    指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码:void transferMoney{ to.setMoney; from.setMoney;}同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问成为线程安全,来保证结果的准确。线程安全的优先级高于性能。Thread类中的yield方法可以让一个running状态的线程转入runnable。讲其本质,首先就要明确monitor的概念,Java中的每个对象都有一个监视器,来监测并发代码的重入。wait/notify必须存在于synchronized块中。这意味着wait之后,其他线程可以进入同步块执行。
  • 为什么建议使用你LocalDateTime,而不是Date?
    点击上方“后端技术精选”,选择“置顶公众号”技术文章第一时间送达!当多个线程同时使用相同的SimpleDateFormat对象调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。
  • Java并发异步编程,原来十个接口的活现在只需要一个接口就搞定!
    点击上方“Java小组”,选择“置顶公众号”技术文章第一时间送达!对你没有听错,也没有看错 ..多线程并发执行任务,取结果归集~~ 不再忧愁…用上FutureTask任务获取结果老少皆宜,就是CPU有消耗。FutureTask也可以做闭锁。通过把Callable作为一个属性,进而把它自己作为一个执行器去继承Runnable,FutureTask 实际上就是一个支持取消行为的异步任务执行器。Callable就是一个回调接口,可以泛型声明返回类型,而Runnable是线程去执行的方法.这个很简单~大家想深入了解就进去看源码好了~因为真的很简单~FutureTask实现了Future,提供了start, cancel, query等功能,并且实现了Runnable接口,可以提交给线程执行。
  • 小程序底层实现原理及一些思考
    最近一直在做小程序的底层实现,过程中磕磕绊绊也多次进行架构方向上的转型,趁着周末抽空写一篇文章记录一下开发过程中遇到的问题和一些思考与决策。所以当时定了一个基本方向:让开发者使用Vue开发我们的小程序,开发体验完全与Web保持一致。若想做到这一点就不得不对Vue的渲染层进行一个托管与改造。
  • Tomcat 应用中并行流带来的类加载问题
    但是,作者发现在 Tomcat 容器中使用并行流会出现动态加载类失败的情况,通过对比 Tomcat 多个版本的源码,结合并行流和 JVM 类加载机制的原理,成功定位到问题来源。继续看ForkJoinWorkerThread创建的源码,首先使用ForkJoinWorkerThreadFactory创建一个线程,然后将创建的线程注册到ForkJoinPool中,线程初始化的逻辑和普通线程并无差别,发现单独从JDK自身难以发现问题,因此将分析转移到Tomcat中。
  • 看漫画也能学编程?就是这本Java并发宝典没错了!(内含专栏福利)
    不知你对多线程开发是否有过这样的困惑:做了几年 Java web 开发,并没有写过多线程,但开发的软件一样高效、稳定运行,似乎多线程看起来并没有那么重要?而如果采用多线程,同时发出两个请求,总的等待时间将会大大缩短。为了帮助你全方位,较为深入的学习多线程,开设了本专栏《你的Java并发编程学习宝典(漫画版)》。多线程开发在 Java 中属于高阶的开发技术,如果能彻底掌握,并且灵活运用。因此,多线程这一关是要必过的。开启你的Java学习之旅吧~《你的Java并发编程学习宝典(漫画版)》 -留言抽奖-看书和看视频,你觉得哪个学习效率高?
  • 面试官:什么是Java内存模型?千万不要答错了!
    面试时很多人上来就回答:Java内存模型由几部分组成,堆、本地方法栈、虚拟机栈、方法区…很明显,跟JVM内存模型弄混了,这两个是截然不同的概念,千万不要答错了。。作为一名有追求的 Java 程序猿,彻底搞懂 Java 内存模型是有必要的。如果你还是学不会,我再给大家推荐一个由腾讯课堂联合图灵学院出的2分钱 课程《Java内存模型-JMM与AQS同步器深入剖析》,让你学完之后不管是计算机硬件结构,还是Java内存模型都有一个很好的了解,面试不再答非所问。
  • API 网关从入门到放弃
    通过引入API网关,客户端只需要与API网关交互,而不用与各个业务方的接口分别通讯,但多引入一个组件就多引入了一个潜在的故障点,因此要实现一个高性能、稳定的网关,也会涉及到很多点。API注册业务方如何接入网关?第一种采用插件扫描业务方的API,比如Spring MVC的注解,并结合Swagger的注解,从而实现参数校验、文档&&SDK生成等功能,扫描完成之后,需要上报到网关的存储服务。
  • 挑战10个最难回答的Java面试题(附答案)
    作者丨Yujiaao编辑丨Java团长segmentfault.com/a/1190000019962661这是我收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。Java编程的常识和深入了解有助于回答这种棘手的 Java 核心方面的面试问题。4) Java 是基于 Hoare 的监视器的思想。在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。此外,Java 可以通过使用接口支持单继承来避免这种歧义。另一个类似棘手的Java问题。与 C++ 不同,Java 不支持运算符重载。另一个类似的问题是关于 Java 通过引用传递,这主要表现为 Java 是通过值还是引用传参。清晰性是Java设计者的目标之一。
  • 一文带你搞懂 API 网关,别给你的系统引入定时炸弹!
    通过引入API网关,客户端只需要与API网关交互,而不用与各个业务方的接口分别通讯但多引入一个组件就多引入了一个潜在的故障点,因此要实现一个高性能、稳定的网关,也会涉及到很多点。API注册业务方如何接入网关?第一种采用插件扫描业务方的API,比如Spring MVC的注解,并结合Swagger的注解,从而实现参数校验、文档&&SDK生成等功能,扫描完成之后,需要上报到网关的存储服务。