Evai Blog

Evai Blog


  • 首页

  • 标签

  • 分类

  • 归档

记一次生产环境OOM排查实践

发表于 2019-07-22 | 分类于 Java | 阅读次数:
前言前几天在公司服务器查看日志的时候无意间发现项目配置的OOM Dump路径上生成了一个文件,发现就是最近生成的文件。好奇之下笔者将该文件拉到本地准备开始定位问题。 问题定位话不多说,直接利用MAT工具对该文件进行分析。 通过上图可以发现是sql返回的一个结果集占用了大量的内存,接近1.5G!但是这里还看不出来到底是哪块业务代码造成返回这么大的数据集。再看MAT的一个系统报告,它可以帮你预测出这 ...
阅读全文 »

Java中volatile关键字的理解

发表于 2018-03-01 | 分类于 Java | 阅读次数:
关键字volatile可以说是Java虚拟机提供的最轻量的同步机制,但是它并不容易完全被正确的理解,以至于很多程序员不习惯使用它,遇到多线程竞争的情况时一律使用synchronized来进行同步。 在Java中,当一个变量定义了volatile关键字之后,它具备两种特性,第一是保证此变量对所有线程的可见性。这里的“可见性”是指当其中某一条线程修改了这个变量的值,其它线程是可以立即得知这个变量的新值 ...
阅读全文 »

Java模拟简单的CAS实现

发表于 2018-01-05 | 分类于 Java | 阅读次数:
这篇文章主要模拟CPU的CAS实现,详细的实现原理都加上注释了,不一一解释了。当然这不是真正的CAS实现,真正的CAS是CPU指令来实现的。 Compare And Swap(CAS)CAS的原理是拿期望的值和原本的一个值作比较,如果相同则更新为新的值。反之,会继续拿期望的值与原本的值作比较,知道成功为止。 模拟CAS实现类123456789101112131415161718192021222 ...
阅读全文 »

理解Java中的AtomicLong类

发表于 2018-01-04 | 阅读次数:
由于Java的原子操作最多只支持32位的,而long和double是64位的,因此它们不具有原子性。 而在java中定义了AtomicLong这个类,来实现原子的long类型。那具体是怎么实现的?我们先来了解下CAS。 Compare And Swap(CAS)CAS的原理是拿期望的值和原本的一个值作比较,如果相同则更新为新的值,此处“原本的一个值”怎么来的,我们先看看AtomicLong类的几个 ...
阅读全文 »

Java中生成一个线程安全的计数器

发表于 2018-01-03 | 分类于 Java | 阅读次数:
上一篇讲了在Java中同步访问共享的可变数据有两种方法,一个是使用sychronized关键字来同步方法或同步块,这种方法能同步数据并且还能实现访问互斥。另外一种方法是使用volatile修饰符,它仅仅实现了线程之间的交互通信。 假设我们现在需要实现一个简单的计数器,它是一个不重复且唯一的递增数值。我们使用volatile来实现看下: 1234567891011121314151617181920 ...
阅读全文 »

Java中同步访问共享的可变数据

发表于 2017-12-31 | 分类于 Java | 阅读次数:
我们知道,线程机制允许同时进行多个活动。并发程序设计比单线程设计要困难得多,因为有更多的东西可能出错,也很难重现失败。但是我们无法避免并发,因为所做的大部分事情都需要并发,而且并发也是能否从多核的处理器中获得好的性能的一个条件。 Java中的原子操作原子操作指的是在一步之内就完成而且不能被中断。原子操作在多线程环境中是线程安全的,无需考虑同步的问题。在java中,下列操作是原子操作: all a ...
阅读全文 »

Java 构建器

发表于 2017-12-30 | 分类于 Java | 阅读次数:
静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。考虑一个类的构造器具有多个参数时,就显得很不方便。 对于这样的类,应该用哪种构造器或者静态方法来编写呢?程序员一般会采用重叠构造器模式,在这种模式下,你提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个有两个可选参数,依次类推,最后一个构造器包含所有的可选参数。下面我们来看下这种示例: 重叠构造器模式123456 ...
阅读全文 »

初识SpringAOP

发表于 2017-12-26 | 分类于 Java | 阅读次数:
我们知道,使用面向对象编程(OOP)有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志、安全监测、权限管理等,只有在每个对象里引用公共的行为,这样程序中就产生了大量的重复代码,即不美观也不利于维护,所以就有了一个对面向对象编程的补充,即面向方面编程(AOP)。AOP所关注的方向是横向的,不同于OOP的纵向。 在Sping中,你可以使用@Aspect注解非常容易地定义一个切面 ...
阅读全文 »

Redis集群配置及原理分析

发表于 2017-12-25 | 分类于 Redis | 阅读次数:
首先创建两台虚拟机(有服务器的可以直接在服务器上搞),每台机器分别3个节点,创建出3个master和3个salve环境。 redis 采用 redis-3.2.10 版本(redis版本必须高于3.0版本,3.0版本以下不支持集群)。 两台虚拟机都是 CentOS ,一台 CentOS 7 (主IP:192.168.1.115),一台 CentOS 6.5(从IP:192.168.1.160) 。 ...
阅读全文 »

正向代理和反向代理

发表于 2017-12-25 | 阅读次数:
正向代理即是客户端代理,代理客户端,目的为了隐藏客户端,服务端不知道实际发起请求的客户端。 反向代理即是服务端代理,代理服务端,目的为了隐藏服务端,客户端不知道实际提供服务的服务端。 举个栗子: 正向代理:比如要访问YouTube,但是不能直接访问,只能先找个翻墙软件,通过翻墙软件才能访问YouTube,翻墙软件就是正向代理,代理我们的客户端。 反向代理:比如要访问YouTube,但是YouTub ...
阅读全文 »
123
Evai

Evai

Evai Blog

21 日志
4 分类
17 标签
GitHub E-Mail
© 2019 Evai
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4