Hi Jc,

On 20/04/2019 12:30 am, Jean Christophe Beyler 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();

We have Thread::current_or_null_safe() for that.

     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;
}

So it's not really the thread "type" but the logical "activity". For "type" you'd just need a query version of Thread::print_on_error (more or less).

Not at all sure where you could put this - nor clear why you need to put it somewhere: isn't this just something executed by your SIGPROF handler?

David

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 <[email protected] <mailto:[email protected]>> 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

Reply via email to