小编Seb*_*ian的帖子

什么可能在长时间运行的进程中导致突然的ClassNotFoundException?

我们有一个非常小的Web服务(少于1K行代码)由Jetty运行.即使在压力测试阶段,该服务也始终如一.但是,经过13天的正常运行时间后,我们在同一天的两个节点中遇到了ClassNotFoundException.

奇怪的是,找不到的类已经存在(它是启动例程的一部分,并且它不断用于以前的请求).事实上,只需重新启动流程即可解决问题.两个节点都在不同的机器中,并且彼此独立.它们不依赖于外部资源,除了一个JMS连接.

在谷歌搜索时我找不到相关信息,因为大多数报告的问题与启动Java进程时类路径中缺少的类有关,这不是我们的情况.我们怀疑可能存在内存泄漏,从某种程度上破坏了JVM内存,但是这无法解释为什么同一时间在两个节点中发生同样的问题.在过去的五天里,我们一直在进行密集的压力测试,连接JVM监视器和内存泄漏分析器,一切看起来都很好.对于此测试,我们将进程内存从2GB减少到512MB.

细节:

  • 使用Java HotSpot(TM)64位服务器VM(内置16.3-b01,混合模式)
  • 使用jetty-runner-8.1.0.RC5.jar
  • 原始cmd行:java -Xmx2048M -jar jetty-runner-8.1.0.RC5.jar --port 5000 webapp.war
  • Intel Xeon E5-2680 8核(x2)+ 16GB RAM
  • 红帽企业Linux 6
  • 正在使用的一些框架:JBoss Resteasy,Spring IoC,Guava.

您能否就JVM突然"忘记"以前加载的类的存在而无法再次加载它的想法做出贡献?

Caused by: java.lang.ClassNotFoundException: com.a.b.c.SomeClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) ~[na:1.6.0_37]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_37]
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) ~[na:1.6.0_37]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) ~[na:1.6.0_37]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) ~[na:1.6.0_37]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ~[na:1.6.0_37]
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:424) ~[na:na]
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377) ~[na:na]
    at java.lang.Class.forName0(Native Method) ~[na:1.6.0_37]
    at java.lang.Class.forName(Class.java:247) ~[na:1.6.0_37]
    at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:95) ~[na:1.6.0_37]
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:107) ~[na:1.6.0_37]
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31) ~[na:1.6.0_37]
    at sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:370) ~[na:1.6.0_37]
    at sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:351) ~[na:1.6.0_37]
    at …
Run Code Online (Sandbox Code Playgroud)

java jvm noclassdeffounderror classnotfoundexception

16
推荐指数
1
解决办法
2620
查看次数

Java调度:Quartz vs Others?(即黑曜石)

我准备在我们的一个项目中加入Quartz.在寻找免费用户界面来帮助我们监控其执行状态(工作等)时,我们发现了这篇文章:为什么你不应该使用石英

作者说Quartz即使对于简单的任务也很复杂(我倾向于同意......)并且提到Obsidian是一个更好的选择,其中包括一个开箱即用的优秀UI.实际上,那个UI在某种程度上比我为Quartz(JWatch)找到的最好的免费替代品更好.注意:作者为黑曜石工作......

  • 有人推荐Obsidian而不是Quartz吗?(或任何其他替代方案)?
  • 你知道Quartz的任何更好的免费UI选择吗?

谢谢,

java scheduling quartz-scheduler

14
推荐指数
1
解决办法
1万
查看次数

Spring MVC Path匹配忽略双斜杠//

在Spring Boot应用程序中,我已经设置了一个带有url映射的过滤器/service1/*.这是使用a完成的FilterRegistrationBean.

还有一个映射到相同模式的控制器:

   @RestController @RequestMapping(path = "/service1")
   class Service1 {
   ...
Run Code Online (Sandbox Code Playgroud)

问题:

执行POST http://localhost:8080/service1/hello按预期工作(即,过滤器涉及请求处理链,并且调用了服务控制器).但是,执行http://localhost:8080//service1/hello(注意双斜杠)将绕过过滤器,但由于Spring MVC更宽松的路径匹配算法,无论如何都会到达控制器.

我已经读过可以自定义控制器路径匹配算法(链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-config-path-matching),但是我没有找到不忽略双斜杠的选项.

同样重要的是:这种行为意味着可以绕过任何受过滤器保护的Controller(不是Spring安全性,但任何自定义过滤器),只需在URL的任何部分放置一个双斜杠即可.我的理解是否正确?你知道MVC控制器路径匹配是否可以调整,以便在路径匹配算法中不会忽略双斜杠?

java spring spring-mvc url-mapping spring-boot

10
推荐指数
1
解决办法
2465
查看次数

什么JVM优化导致这些性能结果?

执行Java REST服务性能测试我看到一个意外的模式:在每次调用中创建并返回相同值对象的方法比仅返回存储在类或对象字段中的值对象的另一个版本运行得更快.

码:

@POST @Path("inline") public Response inline(String s) { 
    return Response.status(Status.CREATED).build(); 
}    

private static final Response RESP = Response.status(Status.CREATED).build();
@POST @Path("staticfield") public Response static(String s) { 
    return RESP; 
}

private final Response resp = Response.status(Status.CREATED).build();
@POST @Path("field") public Response field(String s) { 
    return resp; 
}
Run Code Online (Sandbox Code Playgroud)

字节代码:

  • 内联(更快):getstatic,invokestatic,invokevirtual,areturn
  • 静态归档(较慢):getstatic,areturn
  • 对象字段(较慢):aload,getfield,areturn

性能(使用Apache AB,单线程,多次运行,结果一致):

  • 内联:17078.29 [#/ sec](平均值)
  • 静电场:5242.64 [#/ sec](平均值)
  • 对象字段:5417.40 [#/ sec](平均值)

环境:RHEL6 + JDK Oracle 1.7.0_60-b19 64位

有可能JVM使用本机代码优化了内联版本,但从未考虑优化其他两个,因为它们已经很小了吗?

java performance jvm bytecode microbenchmark

7
推荐指数
1
解决办法
185
查看次数

是否可以更新使用Syncfusion的DocIO lib生成的Word文档的TOC(TableOfContents)?

我们的应用程序使用Syncfusion的DocIO库生成Word文档.基本上,我们加载模板并在其中插入特定书签中的特定文本,生成用户即时下载的Word文档.

我们面临的问题是:

  • 该模板长4页,具有TOC.
  • 随着我们添加内容,页面中的文档大小增加(自然)
  • 下载文档时,TOC仍会反映模板中使用的页码.换句话说,用户必须手动更新TOC(辅助点击 - >更新字段)才能刷新页码.

根据Syncfusion的文档(很少......),使用他们的lib是不可能的.因此,我们在模板中实现了一个AutoOpen宏,当打开文档作为变通方法时,它会更新TOC.但是,这会在打开文件时导致安全警告(因为宏),这使我们的使用感到不舒服.

你们有没有想过改进这个实现?谢谢,

.net c# ms-word

6
推荐指数
1
解决办法
6018
查看次数

评估Spring Expression Lang(SpEL)中的属性

我们的服务有一个根据属性文件安排的进程,读取属性refreshIntervalMillis.它的值直接在Quartz触发器中注入,具有以下配置:

<bean name="trigger"
    class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean "
    p:repeatInterval="${refreshIntervalMillis}"> 
...
</bean>
Run Code Online (Sandbox Code Playgroud)

但是,安装此服务的管理员会考虑小时/天,因此为了使事情变得更容易,我们将其更改为:

  1. 更名refreshIntervalMillisrefreshIntervalMinutes
  2. 已更改为上面的代码到以下内容:
p:repeatInterval="#{ 1000 * 60 * T(java.lang.Integer).valueOf(@configurationProperties['garbageLevelWatcher.refreshIntervalMinutes'])}"

注意:属性对象公开为名为"configurationProperties"的bean

是否有更简单的语法来实现相同的目标?

谢谢,

java spring expression properties spring-el

6
推荐指数
1
解决办法
1万
查看次数

有可能在spring-data-mongodb中注入一个自定义的Jackson ObjectMapper吗?

我们在我们的应用程序中使用Coda Hale指标,使用Json模块附加组件来改进暴露应用程序指标的某些REST服务的JSON输出.

最近,我们开始将指标保存到MongoDB.由于我们使用的是spring-data-mongodb,因此大大简化了保存POJO的代码.Spring的MongoDB类型映射使用通常的方法(对bean属性的内省来确定要保存和读取的内容),但是这对Code Hale对象(Timer,Counter等)不能很好地发挥作用.

如果我们可以让Spring使用已经可用于Jackson的JSON模块,那将是很棒的,因为我们将拥有保存序列化样式和维护的代码很少.

但是在阅读完文档和浏览一些Spring mongodb源文件之后,我找不到一个直接注入自定义Jackson序列化的方法.似乎自定义流程的唯一方法是创建自定义MongoTypeMapper.

有谁知道我们是否可以注入定制的杰克逊映射器,或者可以推荐替代解决方案?

谢谢

java mapping jackson spring-data-mongodb

6
推荐指数
1
解决办法
2616
查看次数

你会推荐Eclipse over VS 2010进行C#开发吗?

我可能不得不在短期内解决C#中的一些开发改进项目.目前,我们提供Visual Studio 2010许可证,但您可以随意使用您喜欢的任何工具.

由于我非常熟悉Eclipse(我喜欢Mylyn),我想知道这里有人是否有这两种环境的经验并且可以分享一些见解或建议.

谢谢,

c# eclipse visual-studio-2010

5
推荐指数
2
解决办法
2701
查看次数

Quartz Clustering - 在服务器启动时触发重复

在集群设置(使用JDBC数据存储)中使用Quartz 2.1.6和Spring 3.1时,我们遇到了一个问题.目前背景:

  • 作业和CRON触发器在spring配置文件中定义(见下文)
  • 在SchedulerFactoryBean中,overwriteExistingJobs属性设置为true,因此我们不会在每次部署时将新的作业定义添加到数据库中.
  • 但是,在群集中的每次部署之后,似乎每个节点都会重新创建触发器数据.例如,如果我们有2个指向1个作业和4个节点的触发器,则在集群部署之后,DB具有1个作业定义和4x2触发器.每次重新部署都会增加4x2触发器.

这种行为是否正常?如果是:我们如何告诉Quartz不要在每次部署时重新创建触发器数据?(或覆盖该数据,与Jobs一样)

<bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="com.etc.MyJob" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
    p:waitForJobsToCompleteOnShutdown="false" lazy-init="false">

    <property name="dataSource" ref="myDataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="overwriteExistingJobs" value="true" />
    <property name="autoStartup" value="true" />
    <property name="jobFactory">
                <bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory"/>
            </property>
    <property name="triggers">
        <list>
            <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" p:cronExpression="0 0 0 * * ?"                   p:misfireInstruction="2">
                <property name="jobDetail" ref="myJob" />
            </bean>
            <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "
                p:cronExpression="0 0 20 * * ?"
                p:misfireInstruction="2">
                <property name="jobDetail" ref="myJob" />
            </bean>
        </list>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">fsbu_scheduler</prop>
            <prop …
Run Code Online (Sandbox Code Playgroud)

spring cluster-computing quartz-scheduler crontrigger

5
推荐指数
1
解决办法
7644
查看次数

@ afterpectJ语句为"after():staticinitialization(*)"

我正在尝试使用实例化模型中的pertype实现跟踪方面.通过这种方式,我将能够为每种类型的每个类使用一个记录器.

从我们的一些例子中我可以找到这个代码来初始化记录器:

public abstract aspect TraceAspect pertypewithin(com.something.*) {
    abstract pointcut traced();
    after() : staticinitialization(*) {
        logger = Logger.getLogger(getWithinTypeName());
    }
    before() : traced() {
        logger.log(...);
    }
    //....
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,我无法将其完全转换为@AspectJ语法(这是我控制之外的项目要求),尤其是我需要设置记录器的部分,只执行一次该代码.

这可能吗?

谢谢,

java aspectj aspects static-initialization

2
推荐指数
1
解决办法
1861
查看次数

单元测试依赖于Spring的WebApplicationContextUtils.getRequiredWebApplicationContext(context)的Servlet

我想WebApplicationContextUtils.getRequiredWebApplicationContext(context)在其init()方法中对依赖于Spring的servlet代码进行单元测试.

以下是代码的一部分:

@Override
public void init() throws ServletException {
super.init();
WebApplicationContext applicationContext =
    WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.injectedServiceBean = (SomeService) applicationContext.getBean("someBean");
}
Run Code Online (Sandbox Code Playgroud)

将适当的applicationContext.xml(测试版本)注入此文本的最佳方法是什么?

我知道Spring的@ContextConfiguration,但是我不确定将${testClass}Test-context.xml注释加载到servlet上下文中的上下文注入的最佳方法,以便getRequiredWebApplicationContext(...)可以返回它.

java spring unit-testing servlets applicationcontext

2
推荐指数
1
解决办法
2495
查看次数