RFR(S): 8149557: Resource mark breaks printing to string stream

Volker Simonis volker.simonis at gmail.com
Thu Feb 11 11:21:40 UTC 2016


Hi Goetz,

maybe you could use something similar to the following code (from
disassembleCodeBlob() in jvmciCompilerToVM) to fix the problem:

  // We don't want the stringStream buffer to resize during disassembly as it
  // uses scoped resource memory. If a nested function called during
disassembly uses
  // a ResourceMark and the buffer expands within the scope of the mark,
  // the buffer becomes garbage when that scope is exited. Experience shows that
  // the disassembled code is typically about 10x the code size so a
fixed buffer
  // sized to 20x code size plus a fixed amount for header info should
be sufficient.
  int bufferSize = cb->code_size() * 20 + 1024;
  char* buffer = NEW_RESOURCE_ARRAY(char, bufferSize);
  stringStream st(buffer, bufferSize);

Regards,
Volker


On Thu, Feb 11, 2016 at 9:24 AM, Lindenmaier, Goetz
<goetz.lindenmaier at sap.com> wrote:
> Hi
>
> Please review this change. I please need a sponsor.
> http://cr.openjdk.java.net/~goetz/wr16/8149557-ResMrk/webrev.01/
>
> If a stringStream is passed to Symbol::print_symbol_on(),
> assertion "stringStream is re-allocated with a different ResourceMark." can fire in stringStream::write(const char* s, size_t len).
> This can be verified by running TestLogTouchedMethods.java after adding the patch below to the VM.
>
> My fix copies the string to locally managed memory before popping the ResoreceMark.
> A better solution would be to guarantee enough space on the stream
> before doing the resource mark, but outputStream has no such
> method as 'ensureCapacity' or the like.
> Alternatively the ResourceMark could be skipped altogether.
> But then the aux memory used remains on the ResourceArea too long.
> Also, various ResourceMarks have to be added in other places.
>
> Best regards,
>   Goetz.
>
>
> --- a/src/share/vm/runtime/java.cpp     Wed Jan 13 11:33:21 2016 +0100
> +++ b/src/share/vm/runtime/java.cpp     Wed Feb 10 08:56:14 2016 +0100
> @@ -340,7 +340,10 @@
>    }
>
>    if (LogTouchedMethods && PrintTouchedMethodsAtExit) {
> -    Method::print_touched_methods(tty);
> +    ResourceMark rm;
> +    stringStream st(16);
> +    Method::print_touched_methods(&st);
> +    tty->print("%s", st.as_string());
>    }
>
>    if (PrintBiasedLockingStatistics) {


More information about the hotspot-runtime-dev mailing list