自己的jvm自己救: 解救 oom 實務經驗談 (jcconf 2015)

82
#JCConf ᛔ૩ጱLXOᛔ૩硶 薹硶 QQO"䋿率妿涢藳 檔蝵 *Ngqp"Ejgp+ Ctejkvgev."Ut0"Ocpcigt 磒ᑀದ *YV Oketqgngevtqpkeu+

Upload: leon-chen

Post on 07-Apr-2017

1.978 views

Category:

Software


1 download

TRANSCRIPT

Page 1: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 2: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

••

••••••

Page 3: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

••

Page 4: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 5: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 6: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

••••

Page 7: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 8: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 9: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

https://www.youtube.com/watch?v=450maTzSIvA

Page 10: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 11: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 12: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 13: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

13

Page 14: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 15: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 16: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 17: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 18: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 19: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•–

••

–•

•–

Page 20: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 21: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

A B

C

D E

F G

H

AandBaregarbagecollectionroots,(GCroots)

LeadingSet RetainedSetE E,GC C,D,E,F,G,HA,B A,B,C,D,E,F,G,H

Page 22: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 23: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

A B

C

D E

F G

H

Page 24: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

A B

C

D E

F G

H

Page 25: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 26: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

A B

C

D E

F G

H

Page 27: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 28: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

A B

C

D E

F G

H

Page 29: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 30: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 31: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 32: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 33: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

Done

Page 34: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

More Things…

Page 35: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

Listobjects→withoutgoingreferences

Page 36: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 37: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

oracle.jdbc.ScrollableResultSet →scrollStmt→sqlObject →sqlBytes →Copy→Value

Page 38: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

SELECT*FROMPOP.PRMASTER,POP.PRITEM WHERE…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………..……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………Order ByPRITEM.IDOCNUMBERDESC,PRITEM.ITEM

Page 39: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

MergeShortes PathstoGCRoots→excludeallphantom/weak/softetc.references

Page 40: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 41: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

Listobjects→withoutgoingreferences

Page 42: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

SortingbyClassName

Page 43: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

java.lang.Thread→org.apache.catlina.connector.Request→postData →Copy→Value

Page 44: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

sessionid=16F098C27D8DE1C8C7E58A15798C470A&applicantID=&hcreatorID=&applicantName …………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………..…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………… KOLON_prodhier=K0

Page 45: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

HTTPRequestAttributesorg.apache.catlina.connector.Request→attributes→table→java.util.HashMap$Entry

Page 46: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

HTTPSessionDataorg.apache.catlina.connector.Request→session→attributes→segments→java.util.concurrent.ConcurrentHashMap$Segment

Page 47: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

JavaBasics→ThreadOverviewandStacks

Page 48: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 49: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

••

Page 50: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

••

Page 51: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 52: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•–

•–

Page 53: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 54: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 55: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 56: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 57: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

MergeShortestPathstoGCRoots→excludeallphantom/weak/softetc.references

Page 58: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 59: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

Listobjects→withoutgoingreferences

Page 60: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

Expandthenode

Page 61: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

targetorg.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry

Page 62: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

Using Log4j 2 in Web ApplicationsYou must take particular care when using Log4j or any other logging framework within a Java EE web application. It's important for logging resources to be properly cleaned up (database connections closed, files closed, etc.) when the container shuts down or the web application is undeployed. Because of the nature of class loaders within web applications, Log4j resources cannot be cleaned up through normal means. Log4j must be "started" when the web application deploys and "shut down"when the web application undeploys. How this works varies depending on whether your application is a Servlet 3.0 or newer or Servlet 2.5 web application.In either case, you'll need to add the log4j-webmodule to your deployment as detailed in the Maven, Ivy, and Gradle Artifacts manual page.

To avoid problems the Log4j shutdown hook will automatically be disabled when the log4j-web jar is included.

Page 63: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 64: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

<classloader>org.apache.logging.log4j.core.jmx.StatusLoggerAdminMBean

Page 65: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

Page 66: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 67: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•–

•–

Page 68: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 69: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

••••

Page 70: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

/* */ public abstract class ItemFactory/* */ implements Constants/* */ {/* */ protected static Logger a;/* 45 */ public Map b = null;/* */ public static int c;/* */ private static String[] A;/* *//* */ protected ItemFactory()/* */ {/* 51 */ this.b = Collections.synchronizedMap(new HashMap());/* 52 */ if ((ItemBean.d) || (a == null)) {/* 53 */ a = Logger.getLogger(A[2]);/* */ }/* */ }

Badnews:Itisobfuscated(混淆)Can’tdecompile,rewrite,andcompile…

Page 71: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•public aspect ItemFactoryAop {

private final static int DEFAULT_CACHE_SIZE = 100000;

after() : execution(workflow.ItemFactory.new()) {

((ItemFactory)thisJoinPoint.getThis()).b = Collections.synchronizedMap(

new cache.LruCache(DEFAULT_CACHE_SIZE));

}}

Page 72: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•–

•–

Page 73: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 74: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•••••

Page 75: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 76: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 77: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)
Page 78: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•–

Page 79: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 80: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

•••

Page 81: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

#JCConf

Page 82: 自己的JVM自己救: 解救 OOM 實務經驗談  (JCConf 2015)

May Your JVMLive Long and Prosper生生不息、繁榮昌盛