小编Cam*_*ron的帖子

在Freemarker宏中模拟空参数

我正在使用Freemarker构建一个站点并且已经开始大量使用宏.我知道在Freemarker 2.3中,将空值作为参数传递给宏等同于根本不传递参数所以我创建了一个名为"null"的全局变量来模拟我的宏中的空值检查:

<#assign null="NUL" />
Run Code Online (Sandbox Code Playgroud)

现在在我的宏中我可以这样做:

<#maco doSomething param1=null>
  <#if param1 != null>
    <div>WIN!</div>
  </#if>
</#macro>
Run Code Online (Sandbox Code Playgroud)

如果我想传递一个不是标量的参数,问题就来了.例如,将List(在Freemarker中是SimpleSequence)传递给宏并检查我的null关键字会产生错误:

freemarker.template.TemplateException:唯一合法的比较是在两个数字,两个字符串或两个日期之间.左手操作数是freemarker.template.SimpleSequence右手操作数是freemarker.template.SimpleScalar

我看了一下freemarker代码,我可以看到问题(ComparisonExpression.isTrue()):

if(ltm instanceof TemplateNumberModel && rtm instanceof TemplateNumberModel) { 
  ...
}
else if(ltm instanceof TemplateDateModel && rtm instanceof TemplateDateModel) {
  ...
}
else if(ltm instanceof TemplateScalarModel && rtm instanceof TemplateScalarModel) {
  ...
}
else if(ltm instanceof TemplateBooleanModel && rtm instanceof TemplateBooleanModel) {
  ...
}
// Here we handle compatibility issues
else if(env.isClassicCompatible()) {
  ...
}
else {
  throw new TemplateException("The only legal …
Run Code Online (Sandbox Code Playgroud)

freemarker

12
推荐指数
2
解决办法
2万
查看次数

使用大量AOP请求范围bean时的性能问题

我正在使用Spring 3处理一个半大型应用程序,并且在同时向其投掷数百个用户时遇到了性能问题.我使用Spring的AOP代理使用了几个请求范围的bean,我可以看到每次调用其中一个bean上的任何方法时,都会调用CGLIB拦截器,然后调用AbstractBeanFactory.getBean(),它调用add()on现有Spring bean的同步集.由于这个add()是同步的,所以当有数千个调用它等待添加到同一个列表时,它会有效地锁定服务器.

有没有办法使用请求范围的bean来解决这个问题?我在Spring文档中读到,如果bean实现了任何接口(http://static.springsource.org/spring/docs/2.0.0/reference/aop.html#d0e9015),那么CGLIB就不会被使用,但是我的请求范围是bean所有实现一个(实际上是同一个),它仍然发生.我肯定需要将bean作为请求作用域,因为它们的某些字段是在应用程序的一个部分中为特定请求计算的,然后我使用SpEL在同一请求期间在应用程序的不同部分获取它们的值.我想如果我把bean原型作为范围,当我第二次使用SpEL来获取它时,我会有一个新鲜的对象.

这是一个代码示例,说明了我的问题.请参阅最后两行,了解描述我遇到问题的地方.

<!-- Spring config -->
<bean name="someBean" class="some.custom.class.SomeClass" scope="request">
    <property name="property1" value="value1"/>
    <property name="property2" value="value2"/>
    <aop:scoped-proxy/>
</bean>

<bean name="executingClass" class="some.other.custom.class.ExecutingClass" scope="singleton">
    <property name="myBean" ref="someBean" />
</bean>


public Interface SomeInterface {
    public String getProperty1();
    public void setProperty1(String property);
    public String getProperty2();
    public void setProperty2(String property);
}

public class SomeClass implements SomeInterface {
    private String property1;
    private String property2;

    public String getProperty1() { return propery1; }
    public void setProperty1(String property) { property1=property;}

    public String getProperty2() { return propery2; …
Run Code Online (Sandbox Code Playgroud)

java aop spring cglib

9
推荐指数
1
解决办法
3534
查看次数

C2编译器在启动时使CPU饱和

我在Java 7上有一个java servlet应用程序,它通常在系统资源消耗方面非常健康.通常,服务器上的CPU使用率低于50%.然而,在启动后的几分钟内,它的行为有很大不同,以至于如果CPU在此期间尝试提供大量流量,则可以在几分钟内将其固定为100%.结果是响应时间慢,网络超时,甚至有时长时间的垃圾收集暂停.

为了诊断问题,我在服务器启动时进行了一系列线程转储,同时运行了顶级-H.通过将每个java线程与pid相匹配,我可以始终看到C2 CompilerThread使用到目前为止最多的CPU.我已经研究了这个线程的作用,我理解它是一个基于运行时统计信息优化代码的Java编译器.但是从我所做的所有阅读中,我无法说出改善情况的最佳方法.我能收集到的唯一选择是:

  1. 从C2切换到TieredCompiler(但这会在启动后的前几分钟内获得更好的性能吗?)
  2. 打开-XX:+ PrintCompilation以查看正在优化的内容(但我如何处理此信息?在服务器以某种方式接受流量之前,我可以强制优化它吗?)

什么是最好的方法,还有其他选择尝试和缓解启动后的CPU使用率?

java performance jvm

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

Archaius的财产变更监听者

我正在使用Archaius来保持托管我的应用程序的所有服务器之间的系统属性.我可以看到所有属性getter都可以在该属性发生变化时调用回调(例如,参见第三个参数getStringProperty()),但我想监听任何属性更改.我可以实现一些接口并在某处注册为监听器吗?

java apache-commons-config netflix-archaius

3
推荐指数
1
解决办法
1580
查看次数

Java性能:获取和设置列表

谁能告诉我其中任何一个是否会比在Java 1.6下编译的其他任何一个更好?假设MyObject是一个带有一个名为listField的字段的类,它有一个getter和setter

样品#1:

MyObject obj = new MyObject();
List<String> lst = new ArrayList<String>(1);
lst.add("Foo");
obj.setListField(lst);
Run Code Online (Sandbox Code Playgroud)

样品#2:

MyObject obj = new MyObject();
obj.setListField(new ArrayList<String> (1));
obj.getListField().add("Foo");
Run Code Online (Sandbox Code Playgroud)

我的想法是,ArrayList的一个本地实例的创建将创建内存开销,但调用getListField()每当你想添加到列表是不一样快访问列表的本地版本.也许,如果有要添加到列表中的几个项目,样品#1是快,但只有少数项目样本#2是更快?或将编译器优化这一点,以便调用getListField()等效于访问列表的本地版本?

java performance

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