Providing users with thread type
Thomas Stüfe
thomas.stuefe at gmail.com
Fri Apr 19 18:23:51 UTC 2019
Hi JC,
not sure if that helps, but we set - originally for debugging purposes -
the thread name for platforms where that is possible. This is what you see
in gdb when listing threads.
On POSIX platforms this means we call some form of pthread_setname_np(),
which can be queried from the outside with pthread_getname_np().
See os::set_native_thread_name().
Feels a bit wrong to rely on this though, but maybe it helps.
Cheers, Thomas
On Fri, Apr 19, 2019 at 4:30 PM Jean Christophe Beyler <jcbeyler at google.com>
wrote:
> Problem is that if I don't have a jthread, I can't get the name it seems.
> Perhaps it could help if I gave more information:
>
> - In our JVM profiling mechanism, we have a SIGPROF (and maybe that's a
> wrong approach :-)) that gets cycled across threads (some Java threads,
> some are the other threads)
> - It is the other threads that I'm interested here to be able to
> distinguish what they are in terms of of profiles
>
> Is there any way we could provide that (not in JVMTI then)?
> - The only way I could imagine perhaps doing this would be perhaps to
> have a set of other tools at the same time running (either using beans
> before/after or JFR) but this seems crude as well (better than nothing
> though)
> - I wish there was a way to just be able to get a type for those
> internal frames while doing the actual SIGPROF handling
>
> FWIW, the method we expose basically is like this:
> Thread* current_thread = ThreadLocalStorage::get_thread_async_safe();
> if (current_thread == NULL) {
> return -1;
> } else if (current_thread->is_Compiler_thread()) {
> return _activity_compile;
> } else if (current_thread->is_Java_thread()) {
> return -1;
> } else if (current_thread->is_GC_task_thread()) {
> return _activity_gc;
> } else if (current_thread->is_VM_thread()) {
> VMThread* vm_thread = (VMThread*) current_thread;
> VM_Operation* vm_op = vm_thread->vm_operation();
> if (vm_op != NULL) {
> switch (vm_op->type()) {
> case VM_Operation::VMOp_GC_HeapInspection:
> case VM_Operation::VMOp_GenCollectFull:
> case VM_Operation::VMOp_GenCollectFullConcurrent:
> case VM_Operation::VMOp_GenCollectForAllocation:
> case VM_Operation::VMOp_ParallelGCFailedAllocation:
> case VM_Operation::VMOp_ParallelGCSystemGC:
> case VM_Operation::VMOp_CGC_Operation:
> case VM_Operation::VMOp_CMS_Initial_Mark:
> case VM_Operation::VMOp_CMS_Final_Remark:
> case VM_Operation::VMOp_G1CollectFull:
> case VM_Operation::VMOp_G1CollectForAllocation:
> case VM_Operation::VMOp_G1IncCollectionPause:
> return _activity_gc;
> default:
> break;
> }
> }
> }
> return _activity_other_vm;
> }
>
> It's crude but we believe it is effective to at least "bucketize" the
> internals while doing our profiling.
>
> Thanks for your input,
> Jc
>
> On Fri, Apr 19, 2019 at 9:01 AM Alan Bateman <Alan.Bateman at oracle.com>
> wrote:
>
>> On 19/04/2019 00:12, David Holmes wrote:
>> >
>> > I think it would be difficult to put something like this in JVM TI
>> > given that the use of threads within the JVM are purely an
>> > implementation detail and not standardized in any way. And many of
>> > those threads are hidden from JVM TI anyway.
>> >
>> > The names of threads are the normal way to see what "type" of thread
>> > you're dealing with.
>> Right, JVM TI only deals with "Java threads" (jthread object) and has no
>> knowledge about other threads. It might be possible to use its extension
>> mechanism to provide information about other threads but it wouldn't be
>> interoperable with anything that use jtherad objects.
>>
>> -Alan
>>
>
>
> --
>
> Thanks,
> Jc
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20190419/a2d8b46f/attachment.html>
More information about the serviceability-dev
mailing list