添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一次生产环境高内存

sudo -u admin /java/bin/jmap -histo:live 37 | head -10 | sort -r -k3
在这里插入图片描述
jmap -heap pid
在这里插入图片描述

查看堆外内存

  1. 推荐java visualVM ,安装Buffer Pools来监测
	@Test
    public void test() throws Exception{
        while(true) {
            ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024 * 1024 * 1);

禁用System.gc,直接OOM

-verbose:gc -XX:+PrintGCDetails -XX:MaxDirectMemorySize=50m -XX:+DisableExplicitGC

开启-XX:+ExplicitGCInvokesConcurrent,允许System.gc生效

  1. sa-jdi.jar
    java -classpath .\sa-jdi.jar sun.jvm.hotspot.HSDB 图形界面 windows无法连接pid

手动触发full gc,( sudo -u admin /bin/jmap -histo:live 38 |head -10 )之后
在这里插入图片描述

dashboard
direct 显示40m

thread
finalizer 8
gc 2
在这里插入图片描述

curl -L https://alibaba.github.io/arthas/install.sh | sh
yum install xinetd telnet telnet-server -y
sudo -u admin -EH ./as.sh

greys

wget -c http://ompc.oss.aliyuncs.com/greys/release/greys-1.7.6.4-bin.zip
unzip
cd greys
sh ./install-local.sh 安装
开启端口
sudo -u admin ./ga.sh 33
在这里插入图片描述
./greys.sh 开启命令行模式
在这里插入图片描述

输入jvm查看内存情况
在这里插入图片描述

              total        used        free      shared  buff/cache   available
Mem:            15G        8.8G        6.0G        1.0M        700M        6.4G
Swap:            0B          0B          0B

https://www.jianshu.com/p/c76747997ade
https://www.jianshu.com/p/4e96beb37935

quit 退出
shutdown 关闭

perf-tools

/home/admin/busuac/gref/lib

export LD_PRELOAD=/home/admin/busuac/gperf/lib/libtcmalloc.so
export HEAPPROFILE=/home/admin/busuac

./configure --prefix=安装目录

/home/admin/busuac/gperf/lib

private static long maxDirectMemory0() {
        long maxDirectMemory = 0;
        try {
            // Try to get from sun.misc.VM.maxDirectMemory() which should be most accurate.
            Class<?> vmClass = Class.forName("sun.misc.VM", true, getSystemClassLoader());
            Method m = vmClass.getDeclaredMethod("maxDirectMemory");
            maxDirectMemory = ((Number) m.invoke(null)).longValue();
        } catch (Throwable ignored) {
            // Ignore
        if (maxDirectMemory > 0) {
            return maxDirectMemory;
        try {
            // Now try to get the JVM option (-XX:MaxDirectMemorySize) and parse it.
            // Note that we are using reflection because Android doesn't have these classes.
            Class<?> mgmtFactoryClass = Class.forName(
                    "java.lang.management.ManagementFactory", true, getSystemClassLoader());
            Class<?> runtimeClass = Class.forName(
                    "java.lang.management.RuntimeMXBean", true, getSystemClassLoader());
            Object runtime = mgmtFactoryClass.getDeclaredMethod("getRuntimeMXBean").invoke(null);
            @SuppressWarnings("unchecked")
            List<String> vmArgs = (List<String>) runtimeClass.getDeclaredMethod("getInputArguments").invoke(runtime);
            for (int i = vmArgs.size() - 1; i >= 0; i --) {
                Matcher m = MAX_DIRECT_MEMORY_SIZE_ARG_PATTERN.matcher(vmArgs.get(i));
                if (!m.matches()) {
                    continue;
                maxDirectMemory = Long.parseLong(m.group(1));
                switch (m.group(2).charAt(0)) {
                    case 'k': case 'K':
                        maxDirectMemory *= 1024;
                        break;
                    case 'm': case 'M':
                        maxDirectMemory *= 1024 * 1024;
                        break;
                    case 'g': case 'G':
                        maxDirectMemory *= 1024 * 1024 * 1024;
                        break;
                break;
        } catch (Throwable ignored) {
            // Ignore
        if (maxDirectMemory <= 0) {
            maxDirectMemory = Runtime.getRuntime().maxMemory();
            logger.debug("maxDirectMemory: {} bytes (maybe)", maxDirectMemory);
        } else {
            logger.debug("maxDirectMemory: {} bytes", maxDirectMemory);
        return maxDirectMemory;

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.