随笔分类 -  JVM

摘要:一次使用中间件引发的OOM调查 描述问题 在上一次上线完成后,线上的系统在运行几天后就会收到FullGC频繁的告警,而且每台服务都会告警,万能的重启可以解决问题,但不是根本办法,肯定是上一期的代码出现了内存泄漏,在预发环境上,由于操作次数较少,这个问题很难暴露。于是dump 线上的内存,用JProf 阅读全文
posted @ 2021-06-07 09:41 arax 阅读(123) 评论(0) 推荐(0)
摘要:volatile 保证此变量对所有线程的可见性。 这个可见性是指,当一个线程读取volatile修饰的变量时,永远读取的都是最后一个线程写回主内存的最新值。某个线程在读取数据之后,另一个线程对变量值做了修改,这个线程是不知道的,这就导致当前线程读取的值是过期的,当前线程将过期的数据经过计算写回主内存 阅读全文
posted @ 2018-07-10 19:26 arax 阅读(223) 评论(1) 推荐(0)
摘要:发现问题 当写下这行代码时,程序会注定运行失败。 错误信息:java.lang.OutOfMemoryError: Requested array size exceeds VM limit. 而且在jdk源码中总会看到类似这样的定义: 分析问题 看注释可以了解到,jvm会为数组头信息保留一些空间。 阅读全文
posted @ 2018-06-10 14:14 arax 阅读(636) 评论(0) 推荐(0)
摘要:从上面的测试代码可以看出MappedByteBuffer存储long时, 从long的最高位字节开始存储的 ,这和我们的书写数字的很类似。所以在操作MappedByteBuffer时要注意这一点。 阅读全文
posted @ 2018-02-09 11:07 arax 阅读(321) 评论(0) 推荐(0)
摘要:问题描述 现在很多java代码中都会用到内存映射的概念。文件映射的方式比输入输出流的方式快很多。但是在使用的过程中,正常地调用了FileChannel的force和close方法后,重命名文件或删除文件还会失败。主要原因还是文件的句柄没有释放。 问题分析及解决 文件句柄如果被持有,就相当于jvm虚拟 阅读全文
posted @ 2017-12-09 12:32 arax 阅读(3157) 评论(0) 推荐(0)
摘要:对象创建 在语言层面,创建一个对象通常仅一个new关键字就可以解决了,但是在虚拟机中,对象的创建要经过一个复杂的过程。 方法区中的常量池 当虚拟机遇到一个new关键字时,首先去方法区中的常量池中找有没有这个类的符号引用,并检查这个符号代表的类是否已经被加载、解析和初始化过,如果没有先执行类的加载过程 阅读全文
posted @ 2017-11-26 23:19 arax 阅读(1374) 评论(0) 推荐(0)
摘要:已经入行快有两年了,然而没有认真看过java虚拟机内存的介绍,下面把自己看的关于java虚拟机内存的介绍写下来,分享给大家。 java 虚拟机在运行时将内存分为几个区域,分别为程序记数区,java虚拟机栈,本地方法栈,java堆,方法区,运行常量池。此外还有一个叫做直接内存的区域,虽然不是java虚 阅读全文
posted @ 2017-11-16 22:08 arax 阅读(274) 评论(0) 推荐(0)