https://segmentfault.com/a/1190000013688744
文章涉及JVM的垃圾回收,主要讲的是通过使用「堆外内存」对Young GC进行优化。
文章中介绍,MsgBroker消息中间件会对消息进行缓存,JVM需要为被缓存的消息分配内存,首先会被分配到年轻代。
当缓存中的消息由于各种原因,一直投递不成功,这些消息会进入老年代。
最终呈现的问题是YGC时间太长。
查看堆内存占用正常,jvm垃圾回收也没有异常。而top出来显示java占用内存是几个G,那么可能想到了是堆外内存泄漏。
需要安装google-perftools工具进行分析
1.先安装g++
不然编译会报错:g++: command not found
# yum -y install gcc gcc-c++
2.安装libunwind
不建议版本>0.99据说有问题,
专栏的上一篇文章介绍了JVM内存区域的划分,总结了相关的一些概念,今天的专栏将结合JVM参数、工具等方面,进一步分析JVM内存结构,包括外部资料相对较少的堆外部分。
今天我想要大家的问题是:如何监控和诊断JVM堆内和堆外内存使用?
了解JVM内存方法有很多,具体能力范围也有区别,简单总结如下:
可以使用综合性的图形化工具,如JConsole、 VisualVM(注意,从Oracle JDK...
1、堆外内存定义
内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能在一定程度上减少垃圾回收对应用程序造成的影响。使用未公开的Unsafe和NIO包下ByteBuffer来创建堆外内存。
2、为什么使用堆外内存
1、减少了垃圾回收
使用堆外内存的话,堆外内存是直接受操作系统管理(而不是虚拟机)。这样做的结果就是能保持一个较小的堆内内存,以减少...
对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下:
新生代:一般来说新创建的对象都分配在这里。
年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面。年老代中的对象保存的时间更久。
永久代:这里面存放的是class相关的信息,一般是不会进行垃圾回收的。
JVM垃圾回收
由于JVM会替我们执行垃圾回收,因此开发者根本...
这篇文章是在公司做了不少的线上Java服务故障排查和优化之后的一个总结,可以作为一个工具清单,在分析问题的时候需要有整体思路:全局观,先从系统层面入手,大致定位方向(内存,cpu,磁盘,网络),然后再去分析具体的进程。
一、Linux
内存和cpu
内存和cpu问题是出问题最多的一个点,因为有些命令如top同时可以观察到内存和cpu所以放在一起。
top命令
常用参数: -H 打印具体的线程, -p 打印某个进程 进入后 按数字1.