JVM崩溃的原因

时间:2013-07-05 07:25:55

标签: java assembly jvm

这是崩溃日志


    # 
    # An unexpected error has been detected by HotSpot Virtual Machine: 
    # 
    #  SIGSEGV (0xb) at pc=0xf7754a07, pid=20403, tid=2813246368 
    # 
    # Java VM: Java HotSpot(TM) Server VM (1.5.0_06-b05 mixed mode) 
    # Problematic frame: 
    # V  [libjvm.so+0x152a07] 
    # 

    ---------------  T H R E A D  --------------- 

    Current thread (0x08145b60):  JavaThread "CompilerThread0" daemon [_thread_in_native, id=20419] 

    siginfo:si_signo=11, si_errno=0, si_code=1, si_addr=0x00000000 

    Registers: 
    EAX=0x00000000, EBX=0xf7bad7f0, ECX=0x0856de60, EDX=0xa151fa0c 
    ESP=0xa7ae9df4, EBP=0xa7ae9e28, ESI=0x080f8c40, EDI=0x0856de60 
    EIP=0xf7754a07, CR2=0x00000000, EFLAGS=0x00010292 

    Top of Stack: (sp=0xa7ae9df4) 
    0xa7ae9df4:   00000000 a7ae9e28 f77549d1 0856de60 
    0xa7ae9e04:   a16445c0 00004591 00004591 00000000 
    0xa7ae9e14:   a7aea34c a151fa0c f7bad7f0 080f8c40 
    0xa7ae9e24:   0856de60 a7ae9e78 f7a533ec 0856de60 
    0xa7ae9e34:   a7aea330 080f8c40 080f8c40 a152e124 
    0xa7ae9e44:   a16445c0 0856de60 0000452c 3f7fff58 
    0xa7ae9e54:   00001983 080f8c40 00000001 00000021 
    0xa7ae9e64:   00001983 a7aea358 f7bad7f0 a7aea330 

    Instructions: (pc=0xf7754a07) 
    0xf77549f7:   85 c0 74 76 8b 7d 08 83 ec 0c 8b 47 04 8b 40 08 
    0xf7754a07:   8b 30 50 ff 56 44 83 c4 10 85 c0 74 5d 8b 55 08 

    Stack: [0xa7a6b000,0xa7aec000),  sp=0xa7ae9df4,  free space=507k 
    Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
    V  [libjvm.so+0x152a07] 
    V  [libjvm.so+0x4513ec] 
    V  [libjvm.so+0x450e90] 
    V  [libjvm.so+0x3d6a24] 
    V  [libjvm.so+0x1a1496] 
    V  [libjvm.so+0x19e432] 
    V  [libjvm.so+0x1474b3] 
    V  [libjvm.so+0x1a6929] 
    V  [libjvm.so+0x1a6281] 
    V  [libjvm.so+0x4c8366] 
    V  [libjvm.so+0x4c2ba3] 
    V  [libjvm.so+0x424338] 
    C  [libpthread.so.0+0x53cc] 


    Current CompileTask: 
    opto:643      xxx.xxx.xxxx.TableCopyBean.copyBatch(Ljava/lang/String;Ljava/lang/String;Ljava/util/Hashtable;Ljava/util/List;)V (1021 bytes)

使用udcli命令分析说明


    00000000f77549f7 85c0             test eax, eax  
    00000000f77549f9 7476             jz 0xf7754a71 
    00000000f77549fb 8b7d08           mov edi, [rbp+0x8]
    00000000f77549fe 83ec0c           sub esp, 0xc 
    00000000f7754a01 8b4704           mov eax, [rdi+0x4]
    00000000f7754a04 8b4008           mov eax, [rax+0x8]
    00000000f7754a07 8b30             mov esi, [rax] 
    00000000f7754a09 50               push rax 
    00000000f7754a0a ff5644           call qword [rsi+0x44]
    00000000f7754a0d 83c410           add esp, 0x10
    00000000f7754a10 85c0             test eax, eax
    00000000f7754a12 745d             jz 0xf7754a71
    00000000f7754a14 8b5508           mov edx, [rbp+0x8] 

objdump Native框架的第一行:


    00152a07 PhiNode::Identity(PhaseTransform*)+0x47

JDK版本:1.5.0_16

抱歉,我无法理解汇编语言,任何人都可以帮助我吗?

这是函数 copyBatch 的java代码

public void copyBatch(String targetTable, String sourceTable,
        Hashtable<String, Object> conditionHt,
        List<Hashtable<String, Object>> replaceColumnValueLt)
        throws Exception {      
    ArrayList<ArrayList<Object>> paramValueList = new ArrayList<ArrayList<Object>>();

    ArrayList<String> targetColumnList = getTblColList(targetTable);
    _log.debug("[" + targetTable + "]get table columns " + targetColumnList);

    ArrayList<String> defaultColumnList = getDefTblColList(targetTable);
    _log.debug("[" + targetTable + "]get has default value columns"
            + defaultColumnList);

    List removeList = new ArrayList();
    if (!sourceTable.equals(targetTable)) {
        ArrayList<String> sourceColList = getTblColList(sourceTable);
        _log.debug("[" + sourceTable + "]get table columns "
                + sourceColList);
        for (Map map : replaceColumnValueLt) {
            for (String tCol : targetColumnList) {
                if (!sourceColList.contains(tCol)) {
                    if (!map.containsKey(tCol)) {
                        if (defaultColumnList.contains(tCol)) {
                            if (!removeList.contains(tCol))
                                removeList.add(tCol);
                        } else {
                            map.put(tCol, "");
                        }// end if
                    }// end if
                }// end if
            }// end for
        }// end for

    }

    for (int x = 0, xSize = removeList.size(); x < xSize; x++) {
        String rCol = (String) removeList.get(x);
        targetColumnList.remove(rCol);
    }

    for (Map map : replaceColumnValueLt) {
        ArrayList<Object> tmpList = new ArrayList<Object>();
        for (String column : targetColumnList) {
            if (map.containsKey(column)) {
                tmpList.add(map.get(column));
            }
        }
        paramValueList.add(tmpList);
    }

    for (ArrayList<Object> array : paramValueList) {
        Enumeration e = conditionHt.keys();
        while (e.hasMoreElements()) {
            String column = (String) e.nextElement();
            Object value = conditionHt.get(column);
            if (!(value instanceof List)) {
                array.add(conditionHt.get(column));
            }
        }
    }

    StringBuffer sql = new StringBuffer();
    sql.append("INSERT INTO " + targetTable + " (");
    for (String column : targetColumnList) {
        sql.append(column.toLowerCase() + ", ");
    }
    sql.setLength(sql.length() - 2);

    Hashtable replaceColumnValueHt = replaceColumnValueLt.get(0);

    sql.append(") SELECT ");
    for (String column : targetColumnList) {
        if (replaceColumnValueHt.containsKey(column)) {
            sql.append("?, ");
        } else {
            sql.append(column.toLowerCase() + ", ");
        }
    }
    sql.setLength(sql.length() - 2);

    sql.append(" FROM " + sourceTable + " WHERE ");
    Enumeration e = conditionHt.keys();
    while (e.hasMoreElements()) {
        String column = (String) e.nextElement();
        Object value = conditionHt.get(column);
        if (value instanceof List) {
            sql.append(column.toLowerCase() + " IN ")
                    .append(TransFormat.convertListToIN((List) value))
                    .append(" AND ");
        } else {
            sql.append(column.toLowerCase() + " = ? AND ");
        }
    }
    sql.setLength(sql.length() - 4);

    SqlBean sqlBean = new SqlBean(_conn, sql.toString(), _log);
    for (int i = 0; i < paramValueList.size(); i++) {
        ArrayList<Object> pList = paramValueList.get(i);
        for (int j = 0; j < pList.size(); j++) {
            sqlBean.addParameter(pList.get(j));
        }
        sqlBean.addBatch();
    }

    sqlBean.executeBatch();
}

0 个答案:

没有答案