** π PART 6.1 JSP νλ‘μ νΈμμμ λ©λͺ¨λ¦¬ νλ νλͺ© **
βμλ²κ° λ²λ² μ΄μ§ μκ³ , λΉ λ₯΄κ² λμνλ©΄μ λ©λͺ¨λ¦¬λ μμ μ μΌλ‘ μ°κ² λ§λλ λ°©λ²β
π’ 1λ¨κ³. ν°μΊ£ μλ²μμ λ©λͺ¨λ¦¬λ μ΄λμ μ°μΌκΉ?
π¬ JSP νλ‘μ νΈλ μΉ μλ²(Tomcat)κ° μλνλ©΄μ
μ¬λ¬ νμΌ(JSP, ν΄λμ€, μΈμ λ±)μ λ©λͺ¨λ¦¬(RAM) μ μ μ¬ν΄μ μ²λ¦¬ν΄.
β λ©λͺ¨λ¦¬ μ°μ΄λ λν μμ
νλͺ© | μ€λͺ |
---|---|
JSP μλΈλ¦Ώ μ½λ | JSP β Servlet λ³νλ μ½λκ° λ©λͺ¨λ¦¬μ μ¬λΌκ° |
μΈμ (Session) | λ‘κ·ΈμΈ μ 보 λ± μ¬μ©μλ³ μν μ μ₯ |
μλ° κ°μ²΄ | 컨νΈλ‘€λ¬, DAO, DTO λ± ν΄λμ€ μΈμ€ν΄μ€ |
νμΌ μ²λ¦¬ | μ λ‘λλ μ΄λ―Έμ§/νμΌ μ 보 |
GC λμ κ°μ²΄ | λ μ΄μ μ¬μ©νμ§ μλ κ°μ²΄λ€ (λ©λͺ¨λ¦¬ λμ μ£Όμ) |
π§ 2λ¨κ³. JVM λ©λͺ¨λ¦¬ μ΅μ μΌλ‘ μλ² μ±λ₯ νλνκΈ°
π¬ JVM(Java Virtual Machine)μ μλ° μ½λκ° μ€νλλ κ°μ νκ²½μ΄μΌ.
Tomcatλ JVM μμμ λμκ°κΈ° λλ¬Έμ λ©λͺ¨λ¦¬ ν¬κΈ°λ₯Ό μ§μ μ€μ ν μ μμ΄!
β λν JVM μ΅μ μ€λͺ
μ΅μ | μ€λͺ | λΉμ |
---|---|---|
-Xms |
JVMμ΄ μμν λ ν보ν μ΅μ λ©λͺ¨λ¦¬ | μλ²κ° μ²μμ μ°¨μ§ν μ± μ ν¬κΈ° |
-Xmx |
μ΅λ μ¬μ©ν μ μλ λ©λͺ¨λ¦¬ | μ± μμ μ무리 μ¨λ λμ§ λͺ»ν μ΅λ ν¬κΈ° |
-XX:+UseG1GC |
G1 Garbage Collector μ¬μ© | λλνκ³ λΉ λ₯΄κ² μ 리ν΄μ£Όλ μ²μλΆ |
-XX:MaxPermSize (ꡬλ²μ ) |
ν΄λμ€/λ©μλ μ 보 μ μ₯ μμ ν¬κΈ° | π κ΅μ¬ν¨ ν¬κΈ° (Java 8 μ΄μ ) |
β μ€λ¬΄ μμ: Tomcat μ€ν μ΅μ
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
β μ²μμ 512MB, μ΅λ 1GB λ©λͺ¨λ¦¬ μ¬μ© / G1 GC μ¬μ©
π‘ μ€νμλ μ΄ν΄νλ GC (κ°λΉμ§ 컬λ ν°) μ€λͺ
GCλ μλ° νλ‘κ·Έλ¨μ΄ μ°κ³ λμ λ μ΄μ νμ μλ μ°λ κΈ° κ°μ²΄λ₯Ό μλμΌλ‘ μΉμμ£Όλ κΈ°λ₯μ΄μΌ!
μμ:
new String("hello")
λ§λ€κ³ β μ°Έμ‘° μμΌλ©΄ β GCκ° μ 리ν΄μ€!- κ·Όλ° κ·Έ μ°λ κΈ°κ° λ무 λ§μΌλ©΄ β GCκ° λ무 μμ£Ό μΌν¨ β μ±λ₯ λλ €μ§ β μλ² λ²λ² μ
π 3λ¨κ³. GC μ λ΅ μ€ G1GCκ° μ’μ μ΄μ
GC μ’ λ₯ | νΉμ§ |
---|---|
Serial GC | λ¨μΌ μ°λ λλ‘ μ²λ¦¬ β λλ¦Ό |
Parallel GC | λ©ν° μ°λ λ μ¬μ© β μ±λ₯ μ’μ (κΈ°λ³Έ) |
G1GC | μμ μμ λ¨μλ‘ λλ μ μ λ¦¬ν¨ β μλ΅ μ§μ° μ κ³ , λ©λͺ¨λ¦¬ μμ μ± μ΅κ³ |
β G1GC νΉμ§
- ν° κ°μ²΄ νλκ° μλλΌ, μμ βμμ(region)β λ¨μλ‘ μ²μν¨
- Full GCκ° μ κ² λ°μν¨
- μλ² μλ΅ μκ°μ΄ μμ μ μ β JSP μλ²μ λ§€μ° μ ν©!
π§ 4λ¨κ³. JSP precompile μ λ΅κ³Ό λ©λͺ¨λ¦¬ μ μ½
π¬ JSPλ μ²μ μμ²ν λ λ리λ€?
JSPλ μλ²μμ μ²μ μμ²μ΄ λ€μ΄μμ λλ§
β
.jsp
νμΌμ.java
β.class
λ‘ λ³νν΄μ μ€νλΌ.
μ΄ κ³Όμ :
-
λ³ν β μ»΄νμΌ β ν΄λμ€ λ‘λ©
β λ©λͺ¨λ¦¬ μ¬μ©λ λ§κ³ , μλ΅ μκ° λλ¦Ό
β Precompile(미리 μ»΄νμΌ) μ λ΅μ΄λ?
JSP νμΌμ 미리 μλΈλ¦Ώ(.class)μΌλ‘ λ§λ€μ΄λμ
첫 μμ² λ λ²λ² μ΄μ§ μκ² μ€λΉνλ μ λ΅!
π¦ JSP Precompile ν¨κ³Ό
νλͺ© | ν¨κ³Ό |
---|---|
JSP μ»΄νμΌ νμ΄λ° | μ΅μ΄ μμ² β λ°°ν¬ μλ‘ λ³κ²½λ¨ |
μ±λ₯ β | 첫 μ¬μ©μ μμ² μκ° λ¨μΆ |
λ©λͺ¨λ¦¬ β | μ»΄νμΌ κ³Όμ μμ λΆνμν κ°μ²΄ μμ± μ€μ΄λ¦ |
GC ν¨μ¨ β | μμ² μλ§λ€ ν΄λμ€ μμ±/μμ λ°μ μ ν¨ |
β Precompile λ°©λ² (Tomcat μμ)
cd $CATALINA_HOME/bin
jspc -d /output/path /webapp/**/*.jsp
λλ Maven + Jetty/Tomcat νλ¬κ·ΈμΈ μ¬μ© κ°λ₯
π 5λ¨κ³. λ©΄μ ν¬μΈνΈ μ 리
μ§λ¬Έ | λͺ¨λ² λ΅λ³ μμ½ |
---|---|
JVM μ΅μ -Xmsμ -Xmx μ°¨μ΄λ? | μμ μ λ©λͺ¨λ¦¬μ μ΅λ λ©λͺ¨λ¦¬ ν¬κΈ°λ₯Ό μ€μ νλ μ΅μ μ λλ€ |
G1GCλ μ΄λ€ μν©μμ μ’λμ? | λκ·λͺ¨ μλ²μμ μ§§μ μλ΅μκ°μ μ μ§ν΄μΌ ν λ μ’μ΅λλ€ |
JSP precompileμ΄λ? | JSPλ₯Ό μλ² μμ μ 미리 μ»΄νμΌν΄μ μ΄κΈ° λ‘λ©μ λΉ λ₯΄κ² λ§λλ μ λ΅μ λλ€ |
JSPκ° λ§μ λ λ©λͺ¨λ¦¬ λ¬Έμ κ° μκΈ°λμ? | λ€, λ§μ JSPκ° λμμ λ³νλλ©΄ ν΄λμ€ λ‘λ©μΌλ‘ λ©λͺ¨λ¦¬ μλ°μ΄ 컀μ§λλ€ |
ν°μΊ£μμ Full GCκ° μμ£Ό λ°μνλ©΄ μ΄λ»κ² νλμ? | λ©λͺ¨λ¦¬ μ΅μ μ‘°μ + GC μ’ λ₯ λ³κ²½ + JSP precompile μ λ΅μ λ³νν©λλ€ |
β λ§λ¬΄λ¦¬ μμ½ν
νλͺ© | μ€λͺ | λ©λͺ¨λ¦¬ μν₯ |
---|---|---|
-Xms |
JVM μμ μ ν보ν λ©λͺ¨λ¦¬ | λ무 μμΌλ©΄ GC μμ£Ό λ°μ |
-Xmx |
JVM μ΅λ λ©λͺ¨λ¦¬ μ ν | μλ²κ° μ¬μ©ν μ μλ μ΅λ κ³΅κ° |
UseG1GC |
G1 κ°λΉμ§ 컬λ ν° μ¬μ© | μμ μ μ΄κ³ λΉ λ₯Έ λ©λͺ¨λ¦¬ μ 리 |
JSP precompile | JSP 미리 μ»΄νμΌ | 첫 μμ² μκ° β, λ©λͺ¨λ¦¬ ν¨μ¨ β |
β PART 6.2 GC λ‘κ·Έ λΆμμ ν΅ν λ©λͺ¨λ¦¬ λ³λͺ© μΆμ
βμλ²κ° λλ €μ§λ©΄ κ°λΉμ§ 컬λ ν°(GC) νμΌ μλ μμ΄μ!β
π’ 1λ¨κ³. GC(κ°λΉμ§ 컬λ μ )κ° λμΌ?
π¬ GCλ μλ°κ° μ μ°λ λ©λͺ¨λ¦¬λ₯Ό μ 리ν΄μ£Όλ λλν μ²μκΈ°μΌ!
μμ:
String name = new String("νκΈΈλ");
// μ΄ nameμ λ μ΄μ μ μ°λ©΄ β GCκ° μμμ μΉμμ€!
β κ·Έλ°λ° λ¬Έμ λ?
μ΄ GCκ° μ²μλ₯Ό λ무 μμ£Ό νκ±°λ, ν λ² ν λ μ€λ 걸리면β¦
π₯ μΉμ¬μ΄νΈκ° λ©μΆ κ²μ²λΌ λλ €μ§ μ μμ΄!
π₯ 2λ¨κ³. Full GCκ° λκ³ μ μνν κΉ?
β GCλ μ’ λ₯κ° 2κ°μ§ μμ΄
μ’ λ₯ | μ€λͺ | μλ |
---|---|---|
Young GC | μ§§κ² μ§§κ² μμ£Ό μ²μν¨ | λΉ λ¦ |
Full GC | μ 체 λ©λͺ¨λ¦¬λ₯Ό μ λ¦¬ν¨ (Old μμκΉμ§) | λλ¦Ό! μλ² μ κΉ λ©μΆ€ π |
π‘ Full GCκ° λ°μνλ©΄?
- μλ²κ° κ·Έ μκ°μλ λ€λ₯Έ μμ μ λ©μΆ€ (Stop The World)
- μ¬μ©μ μμ² μλ΅μ΄ μ μ λ©μΆ€ or μ€ν¨
- νμ΄μ§κ° λλ €μ§κ±°λ μλ²κ° λ€μ΄λλ κ²μ²λΌ 보μ
β μμ (μ€νμλ μ΄ν΄ κ°λ₯ν νλ¦)
[μ¬μ©μ μμ²]
β νμ΄μ§ μ΄λ¦Ό
β κ°μκΈ° μλ²κ° "μ κΉλ§~ GC μ’ νκ³ μ¬κ²"
β Full GC μ€...
β μ¬μ©μ μ
μ₯: "μ μ΄λ κ² λλ €?! μ λ¨λ€?"
π 3λ¨κ³. GC λ‘κ·Έ μΌκΈ° + Full GC νμΈ λ°©λ²
β Tomcat JVM μ΅μ μμ GC λ‘κ·Έ νμ±ν
-verbose:gc
-Xlog:gc*:file=logs/gc.log:time,uptime,level,tags
π‘ μ΄κ±Έ μ€μ νλ©΄ gc.log νμΌμ GCκ° μ€νλ μκ°, μ’ λ₯, μμ μκ° λ±μ΄ μ μ₯λ¨
β GC λ‘κ·Έ μμ
[Full GC (System.gc()) 1024M->512M(2048M), 1.2345678 secs]
νλͺ© | μλ―Έ |
---|---|
Full GC |
μ 체 μμ μ 리 λ°μ |
1024M->512M |
μ 리 μ 1024MB β μ 리 ν 512MB |
1.23 secs |
GCμ 1.23μ΄ κ±Έλ¦Ό π± (μν μ νΈ!) |
π§ 4λ¨κ³. Full GCκ° μμ£Ό λ°μνλ μ΄μ λ?
μμΈ | μ€λͺ |
---|---|
λ무 λ§μ κ°μ²΄ μμ± | μ: λ°λ³΅λ¬Έ μμμ new κ°μ²΄ μμ± λ¬΄ν |
ν° κ°μ²΄ μ μ§ | μ: ν° μ΄λ―Έμ§ 리μ€νΈλ₯Ό μΈμ μ κ³μ μ μ§ |
λ©λͺ¨λ¦¬ λΆμ‘± | -Xmx μ€μ μ΄ λ무 μμ |
GC μ€μ λΆμ μ | G1GC μ μ°κ³ , κΈ°λ³Έ Serial GCμΌ κ²½μ° λ°μλ₯ β |
π‘ μ€λ¬΄μμ μμλ μ€μ λ¬Έμ μ¬λ‘
νμμ λ§λ μΌνλͺ°μ΄ λλ €μ‘λλ° μ΄μ λ₯Ό λͺ°λμ.
GC λ‘κ·Έλ₯Ό λ΄€λλ Full GCκ° 5μ΄ κ°κ²©μΌλ‘ κ³μ λ°μ μ€β¦
μκ³ λ³΄λ, μΈμ μ μν μ 체 리μ€νΈλ₯Ό ν΅μ§Έλ‘ μ μ₯νκ³ μμμ! π±
π― 5λ¨κ³. λ©΄μ ν¬μΈνΈ μ΄μ 리
μ§λ¬Έ | λͺ¨λ² λ΅λ³ μμ½ |
---|---|
Full GCκ° μμ£Ό λ°μνλ©΄ μ΄λ€ λ¬Έμ κ° μκΈ°λμ? | μλ²κ° κ·Έ μκ° λͺ¨λ μμ μ λ©μΆκΈ° λλ¬Έμ μ¬μ©μ μμ²μ΄ μ§μ°λκ±°λ μ€ν¨ν μ μμ΅λλ€ |
GC λ‘κ·Έλ μ΄λ»κ² νμΈνλμ? | JVM μ΅μ
μμ -Xlog:gc* μ€μ μ ν΅ν΄ gc.log νμΌλ‘ μ μ₯ν μ μμ΅λλ€ |
Full GCκ° λ°μνλ μ΄μ λ? | κ°μ²΄ μμ± κ³Όλ€, λ©λͺ¨λ¦¬ λΆμ‘±, μλͺ»λ GC μ€μ λ±μ΄ μμ΅λλ€ |
ν΄κ²° λ°©λ²μ? | G1GC μ€μ , κ°μ²΄ μ¬μ¬μ©, μΈμ λ©λͺ¨λ¦¬ μ΅μν, λ©λͺ¨λ¦¬ μ¦κ°(-Xmx μ‘°μ ) λ± |
μ€λ¬΄μμ GC λ³λͺ©μ μ΄λ»κ² μ‘λμ? | GC λ‘κ·Έ μκ°ν λꡬ(GCViewer, VisualVM λ±)λ‘ λΆμνκ³ νλν©λλ€ |
β λ§λ¬΄λ¦¬ μμ½ν
νλͺ© | μ€λͺ | λ©λͺ¨λ¦¬ μν₯ |
---|---|---|
Full GC | μ 체 λ©λͺ¨λ¦¬ μ 리 (Old μμ ν¬ν¨) | μλ² μλ΅ μ§μ° β, GC μκ° β |
GC λ‘κ·Έ | GC λμ μκ°/κ²°κ³Ό νμΈ λꡬ | λ³λͺ© μΆμ κ°λ₯ |
λ³λͺ© μμΈ | κ°μ²΄ κ³Όλ€ μμ±, λ©λͺ¨λ¦¬ λΆμ‘± | ν΄κ²° μμΌλ©΄ μλ² λλ €μ§/μ€λ¨ |
νλ μ λ΅ | G1GC μ¬μ©, -Xmx μ¦κ°, κ°μ²΄ μλͺ μ‘°μ | GC νμ β, μλ² μμ μ± β |