JiwonDev

JMX ํˆด, ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ

by JiwonDev

#1. JMX ( Java Management Extensions )

JDK 1.5๋ถ€ํ„ฐ ํฌํ•จ๋œ ๋Ÿฐํƒ€์ž„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง API์ด๋‹ค.

JMX๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด MBean (Managed Bean)๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์ž์›์„ MBean์œผ๋กœ ๊ฐ์‹ธ ์™ธ๋ถ€์—์„œ API๋กœ ์„ค์ •, ๋ฐ์ดํ„ฐ์ˆ˜์ง‘, ์›๊ฒฉ์ œ์–ด๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

JMX Connectors๋“ฑ์œผ๋กœ MBean Server์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ, JConsole, JVisualVM๋“ฑ ์ด๋ฏธ JMX๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„๋œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€๋งŒ ์•Œ์•„๋ณด๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.

 

@ JMX์˜ ๋™์ž‘์›๋ฆฌ

JMX์™€ MBean์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด javax.management ์•ˆ์— ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋‹จ, MBean์„ ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ 'XXXMBean'์œผ๋กœ ์ด๋ฆ„์„ ์ง€์–ด์•ผ JMX๊ฐ€ ์ธ์‹ํ•œ๋‹ค.

// MBean interface name = implementation class name + MBean. 
public interface HelloMBean {
	public void setMessage(String message);
	public String sayHello();
}


// MBean ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด
public class Hello implements HelloMBean {
	
	private String message = null;
	
	public Hello() {
		this.message = "Hello JMX!";
	}

	public Hello(String message) {
		this.message = message;
	}

	@Override
	public void setMessage(String message) {
		this.message = message;
	}

	@Override
	public String sayHello() {
		return "JMX Message ::: " + this.message;		
	}
}

JMX๋Š” MBean์„ ์ด์šฉํ•˜์—ฌ ์ž์›์„ API ์›๊ฒฉ์—์„œ ์กฐ์ข…, ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. ์ž๋ฐ”์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•œ MBean์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์— ์žˆ๋Š” MBeanServer์— ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋“ฑ๋ก๋œ MBean๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” JMX Agent ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ MBeans์— ์˜ํ•ด ์ž์›์ด ๊ด€๋ฆฌ๋˜๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด, MBeanServer (JMX Agent)์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์–ด์ง€๊ฒŒ ๋œ๋‹ค.
์ฐธ๊ณ ๋กœ JMX Agent์—๋Š” MBeanServer๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๋นˆ ๊ด€๋ฆฌ ์„œ๋น„์Šค๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

๋Œ€๋žต์ ์ธ ๊ทธ๋ฆผ๋งŒ ๋ณด๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.

@ ์˜ˆ์ œ

>> HelloAgent ์‹คํ–‰
HelloAgent is running...

>> HelloClient ์‹คํ–‰
HelloDomain
JMImplementation
JMX Message ::: ๋ฐฉ๊ฐ€๋ฐฉ๊ฐ€~~

 

๐Ÿ“‘ HelloAgent (JMX Agent) ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.rmi.registry.LocateRegistry;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

public class HelloAgent {
	private MBeanServer mbs = null;

	public HelloAgent() {

		// ๋„๋ฉ”์ธ๋ช…์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ›์•„ MBeanServer ์ƒ์„ฑ
		mbs = MBeanServerFactory.createMBeanServer("HelloDomain");

		// MBean์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
		Hello helloMBean = new Hello();

		try {
			LocateRegistry.createRegistry(7777);
			JMXServiceURL serviceUrl = 
					new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:7777/hello");

			// HelloWorld MBean Name ์ •์˜
			// ๋„๋ฉ”์ธ๋ช… : NAME=VALUE,,,,
			ObjectName helloMBeanName = new ObjectName("HelloDomain:name=helloMBean");
			
			// helloName์œผ๋กœ helloBean์„ ๋“ฑ๋ก
			mbs.registerMBean(helloMBean, helloMBeanName);
			
			// Client์—์„œ ์ ‘์†ํ•˜๋„๋ก ์ปค๋„ฅํ„ฐ ์ƒ์„ฑ ๋ฐ ์‹œ์ž‘
			JMXConnectorServer connector = 
					JMXConnectorServerFactory.newJMXConnectorServer(serviceUrl, null, mbs);
			connector.start();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * JMX ์—์ด์ „ํŠธ Main์€ ManagementFactory ํด๋ž˜์Šค์˜ getPlatformMBeanServer () 
	 * ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ”Œ๋žซํผ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ์ดˆ๊ธฐํ™” ๋œ MBean Server๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘.
	 */
	public static void main(String argv[]) {
		new HelloAgent();
		System.out.println("HelloAgent is running...");
	}
}

๐Ÿ“‘ HelloClient ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.RuntimeErrorException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class HelloClient {
	public static void main(String[] args) {
		foo();
	}

	public static void foo() {

		try {
			JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:7777/hello");
			JMXConnector jmxc = JMXConnectorFactory.connect(url, null);

			// MBeanServerConnection ์ทจ๋“
			MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

			// Get domains from MBeanServer
			String domains[] = mbsc.getDomains();
			Arrays.sort(domains);
			for (String domain : domains) {
				System.out.println(domain);
			}

			// JMX Agent์—์„œ ๋“ฑ๋กํ•œ ObjectName ์ƒ์„ฑ
			ObjectName helloMBeanName = new ObjectName("HelloDomain:name=helloMBean");

			// MBeanServerConnection์„ ํ†ตํ•ด MBean์„ ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๋Œ€์‹ 
			// MBean์— ๋Œ€ํ•œ ์ „์šฉ Proxy ์ƒ์„ฑ 
			HelloMBean hello = JMX.newMBeanProxy(mbsc, helloMBeanName, HelloMBean.class, true);

			// MBean์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์›๊ฒฉ ํ˜ธ์ถœ
			hello.setMessage("๋ฐฉ๊ฐ€๋ฐฉ๊ฐ€~~");
			System.out.println(hello.sayHello());   

		} catch (RuntimeErrorException e) {
			System.out.println("Error --->" + e);
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println(e);
			e.printStackTrace();
		}
	}
}

 


#2. ์ž๋ฐ” ๋ชจ๋‹ˆํ„ฐ๋ง ์œ ํ‹ธ๋ฆฌํ‹ฐ

์™ธ๋ถ€ ๋„๊ตฌ๋“ค๋„ ๋งŽ์ด ์žˆ์ง€๋งŒ, Oracle JDK์™€ Open JDK ๋ฐฐํฌํŒ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์œ ํ‹ธ ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค.

  • JConsole (jconsole.exe)

์•„๋ฌด๋Ÿฐ ์„ค์ •์—†์ด JDK์— ๊ธฐ๋ณธ์„ค์น˜๋˜๋Š” ๋„๊ตฌ. ์ฝ˜์†”์œผ๋กœ MBean์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

visualVM, ์ „์ฒด VM์— ๋Œ€ํ•œ Thread ๊ฐœ์ˆ˜, Class๊ฐœ์ˆ˜์™€ ๊ธฐ๋ณธ์ ์ธ CPU์™€ JVM ๋ฉ”๋ชจ๋ฆฌ ์ƒํ™ฉ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Java Mission Control (jmc.exe)
    JConsole๊ณผ VisualVM์ด ๊ธฐ๋ณธ ๋„๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด, JMC๋Š” ์˜ค๋ผํด์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž๋ฐ” ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์ด๋‹ค.

  • Diagnostic Command Tool (jcmd.exe)
    Java8๋ถ€ํ„ฐ ์ œ๊ณต๋˜๋Š” ๋ถ„์„๋„๊ตฌ๋กœ, ํ˜„์žฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ์กด์˜ ์ž๋ฐ” JVM ์ง„๋‹จ ๋„๊ตฌ๋“ค์„ ํ†ตํ•ฉํ•œ ํ˜•ํƒœ์ด๋‹ค.
    (jps, jmap, jstack, jinfo ๋“ฑ)

 


#3. Java Flight Recorder

JDK 8๋ถ€ํ„ฐ ์‹คํ—˜์ ์œผ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ๋…๋ฆฝํ˜• ํ”„๋กœ๊ทธ๋žจ(.exe)์ด ์•„๋‹ˆ๋ผ JDK์— ๋‚ด์žฅ๋œ ๋„๊ตฌ์ด๋‹ค.

 

@ JMC์—์„œ JFR์„ ์‚ฌ์šฉํ•˜๋˜๋ฐ ์ด๊ฑด ๋ฌด์Šจ๋ง์ด์ฃ ?

Java Mission Control(JMC)๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์ž๋ฐ” ์•ฑ์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.

JFR์˜ ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์—ฌ ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ์›์ธ ๋ถ„์„ ๋ฐ ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ๊ธฐ๋ฅผ ๋ถ„์„ํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ์ •๋ณด๋ฅผ ํŒŒ์ผ(.jfr)๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. ์ผ์ข…์˜ ์ž๋ฐ” ์•ฑ ๋ธ”๋ž™๋ฐ•์Šค.

 

์‚ฌ์šฉ๋ฒ•์€ ์•ฑ ์‹œ์ž‘์ „์— JVM ๋ช…๋ น์–ด๋กœ ํ™œ์„ฑํ™” ํ•˜๊ฑฐ๋‚˜, ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ jcmd ๋ช…๋ น์„ ์ด์šฉํ•ด์„œ ์‹คํ–‰๋„์ค‘ ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

JDK8์—์„œ๋Š” ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด๋ผ ๋ณ„๋„์˜ ํ™œ์„ฑํ™”๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋‚˜, JDK11 ๋ถ€ํ„ฐ๋Š” ์•ฑ ๋™์ž‘์‹œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

JFR์€ JDK ๋‚ด๋ถ€์—์„œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ flight.jfr ์— ์ €์žฅํ•œ๋‹ค. ์ด ์ •๋ณด๋“ค์„ JMC๋กœ ์ฝ์–ด๋“ค์—ฌ ์‹œ๊ฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

.jfr ํŒŒ์ผ์„ ์—ด์—ˆ์„ ๋•Œ ๋ชจ์Šต.

 

์ด๋ ‡๊ฒŒ JFR์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด, JVM์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์–ป์€ ์ด๋ฒคํŠธ ์ •๋ณด๋“ค์„ .jfr์— ์ €์žฅํ•œ๋‹ค. ๋‹ค๋งŒ ์•ฑ์—์„œ ์ด๋Ÿฐ ๋””์Šคํฌ I/O์ž‘์—…์€ ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค. ๊ทธ๋ž˜์„œ JFR์€ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ธฐ ์ „ ๋‹ค์–‘ํ•œ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

์ด ๊ณผ์ •์€ ๋ณต์žกํ•˜๊ธฐ์— ์ž์„ธํ•˜๊ฒŒ ์•Œ ํ•„์š”๋Š” ์—†์ง€๋งŒ, JMC์—์„œ๋Š” ์ƒ์„ฑ๋œ ์‹œ๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ์‹œ๊ฐํ™” ํ•ด์ฃผ์ง€๋งŒ JFR ์ถœ๋ ฅํŒŒ์ผ์ด ์‹ค์ œ ์ƒ์„ฑ๋œ ์‹œ๊ฐ„์€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋งŒ ์œ ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.

 

 

 


# JFR ์˜ˆ์ œ

๊ณ ์˜์ ์œผ๋กœ OutOfMemoryError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๊นŒ์ง€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ 1์ดˆ๋™์•ˆ ๋ฉˆ์ถ”๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

public static void main(String[] args) {
    List<Object> items = new ArrayList<>(1);
    try {
        while (true){
            items.add(new Object());
        }
    } catch (OutOfMemoryError e){
        System.out.println(e.getMessage());
    }
    assert items.size() > 0;
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        System.out.println(e.getMessage());
    }
}

 

@ JFR ํ™œ์„ฑํ™”

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ปดํŒŒ์ผ ํ•œ ํ›„, JVM์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋œ๋‹ค.

โžก JDK 8์˜ ๊ฒฝ์šฐ, JFR์€ ๋ผ์ด์„ ์Šค๋ฅผ ํ•„์š”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ์— UnlockCommercialFeatures ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

โžก ์•„๋ž˜ ๋ช…๋ น์˜ ๊ฒฝ์šฐ myrecording.jfr ํŒŒ์ผ์— 200์ดˆ๋™์•ˆ MyClassName ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค.

java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder 
  -XX:StartFlightRecording=duration=200s,filename=myrecording.jfr 
  -cp ./out/ com.jiwon.package.MyClassName

 

๋งŒ์•ฝ ํ”„๋กœ๊ทธ๋žจ์ด ์ด๋ฏธ ์‹คํ–‰์ค‘์ด๋ผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด jcmd๋ฅผ ์ด์šฉํ•˜์—ฌ JFR์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ UnlockCommercialFeatures ์˜ต์…˜์ด ๋ฐ˜๋“œ์‹œ ์•ฑ ์‹œ์ž‘์‹œ์— ํฌํ•จ๋˜์–ด์žˆ์–ด์•ผ JVM์—์„œ JFR์„ ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

jcmd 5368 JFR.start duration=200s filename=myrecording.jfr

 

 

@ .jfr ๋ถ„์„

JMX๋ฅผ ์ด์šฉํ•˜๋Š” ๋„๊ตฌ์ธ JMC (Java Mission Control)์„ ์ด์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด .jfr ํŒŒ์ผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์ธํ™”๋ฉด์—์„œ๋Š” CPU์˜ ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ, while ๋ฃจํ”„๋กœ ์ธํ•ด ์‚ฌ์šฉ๋Ÿ‰์ด ์ƒ๋‹นํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ ์™ธ ์™ผ์ชฝ ํƒญ์—์„œ Memory, Code, Thread๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ํ†ต๊ณ„๋“ฑ๋„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ถ„์„ ๊ฒฐ๊ณผ, java.util.ArrayList.grow(int) ๋ฉ”์„œ๋“œ๊ฐ€ 17๋ฒˆ์ด๋‚˜ ํ˜ธ์ถœ๋˜์–ด CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ๋‹นํžˆ ๋งŽ์ด ์žก์•„๋จน๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‹จ์ˆœํ•œ ์ •๋ณด๋ฐ–์— ์–ป์„ ๊ฒŒ ์—†์—ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ†ต๊ณ„, GC์— ์˜ํ•ด ์ƒ์„ฑ ๋ฐ ๋“ฑ๋ก, ์†Œ๋ฉธ๋˜๋Š” ์‹œ์ 
  • ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ฒผ๊ฑฐ๋‚˜ ๋‹ค์‹œ ํ™œ์„ฑํ™” ๋œ ์‹œ๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋ณด๊ณ ์„œ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰์ค‘์ธ I/O ์ž‘์—…๋“ค

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ