문방구앞오락기 2018. 6. 21. 17:27

원격으로 접속이 가능하다는 가장큰 장점이 있다. 

 

Rmi서버를 이용한다. 

 

해당 java프로그램이나 tomcat 구동시킬때 

Jvm 아규먼트를  다음과 같이 입력한다. 

 

 

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost   <-Dsun.io.serialization.extendedDebugInfo=true><--이건 안해도댐 

 

Jmxrremote라는 것을 활성화 시키고 포트는 9999 host localhost 한다는것이다 

Auth ssl 활성화시키면 키나 user정보가 들어잇는 파일이 필요하다 나중에 해보겠다. 

 

 

Java에서  

 

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"); 

 url 등록한다. 

도메인을 보면 rmi서버를 구동시키는것이다. 

 

JMXConnector jmxc = JMXConnectorFactory.connect(url); 

커넥터를 만들고 

MBeanServerConnection mbs = jmxc.getMBeanServerConnection(); 

 연결시켜준다. 

 

기본적인 이름은 

 

해당 클래스에 정의되어있따. 

 

내용은 

 

A Java virtual machine has zero or a single instance of the following management interfaces. 

 

Management Interface 

ObjectName 

A Java virtual machine may have one or more instances of the following management interfaces. 

 

Management Interface 

ObjectName 

java.lang:type=GarbageCollector,name=collector's name 

java.lang:type=MemoryManager,name=manager's name 

java.lang:type=MemoryPool,name=pool's name 

java.nio:type=BufferPool,name=pool name 

 

 

으로 확인  수도있으며 

 

찾을수도있다. 

 

Set<ObjectName> names = mbs.queryNames(new ObjectName("java.lang:type=*"), null); 

Iterator<ObjectName> iter = names.iterator(); 

while(iter.hasNext()) { 

ObjectName name = iter.next(); 

typeList.add(name.toString()); 

} 

System.out.println(typeList.toString()); 

 

와일드 카드가 통한다저렇게 하면 java.lang 모든 type 찾는다  다만 name이나 worker 등록되어있는건 찾지 못한다참고하자. 

Ex(("java.lang:type=GarbageCollector,name=MarkSweepCompact"); 이건 못찾는다. 

 

모든정보는 상위 클래스에 거의 모든 정보를 담고있으니 그것을 이용하는것이 좋다. 

 

 

 

stdMBeanName =new ObjectName("java.lang:type=Memory"); 

mInfo = mbs.getMBeanInfo(stdMBeanName); 

mAttributeInfos = mInfo.getAttributes(); 

long data =0L; 

for(MBeanAttributeInfo m : mAttributeInfos) { 

 

if("MaxHeapSize".equals(m.getName()) || "MinHeapSize".equals(m.getName())) { 

data = (long) mbs.getAttribute(stdMBeanName, m.getName()); 

this.outMap.put(m.getName(), data); 

} 

 

if("HeapMemoryUsage".equals(m.getName()) || "NonHeapMemoryUsage".equals(m.getName())) { 

    this.innerMap = new HashMap<>(); 

CompositeDataSupport  com = (CompositeDataSupport) mbs.getAttribute(stdMBeanName, m.getName()); 

CompositeType compositeType = com.getCompositeType(); 

Set<String> comNames =  compositeType.keySet(); 

Iterator<String> inneriter = comNames.iterator(); 

while(inneriter.hasNext()) { 

String key = inneriter.next(); 

data = (long) com.get(key); 

this.innerMap.put(key, data); 

this.outMap.put(m.getName(), innerMap); 

 

} 

} 

 

} 

 

Elasticserch 넣기위해 map 넣어서 말았다. 

 

이런식으로 해당 이름을 찾아서 하나하나 구성해보았다 

 

 {LastCollectionEndTime=Wed Jun 20 16:36:48 KST 2018, UnloadedClassCount=34, MaxHeapSize=536870912, CollectionTime=1858, LastCollectionProcessTime=-150, CollectionCount=20, PeakThreadCount=110, MinHeapSize=4194304, TotalLoadedClassCount=9351, NonHeapMemoryUsage={init=0, committed=80245260, max=-1, used=61832788}, LoadedClassCount=9317, ThreadCount=77, @timestamp=Wed Jun 20 17:18:48 KST 2018, HeapMemoryUsage={init=4194304, committed=218497024, max=536870912, used=90203240}, LastCollectionStartTime=Wed Jun 20 16:36:48 KST 2018, @version=1.0} 

 

 데이터를 1초에 한번씩 쌓아두며 

20개에 한번씩 전송하기로 했다.