1 0

一个简答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 下则运行有错误。该问题我总结大致出错有两种可能

 

  1. double 精确计算错误,导致值偏大。 
  2. 我在本地都是把启动内存 -Xms20M -Xmx60M  在重现出来,在cpu资源很卡的情况下。在生产服务器-Xms512M -Xmx1024M  都能重现,但是机器cpu mey都使用很厉害情况下。
  3. 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

1个答案 按时间排序 按投票排序

0 0

引用
DateUtils.parserDate

这个方法的实现呢?
如果你用的是java.text.SimpleDateFormat会有并发同步问题:
引用
日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。


我想问题是因为多线程并发时出现的。

2012年12月21日 08:44

相关推荐

    JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-windows-ia32.exe)

    在本压缩包文件"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的...

    weblogic12c 安装包 fmw_12.2.1.2.0_wls_Disk1_1of1.zip

    在集群中,如果一个节点出现故障,应用可以无缝地迁移到其他健康的节点上。 3. **管理工具**:Oracle WebLogic Server 提供了WebLogic Server Administration Console,这是一个基于Web的图形界面,用于配置、监控...

    JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-x64.bin)

    Oracle JRockit是一款高性能、优化过的Java虚拟机(JVM),尤其在服务器端应用和大规模分布式环境中表现出色。它由Oracle公司开发,是Java应用程序的关键组成部分,负责运行和管理Java代码。标题中的"jrockit-jdk...

    JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-windows-x64.exe)

    Oracle JRockit是一款高性能、优化过的Java虚拟机(JVM),专为服务器端应用程序设计,尤其是在需要高吞吐量和低延迟的环境中表现卓越。它曾经是Oracle公司的一个重要产品,但现在已被Java HotSpot VM所取代,后者是...

    Oracle JRockit_The Definitive Guide

    - **案例二**:通过调整JVM参数显著提高了一个复杂企业级应用的运行效率。 #### 总结 《Oracle JRockit:The Definitive Guide》作为一本深入研究JRockit的权威指南,不仅为读者提供了全面的技术背景知识,还分享了...

    JavaAPsvr_A_200608_WLS9.pdf

    在J2EE应用服务器上,内存溢出并不是一个常见问题,但是一旦发生,则可能意味着应用系统内部存在隐性的问题。常见的处理方式是重启应用服务器,但这只能暂时解决问题,而不能根除潜在的原因。因此,正确地识别并解决...

    1_JVM_1~3章上.pdf

    - 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

    jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-x64.bin,oracle官网下载无修改。

    Packtpub.Oracle.JRockit.The.Definitive.Guide.Jun.2010.rar

    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 jrockit-jdk1.5.0_24-R28.1.0-4.0.1-windows-ia32.part2.rar

    jkd1.632wei_v3.5.8.18_xfdown.com.zip

    "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公司...

    jrockit-jdk1.6.0_181-windows

    2. **动态编译**:JRockit包含了名为“JRockit Mission Control”的一套工具,其中包括一个实时编译器(Real Time Compiler),它能够在运行时将热点代码编译为机器码,从而提高执行效率。 3. **资源管理**:...

    JRockit(5)

    Oracle JRockit Mission Control 4.0.1

    Bea JRockit j2sdk 1.4.2_05 win32

    Bea JRockit JVM在处理这一问题上表现出色,它提供了更好的内存管理策略,能够有效避免或减少此类异常的发生,为开发者提供更稳定的运行环境。 **Oracle收购BEA Systems** 2008年,Oracle宣布收购BEA Systems,...

    JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-ia32.bin)

    Oracle JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-ia32.bin)适用于Linux x86系统

    JRockit (jrockit-jdk1.6.0_45-R28.2.7-4.1.0-solaris-sparcv9.bin)

    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-R28.1.0-4.0.1-windows-ia32.part3.rar jrockit-jdk1.5.0_24-R...

    jrockit-jdk1.6.0_171-windows_x86_64

    综上所述,"jrockit-jdk1.6.0_171-windows_x86_64"代表的是一个专为高性能服务器设计的Java运行环境,适合那些需要在Windows 64位环境下运行大型、高并发的Java应用的企业和开发者。其独特的性能优势和优化特性,...

    JRockit.zip

    总的来说,Oracle JRockit是Java发展历史上的一个重要里程碑,它的技术创新和性能优势对后来的JVM设计产生了深远影响。虽然不再活跃,但理解JRockit的特性和技术可以帮助我们更好地理解现代Java虚拟机的工作原理和...

Global site tag (gtag.js) - Google Analytics