# (c) Mark Fink, 2008 - 2013
# This script is released under the MIT License
# Warranty in any form is excluded

# JVM heap utilization pattern

#log entry using -XX:+PrintGCDateStamps
#{Heap before GC invocations=2 (full 1):
# PSYoungGen      total 46080K, used 960K [0x00002aaac3100000, 0x00002aaac6300000, 0x00002aaac6300000)
#  eden space 40960K, 0% used [0x00002aaac3100000,0x00002aaac3100000,0x00002aaac5900000)
#  from space 5120K, 18% used [0x00002aaac5900000,0x00002aaac59f0000,0x00002aaac5e00000)
#  to   space 5120K, 0% used [0x00002aaac5e00000,0x00002aaac5e00000,0x00002aaac6300000)
# PSOldGen        total 210944K, used 0K [0x00002aaab6300000, 0x00002aaac3100000, 0x00002aaac3100000)
#  object space 210944K, 0% used [0x00002aaab6300000,0x00002aaab6300000,0x00002aaac3100000)
# PSPermGen       total 21248K, used 5966K [0x00002aaaae300000, 0x00002aaaaf7c0000, 0x00002aaab6300000)
#  object space 21248K, 28% used [0x00002aaaae300000,0x00002aaaae8d3840,0x00002aaaaf7c0000)
#2012-03-28T07:33:31.630+0000: 0.220: [Full GC 960K->888K(257024K), 0.0134730 secs]
#Heap after GC invocations=2 (full 1):
# PSYoungGen      total 46080K, used 0K [0x00002aaac3100000, 0x00002aaac6300000, 0x00002aaac6300000)
#  eden space 40960K, 0% used [0x00002aaac3100000,0x00002aaac3100000,0x00002aaac5900000)
#  from space 5120K, 0% used [0x00002aaac5900000,0x00002aaac5900000,0x00002aaac5e00000)
#  to   space 5120K, 0% used [0x00002aaac5e00000,0x00002aaac5e00000,0x00002aaac6300000)
# PSOldGen        total 210944K, used 888K [0x00002aaab6300000, 0x00002aaac3100000, 0x00002aaac3100000)
#  object space 210944K, 0% used [0x00002aaab6300000,0x00002aaab63de008,0x00002aaac3100000)
# PSPermGen       total 21248K, used 5966K [0x00002aaaae300000, 0x00002aaaaf7c0000, 0x00002aaab6300000)
#  object space 21248K, 28% used [0x00002aaaae300000,0x00002aaaae8d3840,0x00002aaaaf7c0000)
#}

# little more structured version
#'\{Heap before GC.*?' + \
#'(PSYoungGen|def new generation)\s+total (?P<newSize>\d+)K\, used ' + \
#    '(?P<newBefore>\d+)K.*?' + \
#'eden space (?P<edenSize>\d+)K\,\s+(?P<edenPrcBefore>\d{1,3})% used.*?' + \
#'from space (?P<fromSize>\d+)K\,\s+(?P<fromPrcBefore>\d{1,3})% used.*?' + \
#'to\s+space (?P<toSize>\d+)K\,\s+(?P<toPrcBefore>\d{1,3})% used.*?' + \
#'(PSOldGen|tenured generation)\s+total (?P<tenuredSize>\d+)K\, used ' + \
#    '(?P<tenuredBefore>\d+)K.*?' + \
#'(PSPermGen|compacting perm gen)\s+total (?P<permSize>\d+)K\, used ' + \
#    '(?P<permBefore>\d+)K.*?\)\s+' + \
#'(?:(?P<dateGc>\d{4}\-\d{2}\-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}[+-]\d{4})\:?\s*' + \
#'(?P<gctsoffset>\d+\.\d+)\:\s\[GC.*?' + \
#'\,\s+(?P<elapsedGcTime>\d+\.\d+)\ssecs\]\s+){0,1}' + \
#'(?:(?P<dateFullGc>\d{4}\-\d{2}\-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}[+-]\d{4})\:?\s*' + \
#'(?P<fullgctsoffset>\d+\.\d+)\:\s\[Full GC.*?' + \
#'\,\s+(?P<elapsedFullGcTime>\d+\.\d+)\ssecs\]\s+){0,1}' + \
#'Heap after GC.*?' + \
#'(PSYoungGen|def new generation)\s+total (?:\d+)K\, used (?P<newAfter>\d+)K.*?' + \
#'eden space (?:\d+)K\,\s+(?P<edenPrcAfter>\d{1,3})% used.*?' + \
#'from space (?:\d+)K\,\s+(?P<fromPrcAfter>\d{1,3})% used.*?' + \
#'to\s+space (?:\d+)K\,\s+(?P<toPrcAfter>\d{1,3})% used.*?' + \
#'(PSOldGen|tenured generation)\s+total (?:\d+)K\, used ' + \
#    '(?P<tenuredAfter>\d+)K.*?' + \
#'(PSPermGen|compacting perm gen)\s+total (?:\d+)K\, used ' + \
#    '(?P<permAfter>\d+)K.*?\)' + \
#'.*?\}', re.MULTILINE|re.DOTALL)

# TODO: now we have korg! and we must split this up into manageable pices
JVM_GC \{Heap before GC.*?(PSYoungGen|def new generation)\s+total (?P<newSize>\d+)K\, used (?P<newBefore>\d+)K.*?eden space (?P<edenSize>\d+)K\,\s+(?P<edenPrcBefore>\d{1,3})% used.*?from space (?P<fromSize>\d+)K\,\s+(?P<fromPrcBefore>\d{1,3})% used.*?to\s+space (?P<toSize>\d+)K\,\s+(?P<toPrcBefore>\d{1,3})% used.*?(PSOldGen|tenured generation)\s+total (?P<tenuredSize>\d+)K\, used (?P<tenuredBefore>\d+)K.*?(PSPermGen|compacting perm gen)\s+total (?P<permSize>\d+)K\, used (?P<permBefore>\d+)K.*?\)\s+(?:(?P<dateGc>\d{4}\-\d{2}\-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}[+-]\d{4})\:?\s*(?P<gctsoffset>\d+\.\d+)\:\s\[GC.*?\,\s+(?P<elapsedGcTime>\d+\.\d+)\ssecs\]\s+){0,1}(?:(?P<dateFullGc>\d{4}\-\d{2}\-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}[+-]\d{4})\:?\s*(?P<fullgctsoffset>\d+\.\d+)\:\s\[Full GC.*?\,\s+(?P<elapsedFullGcTime>\d+\.\d+)\ssecs\]\s+){0,1}Heap after GC.*?(PSYoungGen|def new generation)\s+total (?:\d+)K\, used (?P<newAfter>\d+)K.*?eden space (?:\d+)K\,\s+(?P<edenPrcAfter>\d{1,3})% used.*?from space (?:\d+)K\,\s+(?P<fromPrcAfter>\d{1,3})% used.*?to\s+space (?:\d+)K\,\s+(?P<toPrcAfter>\d{1,3})% used.*?(PSOldGen|tenured generation)\s+total (?:\d+)K\, used (?P<tenuredAfter>\d+)K.*?(PSPermGen|compacting perm gen)\s+total (?:\d+)K\, used (?P<permAfter>\d+)K.*?\).*?\}
