packages feed

ghc-events 0.12.0 → 0.13.0

raw patch · 10 files changed

+213/−102 lines, 10 filesdep ~basebinary-addedPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: base

API changes (from Hackage documentation)

- GHC.RTS.Events: Message :: String -> EventInfo
+ GHC.RTS.Events: Message :: !Text -> EventInfo
- GHC.RTS.Events: PerfName :: {-# UNPACK #-} !PerfEventTypeNum -> String -> EventInfo
+ GHC.RTS.Events: PerfName :: {-# UNPACK #-} !PerfEventTypeNum -> !Text -> EventInfo
- GHC.RTS.Events: ProgramArgs :: {-# UNPACK #-} !Capset -> [String] -> EventInfo
+ GHC.RTS.Events: ProgramArgs :: {-# UNPACK #-} !Capset -> [Text] -> EventInfo
- GHC.RTS.Events: ProgramEnv :: {-# UNPACK #-} !Capset -> [String] -> EventInfo
+ GHC.RTS.Events: ProgramEnv :: {-# UNPACK #-} !Capset -> [Text] -> EventInfo
- GHC.RTS.Events: RtsIdentifier :: {-# UNPACK #-} !Capset -> String -> EventInfo
+ GHC.RTS.Events: RtsIdentifier :: {-# UNPACK #-} !Capset -> !Text -> EventInfo
- GHC.RTS.Events: ThreadLabel :: {-# UNPACK #-} !ThreadId -> String -> EventInfo
+ GHC.RTS.Events: ThreadLabel :: {-# UNPACK #-} !ThreadId -> !Text -> EventInfo
- GHC.RTS.Events: UserMarker :: String -> EventInfo
+ GHC.RTS.Events: UserMarker :: !Text -> EventInfo
- GHC.RTS.Events: UserMessage :: String -> EventInfo
+ GHC.RTS.Events: UserMessage :: !Text -> EventInfo
- GHC.RTS.Events: [args] :: EventInfo -> [String]
+ GHC.RTS.Events: [args] :: EventInfo -> [Text]
- GHC.RTS.Events: [env] :: EventInfo -> [String]
+ GHC.RTS.Events: [env] :: EventInfo -> [Text]
- GHC.RTS.Events: [markername] :: EventInfo -> String
+ GHC.RTS.Events: [markername] :: EventInfo -> !Text
- GHC.RTS.Events: [msg] :: EventInfo -> String
+ GHC.RTS.Events: [msg] :: EventInfo -> !Text
- GHC.RTS.Events: [name] :: EventInfo -> String
+ GHC.RTS.Events: [name] :: EventInfo -> !Text
- GHC.RTS.Events: [rtsident] :: EventInfo -> String
+ GHC.RTS.Events: [rtsident] :: EventInfo -> !Text
- GHC.RTS.Events: [threadlabel] :: EventInfo -> String
+ GHC.RTS.Events: [threadlabel] :: EventInfo -> !Text
- GHC.RTS.Events: type EventTypeDesc = String
+ GHC.RTS.Events: type EventTypeDesc = Text

Files

CHANGELOG.md view
@@ -1,5 +1,11 @@ # Change Log +## 0.13.0 - 2020-04-04++* Fix broken UTF-8 decoding ([#55](https://github.com/haskell/ghc-events/pull/55))+  * This is a breaking change. Most of the String fields in EventInfo have been replaced with Texts.+* Support GHC 8.10.1+ ## 0.12.0 - 2019-12-02  * Add support for EVENT_USER_BINARY_MSG ([#54](https://github.com/haskell/ghc-events/pull/54))
ghc-events.cabal view
@@ -1,5 +1,5 @@ name:             ghc-events-version:          0.12.0+version:          0.13.0 synopsis:         Library and tool for parsing .eventlog files from GHC description:      Parses .eventlog files emitted by GHC 6.12.1 and later.                   Includes the ghc-events tool permitting, in particular,@@ -26,7 +26,8 @@                   GHC == 8.2.2                   GHC == 8.4.4                   GHC == 8.6.5-                  GHC == 8.8.1+                  GHC == 8.8.3+                  GHC == 8.10.1 cabal-version:    >= 1.8 extra-source-files: include/EventLogFormat.h                     test/queens-ghc-6.12.1.eventlog@@ -65,6 +66,8 @@                     test/time-prof.eventlog.reference                     test/trace-binary-event.eventlog                     test/trace-binary-event.eventlog.reference+                    test/unicode.eventlog+                    test/unicode.eventlog.reference                     test/Utils.hs                     test/stop.hs                     README.md@@ -75,7 +78,7 @@   location: git@github.com:haskell/ghc-events.git  library-  build-depends:    base       >= 4.7 && < 4.14,+  build-depends:    base       >= 4.7 && < 4.15,                     containers >= 0.5 && < 0.7,                     binary     >= 0.7 && < 0.11,                     bytestring >= 0.10.4,
src/GHC/RTS/EventParserUtils.hs view
@@ -5,21 +5,26 @@         EventParsers(..),          getString,+        getText,+        getTextNul,         mkEventTypeParsers,         simpleEvent,         skip,     ) where -import Control.Monad import Data.Array import Data.Binary import Data.Binary.Get ()-import qualified Data.Binary.Get as G import Data.Binary.Put ()-import Data.Char import Data.IntMap (IntMap)-import qualified Data.IntMap as M import Data.List+import Data.Text (Text)+import qualified Data.Binary.Get as G+import qualified Data.ByteString.Char8 as B8+import qualified Data.IntMap as M+import qualified Data.Text.Encoding as TE+import qualified Data.Text.Lazy as TL+import qualified Data.Text.Lazy.Encoding as TLE  #define EVENTLOG_CONSTANTS_ONLY #include "EventLogFormat.h"@@ -28,13 +33,29 @@  newtype EventParsers = EventParsers (Array Int (Get EventInfo)) -nBytes :: Integral a => a -> Get [Word8]-nBytes n = replicateM (fromIntegral n) get- getString :: Integral a => a -> Get String getString len = do-    bytes <- nBytes len-    return $ map (chr . fromIntegral) bytes+  bytes <- G.getByteString $ fromIntegral len+  return $! B8.unpack bytes++-- | Decode a given length of bytes as a 'Text'+getText+  :: Integral a+  => a -- ^ Number of bytes to decode+  -> Get Text+getText len = do+  bytes <- G.getByteString $ fromIntegral len+  case TE.decodeUtf8' bytes of+    Left err -> fail $ show err+    Right text -> return text++-- | Decode a null-terminated string as a 'Text'+getTextNul :: Get Text+getTextNul = do+  chunks <- G.getLazyByteStringNul+  case TLE.decodeUtf8' chunks of+    Left err -> fail $ show err+    Right text -> return $ TL.toStrict text  skip :: Integral a => a -> Get () skip n = G.skip (fromIntegral n)
src/GHC/RTS/EventTypes.hs view
@@ -11,10 +11,9 @@ -- EventType. type EventTypeNum = Word16 type EventTypeDescLen = Word32-type EventTypeDesc = String+type EventTypeDesc = Text type EventTypeSize = Word16 -- Event.-type EventDescription = String type Timestamp = Word64 type ThreadId = Word32 type CapNo = Word16@@ -173,7 +172,7 @@                          otherCap :: {-# UNPACK #-}!Int                        }   | ThreadLabel        { thread :: {-# UNPACK #-}!ThreadId,-                         threadlabel :: String+                         threadlabel :: !Text                        }    -- par sparks@@ -265,13 +264,13 @@    -- program/process info   | RtsIdentifier      { capset :: {-# UNPACK #-}!Capset-                       , rtsident :: String+                       , rtsident :: !Text                        }   | ProgramArgs        { capset :: {-# UNPACK #-}!Capset-                       , args   :: [String]+                       , args   :: [Text]                        }   | ProgramEnv         { capset :: {-# UNPACK #-}!Capset-                       , env    :: [String]+                       , env    :: [Text]                        }   | OsProcessPid       { capset :: {-# UNPACK #-}!Capset                        , pid    :: {-# UNPACK #-}!PID@@ -285,9 +284,9 @@                        }    -- messages-  | Message            { msg :: String }-  | UserMessage        { msg :: String }-  | UserMarker         { markername :: String }+  | Message            { msg :: !Text }+  | UserMessage        { msg :: !Text }+  | UserMarker         { markername :: !Text }    -- Events emitted by a parallel RTS    -- Program /process info (tools might prefer newer variants above)@@ -371,7 +370,7 @@    -- perf events   | PerfName           { perfNum :: {-# UNPACK #-}!PerfEventTypeNum-                       , name    :: String+                       , name    :: !Text                        }   | PerfCounter        { perfNum :: {-# UNPACK #-}!PerfEventTypeNum                        , tid     :: {-# UNPACK #-}!KernelThreadId
src/GHC/RTS/Events.hs view
@@ -268,7 +268,7 @@           <> " on cap " <> TB.decimal otherCap         ThreadLabel thread label ->           "thread " <> TB.decimal thread-          <> " has label \"" <> TB.fromString label <> "\""+          <> " has label \"" <> TB.fromText label <> "\""         RequestSeqGC ->           "requesting sequential GC"         RequestParGC ->@@ -320,11 +320,11 @@         CapEnable{cap} ->           "enabled cap " <> TB.decimal cap         Message msg ->-          TB.fromString msg+          TB.fromText msg         UserMessage msg ->-          TB.fromString msg+          TB.fromText msg         UserMarker markername ->-          "marker: " <> TB.fromString markername+          "marker: " <> TB.fromText markername         CapsetCreate cs ct ->           "created capset " <> TB.decimal cs           <> " of type " <> TB.fromString (show ct)@@ -344,7 +344,7 @@           <> TB.decimal nsec <> "ns (unix epoch)"         RtsIdentifier cs i ->           "capset " <> TB.decimal cs-          <> ": RTS version \"" <> TB.fromString i <> "\""+          <> ": RTS version \"" <> TB.fromText i <> "\""         ProgramArgs cs args ->           "capset " <> TB.decimal cs           <> ": args: " <> TB.fromString (show args)@@ -434,7 +434,7 @@           "About to call the program entry point"         PerfName{perfNum, name} ->           "perf event " <> TB.decimal perfNum-          <> " named \"" <> TB.fromString name <> "\""+          <> " named \"" <> TB.fromText name <> "\""         PerfCounter{perfNum, tid, period} ->           "perf event counter " <> TB.decimal perfNum           <> " incremented by " <> TB.decimal (period + 1)@@ -571,7 +571,7 @@ buildEventType :: EventType -> TB.Builder buildEventType (EventType num dsc msz) =   TB.decimal num <> ": "-  <> TB.fromString dsc <> " (size "+  <> TB.fromText dsc <> " (size "   <> maybe "variable" TB.decimal msz <> ")"  -- | Pretty prints an 'Event', with clean handling for 'UnknownEvent'@@ -585,7 +585,7 @@   <> maybe "" (\c -> "cap " <> TB.decimal c <> ": ") evCap   <> case evSpec of     UnknownEvent{ ref=ref } ->-      maybe "" (TB.fromString . desc) $ IM.lookup (fromIntegral ref) imap+      maybe "" (TB.fromText . desc) $ IM.lookup (fromIntegral ref) imap     _ -> buildEventInfo evSpec  buildEvent' :: Event -> TB.Builder
src/GHC/RTS/Events/Binary.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-} module GHC.RTS.Events.Binary   ( -- * Readers     getHeader@@ -29,6 +30,7 @@   ) where import Control.Exception (assert) import Control.Monad+import Data.List (intersperse) import Data.Maybe import Prelude hiding (gcd, rem, id) @@ -39,8 +41,6 @@ import qualified Data.ByteString as B import qualified Data.Text as T import qualified Data.Text.Encoding as TE-import qualified Data.Text.Lazy as TL-import qualified Data.Text.Lazy.Encoding as TLE import qualified Data.Vector.Unboxed as VU  import GHC.RTS.EventTypes@@ -56,16 +56,13 @@            let etSize = if size == 0xffff then Nothing else Just size            -- 0xffff indicates variable-sized event            etDescLen <- get :: Get EventTypeDescLen-           etDesc <- getEtDesc (fromIntegral etDescLen)+           etDesc <- getText etDescLen            etExtraLen <- get :: Get Word32            G.skip (fromIntegral etExtraLen)            ete <- get :: Get Marker            when (ete /= EVENT_ET_END) $               fail "Event Type end marker not found."            return (EventType etNum etDesc etSize)-           where-             getEtDesc :: Int -> Get [Char]-             getEtDesc s = replicateM s (get :: Get Char)  getHeader :: Get Header getHeader = do@@ -270,37 +267,39 @@   (VariableSizeParser EVENT_LOG_MSG (do -- (msg)       num <- get :: Get Word16-      string <- getString num+      string <- getText num       return Message{ msg = string }    )),  (VariableSizeParser EVENT_USER_MSG (do -- (msg)       num <- get :: Get Word16-      string <- getString num+      string <- getText num       return UserMessage{ msg = string }    )),     (VariableSizeParser EVENT_USER_MARKER (do -- (markername)       num <- get :: Get Word16-      string <- getString num+      string <- getText num       return UserMarker{ markername = string }    )),  (VariableSizeParser EVENT_PROGRAM_ARGS (do -- (capset, [arg])       num <- get :: Get Word16       cs <- get-      string <- getString (num - sz_capset)-      return ProgramArgs{ capset = cs-                        , args = splitNull string }+      string <- getText (num - sz_capset)+      return ProgramArgs+        { capset = cs+        , args = T.splitOn "\0" $ T.dropWhileEnd (== '\0') string }    )),  (VariableSizeParser EVENT_PROGRAM_ENV (do -- (capset, [arg])       num <- get :: Get Word16       cs <- get-      string <- getString (num - sz_capset)-      return ProgramEnv{ capset = cs-                       , env = splitNull string }+      string <- getText (num - sz_capset)+      return ProgramEnv+        { capset = cs+        , env = T.splitOn "\0" $ T.dropWhileEnd (== '\0') string }    )),  (VariableSizeParser EVENT_RTS_IDENTIFIER (do -- (capset, str)       num <- get :: Get Word16       cs <- get-      string <- getString (num - sz_capset)+      string <- getText (num - sz_capset)       return RtsIdentifier{ capset = cs                           , rtsident = string }    )),@@ -315,7 +314,7 @@  (VariableSizeParser EVENT_THREAD_LABEL (do -- (thread, str)       num <- get :: Get Word16       tid <- get-      str <- getString (num - sz_tid)+      str <- getText (num - sz_tid)       return ThreadLabel{ thread      = tid                         , threadlabel = str }     ))@@ -727,7 +726,7 @@  (VariableSizeParser EVENT_PERF_NAME (do -- (perf_num, name)       num     <- get :: Get Word16       perfNum <- get-      name    <- getString (num - sz_perf_num)+      name    <- getText (num - sz_perf_num)       return PerfName{perfNum, name}    )), @@ -752,13 +751,13 @@     heapProfId <- get     heapProfSamplingPeriod <- get     heapProfBreakdown <- get-    heapProfModuleFilter <- getText-    heapProfClosureDescrFilter <- getText-    heapProfTypeDescrFilter <- getText-    heapProfCostCentreFilter <- getText-    heapProfCostCentreStackFilter <- getText-    heapProfRetainerFilter <- getText-    heapProfBiographyFilter <- getText+    heapProfModuleFilter <- getTextNul+    heapProfClosureDescrFilter <- getTextNul+    heapProfTypeDescrFilter <- getTextNul+    heapProfCostCentreFilter <- getTextNul+    heapProfCostCentreStackFilter <- getTextNul+    heapProfRetainerFilter <- getTextNul+    heapProfBiographyFilter <- getTextNul     assert       (fromIntegral payloadLen == sum         [ 1 -- heapProfId@@ -777,9 +776,9 @@   , VariableSizeParser EVENT_HEAP_PROF_COST_CENTRE $ do     payloadLen <- get :: Get Word16     heapProfCostCentreId <- get-    heapProfLabel <- getText-    heapProfModule <- getText-    heapProfSrcLoc <- getText+    heapProfLabel <- getTextNul+    heapProfModule <- getTextNul+    heapProfSrcLoc <- getTextNul     heapProfFlags <- get     assert       (fromIntegral payloadLen == sum@@ -820,7 +819,7 @@     payloadLen <- get :: Get Word16     heapProfId <- get     heapProfResidency <- get-    heapProfLabel <- getText+    heapProfLabel <- getTextNul     assert       (fromIntegral payloadLen == sum         [ 1 -- heapProfId@@ -879,9 +878,6 @@ putMarker :: Word32 -> PutM () putMarker = putE -putEStr :: String -> PutM ()-putEStr = mapM_ putE- putEventLog :: EventLog -> PutM () putEventLog (EventLog hdr es) = do     putHeader hdr@@ -899,8 +895,8 @@         putMarker EVENT_ET_BEGIN         putType n         putE $ fromMaybe 0xffff msz-        putE (fromIntegral $ length d :: EventTypeDescLen)-        mapM_ put d+        putE (fromIntegral $ T.length d :: EventTypeDescLen)+        putE d         -- the event type header allows for extra data, which we don't use:         putE (0 :: Word32)         putMarker EVENT_ET_END@@ -1111,9 +1107,9 @@     putCap c  putEventSpec (ThreadLabel t l) = do-    putE (fromIntegral (length l) + sz_tid :: Word16)+    putE (fromIntegral (T.length l) + sz_tid :: Word16)     putE t-    putEStr l+    putE l  putEventSpec Shutdown =     return ()@@ -1220,21 +1216,21 @@     putCap cp  putEventSpec (RtsIdentifier cs rts) = do-    putE (fromIntegral (length rts) + sz_capset :: Word16)+    putE (fromIntegral (T.length rts) + sz_capset :: Word16)     putE cs-    putEStr rts+    putE rts  putEventSpec (ProgramArgs cs as) = do-    let as' = unsep as-    putE (fromIntegral (length as') + sz_capset :: Word16)+    let sz_args = sum $ map ((+ 1) {- for \0 -} . T.length) as+    putE (fromIntegral sz_args + sz_capset :: Word16)     putE cs-    mapM_ putE as'+    mapM_ putE (intersperse "\0" as)  putEventSpec (ProgramEnv cs es) = do-    let es' = unsep es-    putE (fromIntegral (length es') + sz_capset :: Word16)+    let sz_env = sum $ map ((+ 1) {- for \0 -} . T.length) es+    putE (fromIntegral sz_env + sz_capset :: Word16)     putE cs-    mapM_ putE es'+    mapM_ putE $ intersperse "\0" es  putEventSpec (OsProcessPid cs pid) = do     putE cs@@ -1250,16 +1246,16 @@     putE nsec  putEventSpec (Message s) = do-    putE (fromIntegral (length s) :: Word16)-    mapM_ putE s+    putE (fromIntegral (T.length s) :: Word16)+    putE s  putEventSpec (UserMessage s) = do-    putE (fromIntegral (length s) :: Word16)-    mapM_ putE s+    putE (fromIntegral (T.length s) :: Word16)+    putE s  putEventSpec (UserMarker s) = do-    putE (fromIntegral (length s) :: Word16)-    mapM_ putE s+    putE (fromIntegral (T.length s) :: Word16)+    putE s  putEventSpec (UnknownEvent {}) = error "putEventSpec UnknownEvent" @@ -1363,9 +1359,9 @@ putEventSpec MerCallingMain = return ()  putEventSpec PerfName{..} = do-    putE (fromIntegral (length name) + sz_perf_num :: Word16)+    putE (fromIntegral (T.length name) + sz_perf_num :: Word16)     putE perfNum-    mapM_ putE name+    putE name  putEventSpec PerfCounter{..} = do     putE perfNum@@ -1431,21 +1427,3 @@ putEventSpec UserBinaryMessage {..} = do     putE (fromIntegral (B.length payload) :: Word16)     putByteString payload---- [] == []--- [x] == x\0--- [x, y, z] == x\0y\0-unsep :: [String] -> String-unsep = concatMap (++"\0") -- not the most efficient, but should be ok--splitNull :: String -> [String]-splitNull [] = []-splitNull xs = case span (/= '\0') xs of-                (x, xs') -> x : splitNull (drop 1 xs')--getText :: Get T.Text-getText = do-  chunks <- G.getLazyByteStringNul-  case TLE.decodeUtf8' chunks of-    Left err -> fail $ show err-    Right text -> return $ TL.toStrict text
test/TestVersions.hs view
@@ -17,10 +17,8 @@ import System.Exit (exitFailure)  import GHC.RTS.Events-import GHC.RTS.Events.Incremental import Utils (files, diffLines) - testFile :: FilePath -> IO Bool testFile f = do     e <- readEventLogFromFile f@@ -35,6 +33,7 @@                     else do putStrLn $ diffLines oldlog newlog                             oops "pretty print output does not match" +main :: IO () main = do     successes <- mapM testFile files     if and successes
test/Utils.hs view
@@ -17,10 +17,12 @@     , "biographical-samples.eventlog"     , "time-prof.eventlog"     , "trace-binary-event.eventlog"+    , "unicode.eventlog"     ]   -- Code to help print the differences between a working test and a failing test.+diffLines :: String -> String -> String diffLines o n = diff 1 (lines o) (lines n)  diff :: Int -> [String] -> [String] -> String
+ test/unicode.eventlog view

binary file changed (absent → 2959 bytes)

+ test/unicode.eventlog.reference view
@@ -0,0 +1,103 @@+Event Types:+0: Create thread (size 4)+1: Run thread (size 4)+2: Stop thread (size 10)+3: Thread runnable (size 4)+4: Migrate thread (size 6)+8: Wakeup thread (size 6)+9: Starting GC (size 0)+10: Finished GC (size 0)+11: Request sequential GC (size 0)+12: Request parallel GC (size 0)+15: Create spark thread (size 4)+16: Log message (size variable)+18: Block marker (size 14)+19: User message (size variable)+20: GC idle (size 0)+21: GC working (size 0)+22: GC done (size 0)+25: Create capability set (size 6)+26: Delete capability set (size 4)+27: Add capability to capability set (size 6)+28: Remove capability from capability set (size 6)+29: RTS name and version (size variable)+30: Program arguments (size variable)+31: Program environment variables (size variable)+32: Process ID (size 8)+33: Parent process ID (size 8)+34: Spark counters (size 56)+35: Spark create (size 0)+36: Spark dud (size 0)+37: Spark overflow (size 0)+38: Spark run (size 0)+39: Spark steal (size 2)+40: Spark fizzle (size 0)+41: Spark GC (size 0)+43: Wall clock time (size 16)+44: Thread label (size variable)+45: Create capability (size 2)+46: Delete capability (size 2)+47: Disable capability (size 2)+48: Enable capability (size 2)+49: Total heap mem ever allocated (size 12)+50: Current heap size (size 12)+51: Current heap live data (size 12)+52: Heap static parameters (size 38)+53: GC statistics (size 58)+54: Synchronise stop-the-world GC (size 0)+55: Task create (size 18)+56: Task migrate (size 12)+57: Task delete (size 8)+58: User marker (size variable)+59: Empty event for bug #9003 (size 0)+160: Start of heap profile (size variable)+161: Cost center definition (size variable)+162: Start of heap profile sample (size 8)+163: Heap profile cost-centre sample (size variable)+164: Heap profile string sample (size variable)+181: User binary message (size variable)++Events:+199023: created capset 0 of type CapsetOsProcess+199124: created capset 1 of type CapsetClockDomain+199641: created cap 0+199705: assigned cap 0 to capset 0+199757: assigned cap 0 to capset 1+205412: capset 1: wall clock time 1576909771s 759746000ns (unix epoch)+205582: capset 0: pid 85701+211303: capset 0: parent pid 89650+215676: capset 0: RTS version "GHC-8.8.1 rts_l"+218893: capset 0: args: ["./unicode","+RTS","-lu"]+3684143: heap stats for heap capset 0: generations 2, 0 bytes max heap size, 1048576 bytes alloc area size, 1048576 bytes mblock size, 4096 bytes block size+3790819: task 0x7fdd0ee00460 created on cap 0 with OS kernel thread 4628350+3791820: cap 0: creating thread 1+3801611: cap 0: running thread 1+3851573: cap 0: こんにちは+3852417: cap 0: stopping thread 1 (thread finished)+3853023: task 0x7fdd0ee00460 deleted+3854106: task 0x7fdd0ee00460 created on cap 0 with OS kernel thread 4628350+3854259: cap 0: creating thread 2+3854458: cap 0: running thread 2+3979871: cap 0: stopping thread 2 (thread finished)+3980191: task 0x7fdd0ee00460 deleted+3983762: cap 0: starting GC+3988279: cap 0: GC working+4151142: cap 0: GC idle+4151260: cap 0: GC done+4152813: cap 0: GC idle+4152861: cap 0: GC done+4153142: cap 0: GC idle+4153184: cap 0: GC done+4155396: cap 0: allocated on heap capset 0: 42872 total bytes till now+4156194: cap 0: finished GC+4156678: cap 0: all caps stopped for GC+4156798: cap 0: GC stats for heap capset 0: generation 1, 3216 bytes copied, 21256 bytes slop, 950272 bytes fragmentation, 1 par threads, 0 bytes max par copied, 3216 bytes total par copied, 0 bytes balanced par copied+4157147: cap 0: live data in heap capset 0: 36088 bytes+4157226: cap 0: size of heap capset 0: 2097152 bytes+14563387: cap 0: allocated on heap capset 0: 42872 total bytes till now+14566187: removed cap 0 from capset 0+14566352: removed cap 0 from capset 1+14566478: deleted cap 0+14566778: deleted capset 0+14566855: deleted capset 1+