Uploaded image for project: 'RHEL'
  1. RHEL
  2. RHEL-3416

Memory leaks in classTrack.c classTrack_addPreparedClass() during debugging

Details

    • sst_java
    • False
    • Hide

      None

      Show
      None
    • If docs needed, set a value

    Description

      Description of problem:

      We observe a native memory leak when repeating JDI operations from Eclipse in a debuggee JVM.

      jemalloc reports 2 different types of memory leaks in classTrack_addPreparedClass(), classTrack.c.:

      [5888 bytes leaked]
      je_prof_backtrace (/home/sandreev/git/misc/jemalloc/src/prof.c:636 (discriminator 2))
      je_malloc_default (/home/sandreev/git/misc/jemalloc/src/jemalloc.c:2289)
      os::malloc (/data/git/jdk11/src/hotspot/share/runtime/os.cpp:697)
      os::malloc (/data/git/jdk11/src/hotspot/share/runtime/os.cpp:660 (discriminator 3))
      JvmtiEnvBase::allocate (/data/git/jdk11/src/hotspot/share/prims/jvmtiEnvBase.hpp:195)
      JvmtiEnvBase::jvmtiMalloc (/data/git/jdk11/src/hotspot/share/prims/jvmtiEnvBase.cpp:501)
      JvmtiEnv::GetClassSignature (/data/git/jdk11/src/hotspot/share/prims/jvmtiEnv.cpp:2365)
      jvmti_GetClassSignature (/data/git/jdk11/build/linux-x86_64-normal-server-slowdebug/hotspot/variant-server/gensrc/jvmtifiles/jvmtiEnter.cpp:3380)
      classSignature (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/util.c:1235)
      classTrack_addPreparedClass (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/classTrack.c:233)
      event_callback (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/eventHandler.c:643)
      cbClassPrepare (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/eventHandler.c:893)
      JvmtiExport::post_class_prepare (/data/git/jdk11/src/hotspot/share/prims/jvmtiExport.cpp:1320)
      InstanceKlass::link_class_impl (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:839 (discriminator 1))
      InstanceKlass::link_class (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:698)
      InstanceKlass::initialize_impl (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:898)
      InstanceKlass::initialize (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:669)
      InterpreterRuntime::_new (/data/git/jdk11/src/hotspot/share/interpreter/interpreterRuntime.cpp:240)
      ?? (??:0)

      [5040 bytes leaked]
      je_prof_backtrace (/home/sandreev/git/misc/jemalloc/src/prof.c:636 (discriminator 2))
      je_malloc_default (/home/sandreev/git/misc/jemalloc/src/jemalloc.c:2289)
      os::malloc (/data/git/jdk11/src/hotspot/share/runtime/os.cpp:697)
      os::malloc (/data/git/jdk11/src/hotspot/share/runtime/os.cpp:660 (discriminator 3))
      JvmtiEnvBase::allocate (/data/git/jdk11/src/hotspot/share/prims/jvmtiEnvBase.hpp:195)
      JvmtiEnv::Allocate (/data/git/jdk11/src/hotspot/share/prims/jvmtiEnv.cpp:126)
      jvmti_Allocate (/data/git/jdk11/build/linux-x86_64-normal-server-slowdebug/hotspot/variant-server/gensrc/jvmtifiles/jvmtiEnter.cpp:341)
      jvmtiAllocate (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/util.c:1794)
      classTrack_addPreparedClass (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/classTrack.c:229)
      event_callback (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/eventHandler.c:643)
      cbClassPrepare (/data/git/jdk11/src/jdk.jdwp.agent/share/native/libjdwp/eventHandler.c:893)
      JvmtiExport::post_class_prepare (/data/git/jdk11/src/hotspot/share/prims/jvmtiExport.cpp:1320)
      InstanceKlass::link_class_impl (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:839 (discriminator 1))
      InstanceKlass::link_class (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:698)
      InstanceKlass::initialize_impl (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:898)
      InstanceKlass::initialize (/data/git/jdk11/src/hotspot/share/oops/instanceKlass.cpp:669)
      InterpreterRuntime::_new (/data/git/jdk11/src/hotspot/share/interpreter/interpreterRuntime.cpp:240)
      ?? (??:0)

      Version-Release number of selected component (if applicable):

      OpenJDK 11

      How reproducible:

      Run JDI operations with Eclipse in any Java program. E.g. can be done with a command handler:

      public class SampleHandler extends AbstractHandler {

      @Override
      public Object execute(ExecutionEvent event) throws ExecutionException {
      Job job = new Job("JDI operation") {
      @Override
      protected IStatus run(IProgressMonitor monitor) {
      int n = 20 * 60;
      for (int i = 0; i < n; ++i) {
      try {
      IJavaDebugTarget javaTarget = getFirstJavaDebugTarget();
      if (javaTarget != null) {
      IJavaThread javaThread = getFirstSuspendedJavaThread(javaTarget);
      if (javaThread != null) {
      IJavaType[] javaClass = javaTarget.getJavaTypes("java.lang.String");
      if (javaClass[0] instanceof IJavaClassType) {
      IJavaClassType jdiClassType = (IJavaClassType) javaClass[0];
      IJavaObject instance = jdiClassType.newInstance("()V", null, javaThread);
      try {
      instance.disableCollection();
      if (!monitor.isCanceled())

      { instance.sendMessage("isEmpty", "()Z", null, javaThread, false); }

      } finally

      { instance.enableCollection(); }

      }
      }
      }
      } catch (DebugException e)

      { e.printStackTrace(); }

      }
      return Status.OK_STATUS;
      }
      };
      job.schedule();

      return null;
      }

      private IJavaDebugTarget getFirstJavaDebugTarget() {
      for (IDebugTarget debugTarget : DebugPlugin.getDefault().getLaunchManager().getDebugTargets()) {
      if (debugTarget instanceof IJavaDebugTarget)

      { return (IJavaDebugTarget) debugTarget; }

      }
      return null;
      }

      private IJavaThread getFirstSuspendedJavaThread(IJavaDebugTarget javaDebugTarget) throws DebugException {
      for (IThread thread : javaDebugTarget.getThreads()) {
      if (thread.isSuspended() && (thread instanceof IJavaThread))

      { return (IJavaThread) thread; }

      }
      return null;
      }
      }

      Actual results:

      Memory consumption of debuggee JVM increases as more classes are loaded in the debuggee JVM.

      Expected results:

      No memory is leaked by classTrack_addPreparedClass() in classTrack.c.

      Attachments

        Activity

          People

            rhn-engineering-adinn Andrew Dinn
            jira-bugzilla-migration RH Bugzilla Integration
            Andrew Dinn Andrew Dinn
            David Kutalek David Kutalek
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated: