ํ๋ก์ ํธ๋ฅผ ec2์ ๋ฐฐํฌํด ๋๋๋ฐ ์๊พธ ์๋ฒ๊ฐ ๋ป๋ ํ์์ด ๋ฐ์ํ๋ค.
์ฒ์ ์ผฐ์ ๋ ์๋๋ ๋น ๋ฅด๊ณ ๊ด์ฐฎ๋ค๊ฐ 2~3์๊ฐ ๋ค ์ ์ํด๋ณด๋ฉด ๋๋ ค์ ธ์๊ณ ๋ค์ ๋ ์ ์ํ๋ฉด ๋ป์ด์์๋ค. ์ฒ์ ์ผฐ์ ๋ ๊ด์ฐฎ๋ค๊ฐ ์๊ฐ์ด ์ง๋ ๋ป๋๊ฑธ ๋ณด์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ผ์ด๋๋ ์ถ์๋ค.
๊ทธ๋์ ์ฐพ์๋ณด๊ฒ๋ ์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)..
๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)๋?
CS ์๋ฏธ๋ก ์ดํด๋ณผ ๋, ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ ์ ํ๊ณ ์๋ ํ์์ด๋ค.
JAVA๋ ๊ธฐ๋ณธ์ ์ผ๋ก Garbage Collection์ ์ง์ํ๋ค. ํ์ง๋ง ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ค์ด ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ํ์๋์ง ์๊ณ ๊ณ์ ๋์ ์ด ๋๋ ํ์์ ๋งํ๋ค.
Java GC์ ํ์ ๋์์ด ๋์ง ์๋ ๊ฒฝ์ฐ์ ๋ํด ์์๋ณด์
1. ๋ฌด์๋ฏธํ Wrapper ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ
- GC๋ Immutable ๊ฐ์ฒด๋ฅผ Skipํ๋ค.
- ์๋ฅผ ๋ค๋ฉด String์ StringBuilder์ ๋ฌ๋ฆฌ Immutable ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํ์ ๊ณ์ ์์ฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๋ค๋ ๋จ์ ์ด ์๋ค. Wrapper class์ ๊ฐ์ฒด๋ ๋ชจ๋ Immutable์ด๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค.
2. Map์ Immutable ๋ฐ์ดํฐ๋ฅผ ํด์ ํ์ง ์์ ๊ฒฝ์ฐ
- Map์๋ ๊ฐ๋ ฅํ ์ฐธ์กฐ๊ฐ ์์ด์, ๋ด๋ถ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋์ง ์์ ๋๋ GC ๋์์ด ๋์ง ์๋๋ค.
- ์ฆ, Map์ ๋์ด์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๊ณ ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
- WeakHashMap์ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํ ํ ์ ์์ด ์ด ๊ฐ์ ์ํฉ์ ๋ง์ ์ ์๋ค.
3. Connection ์ฌ์ฉ ์ Try Catch ์ค๊ณ
- try ๋ด๋ถ์์ connection์ closeํ๊ธฐ ๋๋ฌธ์, close๊ฐ ์คํ๋์ง ๋ชปํ๋ค.
- ๊ทธ๋์ Connection์ด ์ด๋ ค์๋ ์ฑ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๊ฒ ๋๋ค.
try {
Connection con = DriverManager.getConnection();
// ์์ธ ํฐ์ง
con.close();
} Catch(exception e) {
// catch
}
4. CustomKey ์ฌ์ฉ
๋ง์ฝ Custom Key๋ฅผ ์ฌ์ฉํ๋ค๋ฉด equals()์ hashcode() ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํด์ค์ผ ํ๋ค. ์๋ ์ฝ๋์ ๊ฒฝ์ฐ Key๊ฐ์ด ๋ค๋ฅธ Key๋ก ์ธ์ํ์ฌ ๊ณ์ Map์ ์์ด๊ฒ ๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๋ค.
public class CustomKey {
private String name;
public CustomKey(String name) {
this.name=name;
}
public staticvoid main(String[] args) {
Map<CustomKey,String> map = new HashMap<CustomKey,String>();
map.put(new CustomKey("a"), "b");
map.put(new CustomKey("a"), "c");
map.put(new CustomKey("a"), "d");
}
}
VisualVM
์ค์ ๋ก ๋ด ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋์ง ์ฒดํฌํ๊ธฐ ์ํด VisualVM ํด์ ์ฌ์ฉํ๋ค.
- visualVM์์ remote์ฐ๊ฒฐ์ ํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ ์ต์ ์ ๋ถ์ฌ jarํ์ผ์ ์คํํด์ผ ํ๋ค.
java \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.port=8500 \
-Dcom.sun.management.jmxremote.rmi.port=8500 \
-Djava.rmi.server.hostname=192.168.56.116 \
-jar spring-example.jar
- ๋๋ nohup์ผ๋ก ์ด์ด์ผ ํ๊ธฐ์ ์๋ ๋ช ๋ น์ด๋ก jarํ์ผ์ ์คํํ๋ค.
nohup java -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8500 -Dcom.sun.management.jmxremote.rmi.port=8500 -Djava.rmi.server.hostname={ec2 IP} -jar -Duser.timezone=Asia/Seoul {jarํ์ผ๋ช
} >> application.log 2> deploy_err.log &
- ์ด๋ ec2๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ธ๋ฐ์ด๋ ๊ท์น์ ์ด์ด์ค์ผ ํ๋ค.
- ์ ๋ช ๋ น์ด์์ 8500๋ฒ์ ์ฌ์ฉํ๋ค๊ณ ์ง์ ํ๊ธฐ ๋๋ฌธ์ 8500 port ์ ๋ํ ๋ณด์์ ํ์ด์คฌ๋ค.
- visualVM์ remote๋ฅผ ์ฐํด๋ฆญ ํ Add remote Host๋ฅผ ๋๋ฅด๋ฉด ์ฌ์ง๊ณผ ๊ฐ์ ์ฐฝ์ด ๋ฌ๋ค. Host name์ ec2์ ip๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ์ฐ๊ฒฐ ๊ฐ๋ฅํ๋ค.
- ์ฐ๊ฒฐ ํ Add JMX Connection์ ๋๋ฌ ํ์ฌ jar๋ฅผ ์คํ์ค์ธ port๋ฅผ ์ ๋ ฅํ๋ค. ๋ ๊ฐ์ ๊ฒฝ์ฐ 8080์ด์๋ค
- Map์ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์๊ธ ์์ ์กฐํ์ ์์ฒญ์ ๋ณด๋ด๋ณด๊ณ GC๊ฐ ์ ๋๋์ง ๋ชจ๋ํฐ๋ง ํด๋ณด์๋ค. ๊ฒ์๊ธ ์์ธ ํ์ด์ง์์ ๊ฒ์๊ธ๊ณผ 1:N์ธ ๋ต๋ณ์ ๋ถ๋ฌ์์ผํ๊ณ , ๊ฐ ๋ต๋ณ์ 1:N์ธ Comment, ReComment๊น์ง ๋ถ๋ฌ์์ผ ํ์ด์ Map์ ๋ง์ด ์ฌ์ฉํ์๋ค. ํ๋คํ ๊ทธ๋ํ๋ฅผ ๋ดค์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ง๋ ์์๋ค.
- ๋ํ Heap histogram์์ ๊ฐ ์๋ฃํ ๋ง๋ค ์ฌ์ฉ์ค์ธ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ ์์๋๋ฐ ๊ทธ ๋ถ๋ถ์์๋ ๋ฐ๋ก ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ ํ์ธํ์ง ๋ชป ํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์ผ์ด๋๋ค๋ฉด ๊ทธ๋ํ๊ฐ ๋จ์ด์ง์ง ์๊ณ ์ ์ง๋๊ฑฐ๋ ์ฐ์ํฅ ๋๋ค.
- ์ถ๊ฐ๋ก VisualVM์์ GC๊ฐ ์ ๋๋์ง ๋ ์์ธํ๊ฒ, ์ด์๊ฒ ๋ณผ ์ ์๋ plugin์ด ์๋ค.
- Visual GC ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ณ remoteํ๊ฒฝ์ ์ถ๊ฐ ์ธํ ์ ๋ฐ๋ผํด๋ด๋ ์ ์ ๋์ ..ใ ์ผ๋จ ์ฌ๊ธฐ๊น์ง