首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java应用程序执行速度非常慢(比Windows、Linux、AIX慢10-100倍)

Java应用程序执行速度非常慢(比Windows、Linux、AIX慢10-100倍)
EN

Stack Overflow用户
提问于 2011-05-26 15:21:24
回答 2查看 3.1K关注 0票数 2

关于在HP\UX服务器上运行我们的公司Java应用程序的性能问题,我需要您的帮助。应用程序是独立的工具,它将多个数据库中的数据同步到一个数据库中,通过XML-RPC协议与远程控制进行通信,并使用本地Derby (Java DB)数据库实例来保存配置数据等。我们在相同负载的其他环境中没有性能问题,如使用Sun JVM的Windows XP、Linux和AIX。经过一系列的测试,我们发现最耗时的是与Derby数据库的通信。大部分时间都花在从套接字读取数据上,这部分时间是其他平台的10-100倍。我们确信Derby运行良好,我们保留了CPU (使用率约为30%-40%),所以最可能的原因是本地数据库和应用程序之间的传输层。

有没有一种方法可以诊断HP-UX上的套接字I\O问题,或者可能存在一些可以配置的限制?也许有必要的JVM选项?你方的任何想法都将受到高度赞赏。

我们已经尝试过根据http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.wsfep.multiplatform.doc/info/ae/ae/tprf_tunejvm_v61.html优化JVM选项,但没有得到任何显着的改进。

JVM信息: Java HotSpot(TM) 64位服务器VM (19.1-b02-jinteg:2011mar11-16:46 PA2.0W (aCC_AP),混合模式) Java:版本1.6.0.10,供应商“惠普公司”

我们使用以下实例:操作系统: HP-UX (B.11.23)架构: PA_RISC2.0W 64位处理器:2

总物理内存大小:4088MB交换大小:4090MB

下面是运行缓慢的代码示例。在HP上执行需要几秒钟,而在Windows上需要10-30ms:

代码语言:javascript
复制
/** Template to communicate with local db. */
SimpleJdbcTemplate jdbcTemplate;

@Transactional(readOnly = true)
public List<JobLogEntry> getLastLogs(Integer dbnr, JobDataType dtype) {
    try {
        String uid = jdbcTemplate.queryForObject("SELECT session_uuid FROM "
                                                         + tableName + " WHERE id=(SELECT max(id) FROM "
                                                         + tableName + " WHERE dbnr=? AND dtype=?)",
                                                         String.class, dbnr, dtype.name());
        List<JobLogEntry> list = jdbcTemplate.query("SELECT id, dbnr, dtype, zeit, level, message FROM "
                                                             + tableName
                                                             + " WHERE dbnr=? AND dtype=? AND session_uuid=? ORDER BY ID",
                                                             new ConRowMapper(), dbnr, dtype.name(), uid);
        return list;
    } catch (org.springframework.dao.EmptyResultDataAccessException e) {
        return new ArrayList<JobLogEntry>();
    }
}



class ConRowMapper implements RowMapper<JobLogEntry> {
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

    /**
     * Maps rows.
     */
    public JobLogEntry mapRow(ResultSet rs, int rowNum) throws SQLException {
        return new JobLogEntry(rs.getInt("dbnr"), 
                               rs.getString("dtype"), 
                               dateFormat.format(rs.getTimestamp("zeit")), 
                               rs.getString("level"), 
                               rs.getString("message"));
    }
}

预先感谢您的所有想法

EN

回答 2

Stack Overflow用户

发布于 2011-05-26 15:36:32

我想知道getLastLogs()方法。为什么查询获取会话UUID,然后在另一个查询中使用它呢?我猜可以在一个查询中完成。

当您提到Derby时,我会认为只有Java才能访问该数据库。这是真的吗?你知道它优化得很好吗(例如,每个WHERE子句都有合适的索引)?

你使用连接池吗?这样,您就可以预先支付创建连接的成本,并将其分摊到您运行的所有查询中。

我看到了jdbcTemplate,所以你一定是在用Spring。我会将调试或跟踪拦截器连接起来,看看时间都花在哪里了。

我也推荐使用Visual VM 1.3.2来安装所有插件。它将为您提供更多的数据。

票数 1
EN

Stack Overflow用户

发布于 2011-05-26 19:49:23

可能的原因可能是HP-UX上的GC工作缓慢和阻塞。尝试删除冗余的System.gc()调用,并使用一些JVM选项来优化:)

查看关于HP性能调优的精彩演示文稿:http://www.scribd.com/doc/47433278/Javamemorymanagemen

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6135070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档