我在我的应用程序中遇到了臭名昭着的OutOfMemoryException,而不是简单地增加可用堆空间的数量,我试图查看问题所在,以防万一,我的应用程序出现了某种泄漏.
我添加了JVM参数-XX:+ HeapDumpOnOutOfMemoryError,当遇到OutOfMemory错误时会创建堆转储.然后我分析了使用不同的分析工具生成的转储文件.然后我开始使用-Xmx参数并观察模式.
令我困惑的是以下内容.为什么在分析转储时我发现所有对象的总大小远小于我使用-Xmx参数设置的总大小?例如,假设我将-Xmx设置为'2048m'.当我分析转储文件时,我在堆上发现了总共400Mb的对象.我期待找到2GB.我错过了什么吗?
我正在使用HSQL在我的java应用程序上运行许多单元测试.我正在使用Spring + Hibernate.从MySQL切换到HSQL时遇到问题.测试在MySQL上完美运行,但每当我改为HSQL时,我都会遇到以下异常:
Caused by: org.hsqldb.HsqlException: invalid schema name: LMS
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.SchemaManager.getSchemaHsqlName(Unknown Source)
at org.hsqldb.SchemaManager.getSchemaName(Unknown Source)
at org.hsqldb.Session.getSchemaName(Unknown Source)
at org.hsqldb.SchemaManager.getTable(Unknown Source)
at org.hsqldb.ParserDQL.readTableName(Unknown Source)
at org.hsqldb.ParserDQL.readSimpleRangeVariable(Unknown Source)
at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
at org.hsqldb.Session.compileStatement(Unknown Source)
at org.hsqldb.StatementManager.compile(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我的Spring配置如下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver" />
<property name="url" value="jdbc:hsqldb:file:lms" />
<property name="username" value="SA"/>
<property name="password" value=""/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan"> …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的HibernateInterceptor,基本上我想自动设置几个字段.这个拦截器(如下所示)扩展了EmptyInterceptor:
public class EntityAuditInterceptor extends EmptyInterceptor {
/**
* The Serial Version UUID.
*/
private static final long serialVersionUID = 4636626262147801287L;
/* (non-Javadoc)
* @see org.hibernate.EmptyInterceptor#onFlushDirty(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.Object[], java.lang.String[], org.hibernate.type.Type[])
*/
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
// doing stuff here
return false;
}
/* (non-Javadoc)
* @see org.hibernate.EmptyInterceptor#onSave(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.String[], org.hibernate.type.Type[])
*/
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// doing stuff …
Run Code Online (Sandbox Code Playgroud) 我有一个问题,即自Joda-Time库返回的纪元以来的天数根据我输入的日期而变化.如果我进入, 我会期望相同的结果,因为他们都是在同一天.以下是我的代码.2012-05-14 22:00:00
2012-05-14 02:00:00
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = sdf.parse("2013-05-03 07:00:00");
Date date2 = sdf.parse("2013-05-03 23:30:00");
MutableDateTime epoch = new MutableDateTime();
epoch.setDate(0); //Set to Epoch time
System.out.println("Epoch: " + epoch);
Days days1 = Days.daysBetween(epoch, new MutableDateTime(date1.getTime()));
Days days2 = Days.daysBetween(epoch, new MutableDateTime(date2.getTime()));
System.out.println("1) Days Since Epoch: " + days1.getDays());
System.out.println("2) Days Since Epoch: " + days2.getDays());
} catch (ParseException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
Epoch: 1970-01-01T11:09:00.414+01:00
1) Days Since …
Run Code Online (Sandbox Code Playgroud) 目前我正在努力解决Sun课堂上的一个错误java.net.Authenticator
.似乎Authenticator
该类具有系统范围的静态Authenticator
.这导致我的多线程应用程序中出现以下问题.
此时,系统将获取用户2的消息,而不是用户1的消息.
我试过寻找解决方案.许多人建议尝试以下代码:
AuthCacheValue.setAuthCache(new AuthCacheImpl());
Authenticator.setDefault(exchangeAuthenticator);
Run Code Online (Sandbox Code Playgroud)
但是,这对我来说不起作用,因为我的应用程序是多线程的(exchangeAuthenticator
将始终设置为在最新线程中初始化的身份验证器).
如果有人有任何想法,即使是黑客目前也会做,我真的很感激,因为目前唯一的"整洁"解决方案是synchronized
在主要的执行方法上放置一个对性能产生巨大影响的方法.