开发者社区> 问答> 正文

linux 环境下 java SDK初始化过慢的问题

问题已解决,根本原因是虚拟机没有配置DNS服务器,OSSClient初始化的时候会调用如下方法尝试解析域名。导致初始化时间超长,且在异常场景下未打印相关错误日志
/**
     * 判定一个网络地址是否是IP还是域名。IP都是用二级域名,域名(Localhost除外)不使用二级域名。
     * @param uri URI。
     */
    private boolean isIpOrLocalhost(URI uri){
        if (uri.getHost().equals("localhost")) {
            return true;
        }
        
        InetAddress ia;
        try {
            ia = InetAddress.getByName(uri.getHost());
        } catch (UnknownHostException e) {
            return false;
        }
        
        if (ia.getHostName().equals(ia.getHostAddress())) {
            return true;
        }
        
        return false;
    }





最近用阿里云SDK 写上传下载的demo,发现在linux环境下,OSSclient 初次加载时候巨慢,20秒到30秒的时间不等,单步调试发现主要的耗时步骤居然是new 以及ossclient的构造方法执行完毕之后,返回调用处的地方耗时最多。


BTW:多线程场景下,每个线程在第一次加载OSSClient的时候 耗时都是20秒以上。


贴上来的demo代码就是测试两个线程独立加载OSSclient的场景,实测结果第一次加载结束需要20秒,第二次加载仅需要几毫秒
执行结果如下:

SDK版本2.6.0 2.5.0都有同样的问题

java -jar

test start:1500535877789
tt2 step1 1500535877798
tt1 step1 1500535877798
tt2 step2 1500535898281
tt1 step2 1500535898281
tt2 step3 1500535898284
tt1 step3 1500535898286


linux信息如下:
Linux version 3.10.0-229.42.1.97.x86_64 (abuild@HGH1000006709) (gcc version 4.8.3 20140911 (EulerOS 4.8.3-10) (GCC) ) #1 SMP Sat Oct 22 14:09:35 UTC 2016


java版本信息如下:

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)


测试代码demo如下:
public class Main
{
    public static void main(String[] args)
    {
        TestThread tt1 = new TestThread();
        TestThread tt2 = new TestThread();
        tt1.setName("tt1");
        tt2.setName("tt2");
        Thread t1 = new Thread(tt1);
        Thread t2 = new Thread(tt2);
        System.out.println("test start:"+System.currentTimeMillis());
        t1.start();
        t2.start();
    }
    static class TestThread implements Runnable{
        private String name;
        @Override
        public void run()
        {
            ClientConfiguration configuration = new ClientConfiguration();
            CredentialsProvider credentials = new DefaultCredentialProvider("L*****O", "6****I");
            String endpoint = "http://oss.aliyuncs.com";
            configuration.setProtocol(Protocol.HTTPS);
            System.out.println(name + " step1 "+System.currentTimeMillis());
            OSSClient client = new OSSClient("http://oss.aliyuncs.com",
                "L*****O", "6*****I", configuration);
            System.out.println(name + " step2 "+System.currentTimeMillis());
            client = new OSSClient(endpoint, credentials, configuration);
            System.out.println(name + " step3 "+System.currentTimeMillis());
        }
        /**
         * 取得 name
         * @return 返回 name
         */
        public String getName()
        {
            return name;
        }
        /**
         * 对name进行赋值
         * @param name 要给name设置的值
         */
        public void setName(String name)
        {
            this.name = name;
        }
        
    }
}




展开
收起
mastercolor 2017-07-20 15:51:38 3368 0
2 条回答
写回答
取消 提交回答
  • 回 1楼魔咒626的帖子
    这代码 只是在初始化 OSSClient  哪里有在拷贝文件了。。。
    我说的问题是 OSSClient 第一次初始化 特别耗时 ,多线程场景和单线程场景 都是一样的 20秒往上

    -------------------------

    回 3楼魔咒626的帖子
    哪里有四个线程啊

    算上主线程 也就三个线程吧
    2017-07-21 11:25:45
    赞同 展开评论 打赏
  • 文件大小一致吗?建议用同一个文件多分拷贝,再测试一下,这样更有说服力。

    -------------------------

    看代码,你是调用了4个线程啊

    -------------------------

    嗯,看错了,把类创建也看成线程了;

    2017-07-21 02:17:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载