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

| 关于在HP \\ UX服务器上运行我们的公司Java应用程序的性能问题,我需要您的帮助。应用程序是一个独立的工具,它可以将多个数据库上的数据同步到一个数据库中,与XML-RPC协议上的远程控制进行通信,并使用本地Derby(Java DB)数据库实例来保存配置数据等。我们在其他环境上没有性能问题像Windows XP,Linux和AIX一样使用Sun JVM的负载。经过一系列测试,我们发现最耗时的是与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优化JVM选项/ae/tprf_tunejvm_v61.html,但没有任何明显的改善。 JVM信息: Java HotSpot(TM)64位服务器VM(19.1-b02-jinteg:2011mar11-16:46 PA2.0W(aCC_AP),混合模式) Java:版本1.6.0.10,供应商\“ Hewlett-Packard Company \” 我们使用以下实例: 作业系统:HP-UX(B.11.23) 体系结构:PA_RISC2.0W 64bit 处理器:2 物理内存总大小:4088 MB 交换大小:4090 MB 这是运行缓慢的代码的示例。在HP上执行需要几秒钟,而在Windows上则需要10到30毫秒:
/** 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\"));
    }
}
预先感谢您的所有想法     
已邀请:
我想知道方法
getLastLogs()
。为什么要查询以获取会话UUID,然后转过来在另一个查询中使用它?我猜想它可以在一个查询中完成。 当您说Derby时,让我认为只有Java才能访问该数据库。真的吗?您知道它的优化效果很好吗(例如,每个WHERE子句都有正确的索引)吗? 您是否使用连接池?这样,您可以支付建立连接的费用,并在您运行的所有查询中摊销它。 我看到了jdbcTemplate,所以您必须使用Spring。我将连接调试或跟踪拦截器,并查看花费的时间。 我还建议Visual VM 1.3.2将安装所有插件。它将为您提供更多数据。     
可能的原因可能很慢,并且在HP-UX上使用笨拙的GC工作。尝试删除多余的System.gc()调用,并使用一些JVM GC选项来优化:) 请参阅有关HP性能调整的精美演示文稿:http://www.scribd.com/doc/47433278/Javamemorymanagemen     

要回复问题请先登录注册