-
一个简答double计算在jrockit_150_22运行变成了17700478709.78,上亿的数值10
最近运到一个很棘手的问题,请大家帮我看看,就是一个简单double数值计算,在jdk下运行正常,但是是在jrockit下运行出的结果变成了上亿了。jrockit在linux redhat 5环境下运行,也不是每次都能报出该问题,有时候把shell启动参数设置小-server -Xms20M -Xmx60M 就能重新改问题。
<INFO> 88060051164011
<INFO> FineRate
INFO 2012-12-11 20:12:48 [cn.com.jbbis.common.cls.ClsCompute] [getPI] - 333 ClsConst.PI_INTE, +double Capi 58301.78, double thisRate 17.82, double thisTermRate 0.0, double thisIntePerc, 0.0
INFO 2012-12-11 20:12:48 [cn.com.jbbis.common.cls.ClsCompute] [getPI] - 337 ClsConst.PI_INTE, 1.770047870978E10 ClsConst.PI_S_ALLOINTE, 1.770047870978E10 ClsConst.PI_S_SUBSINTE, 1.770047870978E10
INFO 2012-12-11 20:12:48 [cn.com.jbbis.common.cls.ClsCompute] [getPI] - 415 ClsConst.PI_INTE, 1.770047870978E10 ClsConst.PI_S_ALLOINTE, 1.770047870978E10 ClsConst.PI_S_SUBSINTE, 1.770047870978E10
INFO 2012-12-11 20:12:48 [cn.com.jbbis.common.cls.ClsCompute] [getFine] - 285 raFine:1.770047870978E10
<INFO> 88060051164011上面是我的运行日志,下面我把该处代码帖出来。
这个twoTest方法我根据生产报错,把输入的值记录起来,重新传入的模拟写的一个测试方法。上面 - 337处打印的日志就是ClsComputeUtils.InteByDay2()方法返回的值。
在sun jdk下运行正常, 但是在bea jrockit 下则运行有错误。该问题我总结大致出错有两种可能
- double 精确计算错误,导致值偏大。
- 我在本地都是把启动内存 -Xms20M -Xmx60M 在重现出来,在cpu资源很卡的情况下。在生产服务器-Xms512M -Xmx1024M 都能重现,但是机器cpu mey都使用很厉害情况下。
- ClsPublic.DateDiff("d", EndDate, BeginDate) 这两个日期计算相差天数的在方法有错。在jrockit有错
@Test public void twoTest(){ for(int i=0;i<10000;i++){ // 2009-12-21 0:00:00---------- 2012-8-25 0:00:00 Date BeginDate=DateUtils.parserDate("2009-12-21", DateUtils.SHORT_DATE_FORMAT_STR); Date EndDate=DateUtils.parserDate("2012-8-25", DateUtils.SHORT_DATE_FORMAT_STR); // ClsPublic.DateDiff("d", EndDate, BeginDate); double Capi= 58301.78,thisRate =17.82,thisIntePerc=0.0; try { double b=ClsComputeUtils.InteByDay2(BeginDate, EndDate, 58301.78, thisRate, thisIntePerc, ClsConst.RATE_INTERATE, ClsConst.COMP_KIND_S_INTE); logger.info("=============="+b); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
public static double InteByDay2(Date BeginDate, Date EndDate, double C, double Rate, double IntePerc, String FieldName, String strCompKind) throws Exception { double dblCalcRate = getCalcRate(Rate, IntePerc, strCompKind); double dblCalcRateOfDay = getCalcRateOfDay(FieldName, dblCalcRate); logger.info(" 504 dblCalcRate:"+C +" dblCalcRateOfDay : "+dblCalcRateOfDay); // double b= C * ClsPublic.DateDiff("d", EndDate, BeginDate) * dblCalcRateOfDay; // logger.info(" 504 b:"+b ); // return b; return C * ClsPublic.DateDiff("d", EndDate, BeginDate) * dblCalcRateOfDay; }
private static double getCalcRate(double InteRate, double IntePerc, String strCompKind) throws Exception { if(ClsConst.COMP_KIND_S_INTE.equalsIgnoreCase(strCompKind)){ return InteRate; }else if (ClsConst.COMP_KIND_S_SUBSINTE.equalsIgnoreCase(strCompKind)){ return InteRate * (1 - IntePerc / 100); }else if (ClsConst.COMP_KIND_S_ALLOINTE.equalsIgnoreCase(strCompKind)){ return InteRate * IntePerc / 100; }else{ throw new NullPointerException("Not_COMP_KIND_S"); } }
private static double getCalcRateOfDay(String FieldName, double dblRate) throws Exception { if (FieldName.equalsIgnoreCase(ClsConst.RATE_INTERATE)) { return ClsRateDeal.getRateOfDay(dblRate); }else if (FieldName.equalsIgnoreCase(ClsConst.RATE_FINERATE)) { return ClsRateDeal.getFineRateOfDay(dblRate); }else { throw new NullPointerException("FieldNameNotFound"); } }
/** * 日期操作方法 返回两个日期的间隔,如果interval="d" 返回天数,如果interval="m" 返回月数,否则返回0 * <br><b>按照算头不算尾的原则计算</b></br> * @param interval * @param EndDate * @param BeginDate * @return */ public static int DateDiff(String interval, Date EndDate, Date BeginDate) { logger.info(" 685 EndDate:"+EndDate +" BeginDate:"+BeginDate); int i = 0; Calendar cEnd = Calendar.getInstance(); Calendar cBegin = Calendar.getInstance(); cEnd.setTime(EndDate); cBegin.setTime(BeginDate); cEnd.set(Calendar.SECOND, 0); cEnd.set(Calendar.MINUTE, 0); cEnd.set(Calendar.HOUR_OF_DAY, 0); cBegin.set(Calendar.SECOND, 0); cBegin.set(Calendar.MINUTE, 0); cBegin.set(Calendar.HOUR_OF_DAY, 0); if ("d".equals(interval)) { long intev = cEnd.getTimeInMillis() - cBegin.getTimeInMillis(); double dd = (intev / (1000.0D * 60.0D * 60.0D * 24.0D)); i = (int) dd; if ((dd - (double) i) > 0.001D){ i += 1; } } else if ("m".equals(interval)) { i = (cEnd.get(Calendar.YEAR) - cBegin.get(Calendar.YEAR)) * 12 + (cEnd.get(Calendar.MONTH) - cBegin.get(Calendar.MONTH)); Date datDateTemp = DateAdd("m", i, BeginDate, 0); if (datDateTemp.before(EndDate)) { i = i + 1; } } else if ("y".equals(interval)) { return cEnd.get(Calendar.YEAR) - cBegin.get(Calendar.YEAR); } else { i = 0; } logger.info(" 727 时间天数 i:"+i); return i ; }
问题补充:有经常使用JRockit 来项目开发的朋友吗!2012年12月20日 19:04
相关推荐
在本压缩包文件"jrockit-jdk1.6.0_45-R28.2.7-4.1.0-windows-ia32.exe"中,我们看到的是JRockit JVM的一个特定版本,适用于Windows x86平台。这个版本的详细信息包括:JDK 1.6.0更新45,R28.2.7版本以及4.1.0的...
在集群中,如果一个节点出现故障,应用可以无缝地迁移到其他健康的节点上。 3. **管理工具**:Oracle WebLogic Server 提供了WebLogic Server Administration Console,这是一个基于Web的图形界面,用于配置、监控...
Oracle JRockit是一款高性能、优化过的Java虚拟机(JVM),尤其在服务器端应用和大规模分布式环境中表现出色。它由Oracle公司开发,是Java应用程序的关键组成部分,负责运行和管理Java代码。标题中的"jrockit-jdk...
Oracle JRockit是一款高性能、优化过的Java虚拟机(JVM),专为服务器端应用程序设计,尤其是在需要高吞吐量和低延迟的环境中表现卓越。它曾经是Oracle公司的一个重要产品,但现在已被Java HotSpot VM所取代,后者是...
- **案例二**:通过调整JVM参数显著提高了一个复杂企业级应用的运行效率。 #### 总结 《Oracle JRockit:The Definitive Guide》作为一本深入研究JRockit的权威指南,不仅为读者提供了全面的技术背景知识,还分享了...
在J2EE应用服务器上,内存溢出并不是一个常见问题,但是一旦发生,则可能意味着应用系统内部存在隐性的问题。常见的处理方式是重启应用服务器,但这只能暂时解决问题,而不能根除潜在的原因。因此,正确地识别并解决...
- Sun Classic/Exact VM:世界上第一款商用Java虚拟机,随JDK 1.0发布,后来被HotSpot VM取代。 - HotSpot VM:成为JDK 1.3默认虚拟机,并且是目前使用最广泛的虚拟机之一。 - Mobile/Embedded VM:适用于移动或...
jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-x64.bin,oracle官网下载无修改。
6. **JRockit Flight Recorder**:这是一个强大的诊断和分析工具,可以记录运行时数据,用于事后分析和故障排查。 7. **资源管理和监控**:了解如何配置和管理JRockit的内存池、线程池和其他系统资源,以确保系统的...
jrockit-jdk1.5.0_24-R28.1.0-4.0.1-windows-ia32.part2.rar jrockit-jdk1.5.0_24-R28.1.0-4.0.1-windows-ia32.part2.rar
"jkd1.632wei_v3.5.8.18_xfdown.com.zip" 文件是JDK 1.6 32位版本的一个安装包,用于在32位操作系统上开发和运行Java程序。 JDK 1.6,也被称为Java SE (Standard Edition) 6,是Sun Microsystems(后被Oracle公司...
2. **动态编译**:JRockit包含了名为“JRockit Mission Control”的一套工具,其中包括一个实时编译器(Real Time Compiler),它能够在运行时将热点代码编译为机器码,从而提高执行效率。 3. **资源管理**:...
Oracle JRockit Mission Control 4.0.1
Bea JRockit JVM在处理这一问题上表现出色,它提供了更好的内存管理策略,能够有效避免或减少此类异常的发生,为开发者提供更稳定的运行环境。 **Oracle收购BEA Systems** 2008年,Oracle宣布收购BEA Systems,...
Oracle JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-ia32.bin)适用于Linux x86系统
Oracle JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-solaris-sparcv9.bin)适用于Solaris SPARC (64-bit)系统
jrockit-jdk1.5.0_24-R28.1.0-4.0.1-windows-ia32.part3.rar jrockit-jdk1.5.0_24-R28.1.0-4.0.1-windows-ia32.part3.rar jrockit-jdk1.5.0_24-R28.1.0-4.0.1-windows-ia32.part3.rar jrockit-jdk1.5.0_24-R...
综上所述,"jrockit-jdk1.6.0_171-windows_x86_64"代表的是一个专为高性能服务器设计的Java运行环境,适合那些需要在Windows 64位环境下运行大型、高并发的Java应用的企业和开发者。其独特的性能优势和优化特性,...
总的来说,Oracle JRockit是Java发展历史上的一个重要里程碑,它的技术创新和性能优势对后来的JVM设计产生了深远影响。虽然不再活跃,但理解JRockit的特性和技术可以帮助我们更好地理解现代Java虚拟机的工作原理和...