Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] high JVM consumption on springboot-aspectj LTW

Hard to say without seeing the whole application. But as for 30 ms latency, maybe the aspect code inside your advice method takes as much already.

  • Did you measure and compare the complete advice method execution time to the time it takes to call execute proceed(), i.e. the original method call as such?
  • Did you measure how expensive the whole xxxStore and LoggerStore stuff is?
  • There is an if() in your pointcut. What does the method evaluating the condition do? You omitted it here. Maybe that is also part of what costs time.
  • Another question is if you really use AspectJ or just Spring AOP? I am just asking to be 100% sure because your second pointcut targets a Spring package.
  • What about the advice code for the other pointcut? Is it the same or different?
  • In your around advice you only seem to call proceed() exactly once as the very last instruction and return its result unfiltered. Have you considered to just use a simple before advice instead in this case?

--
Alexander Kriegisch
https://scrum-master.de
 

Rajendra Bhat schrieb am 30.09.2020 09:24 (GMT +07:00):

Hi  Alexander,
 
Any suggestions on below shared aspect.. ..?
 
Regards,
Rajendra Bhat 

On Mon, Sep 28, 2020 at 11:14 AM Rajendra Bhat <rajhalkere@xxxxxxxxx> wrote:
Hi  Alexander,
 
Thanks for your quick response. 

We have added the below aspect, I believe it should not cause not much latency.
 

@Pointcut("execution(* xx.xx.xx.xx.rest.customfilter.doFilter"

+ "(javax.servlet.ServletRequest,javax.servlet.ServletResponse,javax.servlet.FilterChain)) && args(request,response,filterChain) && if()")

 

We used "around" the advice. Advice logic as below.

 

HttpServletRequest req = (HttpServletRequest) request;

   

    if (!req.getRequestURI().startsWith("/admin")) {

String shadowHeader = req.getHeader("XXX");

String rugsUuidHeader = req.getHeader("XXX");

if (logger.isDebugEnabled()) {

logger.debug(shadowHeader + "--" + req.getRequestURI());

}

if (!StringUtil.isEmpty(shadowHeader)) {

xxxStore.getInstance().addContext(new xxxContext(shadowHeader));

xxxLogStore.getInstance().initializeShadowLog(xxxStore.getInstance().getContext().getCorrelationId());

} else if (!StringUtil.isEmpty(rugsUuidHeader)) {

xxxStore.getInstance().addContext(rugsUuidHeader);

 

}

 

 

    }

 

return (jointPoint.proceed());

 

 

And another aspect on @Pointcut("execution( * org.springframework.messaging.MessageChannel.send(org.springframework.messaging.Message,long)) . in

 

This also around advice, inside we are doing if condition and log4j logging.

 

Could please advise below aspect is causing 30 ms latency, something else we need to tune..?

 

Regards,

Rajendra Bhat


On Sat, Sep 26, 2020 at 5:43 AM Andy Clement <andrew.clement@xxxxxxxxx> wrote:
There is a patch (and github fork) here https://bugs.eclipse.org/bugs/show_bug.cgi?id=565450 that someone made that is supposed to help I think - it isn't integrated because I haven't had time to try it out and review it. If you feel like building an AspectJ to try it out, that might be more evidence we should get integrated sooner rather than later.
 
Andy

On Thu, 24 Sep 2020 at 20:18, Alexander Kriegisch <alexander@xxxxxxxxxxxxxx> wrote:
Hi Rajendra.

Thanks for the question and the hep dump screenshot. Compile time
weaving (CTW) would not solve your latency problem. In comparison to
load time weaving (LTW) you would only save time for class-loading
during application start-up. After LTW is done, the application's
performance should be the same as with CTW.

Memory consumption and performance impact of AspectJ are strongly
correlated with what your aspects do and how broadly they are applied to
the target classes. So I am afraid without seeing your aspect code
nobody will be able to help you. The number of aspects, pointcuts and
advice is way less relevant than scope (pointcut) and content (advice
method implementation) of the aspects as such. For example, a simple
advice like this can be potentially super expensive:

before() : call(* *(..)) {
  doSomeExpensiveLogging();
  useSomeExpensiveExternalResource();
}

Why? Because it would globally apply to each method call in your whole
application. This would be just as slow as if without AOP you would add
those method calls to each place in your code before calling methods. In
most cases it is not AspectJ as such which causes huge overhead (even
though both the runtime and the weaver of course consume a few
resources, which usually is no problem, but what the aspect does and how
many times. Hence, the problem usually sits in front of the keyboard,
even though it is of course possible that there is a memory leak or
other problem in AspectJ.

Bottom line: Please provide more information, especially full aspect
code. aop.xml would also be nice.

Regards
--
Alexander Kriegisch
https://scrum-master.de


Rajendra Bhat schrieb am 25.09.2020 09:36 (GMT +07:00):

> we observed around 10% latency overhead after adding aspectj LTW.
> during the heap dump I observed lot memory consumption related to the
> aspectj.
>
> Around 400 MB consumed by Aspecj, I have added 2 to 3 inteception.
>
> hereby attached heap dump details.
>
> please advise how to overcome on this..? We cannot use compile-time
> weaving, because we adding aspect on the external jar.
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/aspectj-users

 
--
Thanks and
Regards

Rajendra Bhat

 
--
Thanks and
Regards

Rajendra Bhat

Back to the top