inlining AllocateHeap()

David Holmes david.holmes at oracle.com
Fri Mar 13 08:35:14 UTC 2015


On 13/03/2015 6:13 PM, Thomas Stüfe wrote:
> Hi Yasumasa, David,
>
> Maybe it would make sense to make the number-of-frames-to-skip-parameter
> configurable?

That would require more significant changes to NMT I think - plus I 
don't see how it will help if you have to know a-priori whether inlining 
has occurred or not. ??

Thanks,
David

> Because the direct caller of AllocateHeap or os::malloc may also not be
> interesting but still a generic wrapper. So, the user doing the
> allocation trace could finetune this parameter to fit his needs.
>
> Thomas
>
>
>
> On Fri, Mar 13, 2015 at 6:40 AM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     Hi Yasumasa,
>
>     On 12/03/2015 9:58 PM, Yasumasa Suenaga wrote:
>
>         Hi all,
>
>         I tried to use NMT with details option on OpenJDK7 on RHEL6.6,
>         but I got
>         address at AllocateHeap() as malloc() caller.
>
>         I checked symbol in libjvm.so <http://libjvm.so/> in
>         OracleJDK8u40 Linux
>         x64, it has AllocateHeap()
>         symbol.
>
>         AllocateHeap() is defined as inline function, and it gives
>         CURRENT_PC to
>         os::malloc(). I guess that implementation expects AllocateHeap()
>         will be
>         inlined.
>
>
>     It seems so.
>
>         It may occur with GCC (g++) optimization only, however I want to
>         fix it to
>         analyze native memory with NMT on Linux.
>
>
>     According to the docs [1]:
>
>     "GCC does not inline any functions when not optimizing unless you
>     specify the ‘always_inline’ attribute for the function"
>
>         I applied patch as below. This patch makes AllocateHeap() as inline
>         function.
>         --------------
>         diff -r af3b0db91659 src/share/vm/memory/__allocation.inline.hpp
>         --- a/src/share/vm/memory/__allocation.inline.hpp Mon Mar 09
>         09:30:16 2015
>         -0700
>         +++ b/src/share/vm/memory/__allocation.inline.hpp Thu Mar 12
>         20:45:57 2015
>         +0900
>         @@ -62,11 +62,18 @@
>              }
>              return p;
>         }
>         +
>         +#ifdef __GNUC__
>         +__attribute__((always_inline)__)
>         +#endif
>
>
>     I dislike seeing the gcc specific directives in common code. I'm
>     wondering whether we should perhaps only use CURRENT_PC in product
>     (and optimized?) builds and use CALLER_PC otherwise. That would be
>     imperfect of course It also makes me wonder whether the inlining is
>     occurring as expected on other platforms.
>
>     I'd like to get other people's views on this.
>
>     Thanks,
>     David
>
>     [1] https://gcc.gnu.org/__onlinedocs/gcc/Inline.html
>     <https://gcc.gnu.org/onlinedocs/gcc/Inline.html>
>
>
>         inline char* AllocateHeap(size_t size, MEMFLAGS flags,
>                AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) {
>              return AllocateHeap(size, flags, CURRENT_PC, alloc_failmode);
>         }
>
>         +#ifdef __GNUC__
>         +__attribute__((always_inline)__)
>         +#endif
>         inline char* ReallocateHeap(char *old, size_t size, MEMFLAGS flag,
>                AllocFailType alloc_failmode = AllocFailStrategy::EXIT_OOM) {
>              char* p = (char*) os::realloc(old, size, flag, CURRENT_PC);
>         --------------
>
>         If this patch is accepted, I will file it to JBS and will upload
>         webrev.
>
>         Thanks,
>
>         Yasumasa
>
>


More information about the serviceability-dev mailing list