深入理解java虚拟机JVM(上)

链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w

提取码:uwak

复制这段内容后打开百度网盘手机App,操作更方便哦

1. java的技术体系概述

1.1 java介绍



java2 EE:




实现:


1.2 java代码的编译与执行

深入理解java虚拟机JVM(上)-LMLPHP

1.3 java代码的类库调用过程

深入理解java虚拟机JVM(上)-LMLPHP

index.java --> javaC --> index.class --> class loader --> JVM

1.4 javaEE的处理流程

#Servlet格式:
JSP:
<html>
<title></title>
<body>
<h1>...<h1>
<%
...
java code here
...
%>
</body>
</html>

index.jsp --> Servlet(转译器) --> index_jsp.java--> javaC(编译器) -->index_jsp.class --> class loader(加载器) -->JVM

1.5 Tomcat架构分析

Tomcat官方网站 http://tomcat.apache.org

深入理解java虚拟机JVM(上)-LMLPHP

#tomcat组件:
<Server>
<Service>
<Connector/>
<Connector/>
<Engine>
<Host>
<Context/>
...
</Host>
<Host>
</Host>
...
</Engine>
</Service>
</Server>

2. JVM执行分析

2.1 Java内存模型概述

深入理解java虚拟机JVM(上)-LMLPHP



深入理解java虚拟机JVM(上)-LMLPHP

2.2 java对象的访问模式

#句柄在python中的使用
f = open("test") #创建文件句柄以相对路径打开文件(f ===> 指代文件的内存地址)
first_line = f.readline() #读取文件内容的一行,并赋值
print (first_line) #打印文件内容第一行
for num in range(4) : #循环迭代4次
print (f.readline()) #再读一行继续打印(重复4次)
f.close() #关闭文件
#对象(句柄)在java中的使用
Object obj #声明对象,实际上只是表示一个本地的引用,那么这个本地的引用本身一定会保存一个堆内存的地址,在这之中还会包含一个本地变量表的概念,也就是说,引用类型通过本地变量表才能找到一个具体的堆内存的引用数据。 obj = new Object() #实例化对象,实例化对象就会开辟堆内存空间;在这个过程中有两种做法:通过句柄进行访问;直接指针访问;

深入理解java虚拟机JVM(上)-LMLPHP

深入理解java虚拟机JVM(上)-LMLPHP

深入理解java虚拟机JVM(上)-LMLPHP

2.3 JVM的规范标准

深入理解java虚拟机JVM(上)-LMLPHP

#在安装了jdk环境的系统上查看
[root@Tomcat-Jvm ~]# which java
/usr/jdk/bin/java [root@Tomcat-Jvm ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

深入理解java虚拟机JVM(上)-LMLPHP

#JVM虚拟机的纯解释模式
[root@Tomcat-Jvm ~]# java -Xint -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, interpreted mode) #JVM虚拟机的纯编译模式
[root@Tomcat-Jvm ~]# java -Xcomp -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, compiled mode)

深入理解java虚拟机JVM(上)-LMLPHP

3. JVM内存模型与垃圾收集

3.1 Java堆内存模型

深入理解java虚拟机JVM(上)-LMLPHP

深入理解java虚拟机JVM(上)-LMLPHP

3.2 Java对象创建与垃圾回收流程

深入理解java虚拟机JVM(上)-LMLPHP

3.2.1 请问自动的GC什么时候触发?

3.3 Java堆内存基础调整策略(JVM基础优化策略)

深入理解java虚拟机JVM(上)-LMLPHP

例如:-Xms16g -Xmx16g 将堆内存初始大小和堆内存最大大小设成一样,如此就把“伸缩区”给取消掉了

3.3.1 Tomcat堆内存调优实操演示

#在一台启动了tomcat的虚拟机上进行如下操作(未调优前
[root@Tomcat-Jvm ~]# pgrep java #查看tomcat的pid号
7862 [root@Tomcat-Jvm ~]# jmap -heap 7862 #通过jmap命令追踪java进程的堆信息
Attaching to process ID 7862, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.60-b23 using thread-local object allocation.
Mark Sweep Compact GC Heap Configuration: #堆内存初始化配置
MinHeapFreeRatio = 40 #JVM堆最小空闲比率
MaxHeapFreeRatio = 70 #JVM堆最大空闲比率
MaxHeapSize = 255852544 (244.0MB) #JVM堆的最大大小
NewSize = 5570560 (5.3125MB) #新生代的堆内存默认大小
MaxNewSize = 85262336 (81.3125MB) #新生代的堆内存最大大小
OldSize = 11206656 (10.6875MB) #老年代的堆内存最大大小
NewRatio = 2 #新生代和老年代的大小比率(新生代:老年代=1:2)
SurvivorRatio = 8 #新生代中eden区和存活区的大小比值(eden:S0:S1=8:1:1)
MetaspaceSize = 21807104 (20.796875MB) #元空间的默认大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) #类指针压缩空间大小,默认1G
MaxMetaspaceSize = 17592186044415 MB #元数据最大值,超过此值会触发FULL GC,受限与系统内存大小
G1HeapRegionSize = 0 (0.0MB) Heap Usage:
New Generation (Eden + 1 Survivor Space): #新生代对内存统计
capacity = 8257536 (7.875MB)
used = 5357464 (5.109275817871094MB)
free = 2900072 (2.7657241821289062MB)
64.87969292534723% used
Eden Space:
capacity = 7340032 (7.0MB)
used = 4439968 (4.234283447265625MB)
free = 2900064 (2.765716552734375MB)
60.48976353236607% used
From Space:
capacity = 917504 (0.875MB)
used = 917496 (0.8749923706054688MB)
free = 8 (7.62939453125E-6MB)
99.99912806919643% used
To Space:
capacity = 917504 (0.875MB)
used = 0 (0.0MB)
free = 917504 (0.875MB)
0.0% used
tenured generation: #老年代堆内存统计
capacity = 18305024 (17.45703125MB)
used = 14210536 (13.552223205566406MB)
free = 4094488 (3.9048080444335938MB)
77.6318894747147% used 9903 interned Strings occupying 857912 bytes.
#进行tomcat的基础堆内存参数调优
#调优tomcat的java内存需要在/usr/tomcat/bin/catalina.sh文件中加入参数
[root@Tomcat-Jvm bin]# vim catalina.sh
[root@Tomcat-Jvm bin]# sed -n '121p' catalina.sh
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m" #重启动tomcat
[root@Tomcat-Jvm ~]# /usr/tomcat/bin/shutdown.sh [root@Tomcat-Jvm ~]# /usr/tomcat/bin/startup.sh
#再次最终java进程的堆信息
[root@Tomcat-Jvm ~]# pgrep java
7933 [root@Tomcat-Jvm ~]# jmap -heap 7933
Attaching to process ID 7933, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.60-b23 using thread-local object allocation.
Mark Sweep Compact GC Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 357892096 (341.3125MB)
MaxNewSize = 357892096 (341.3125MB)
OldSize = 715849728 (682.6875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB) Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 322109440 (307.1875MB)
used = 137906424 (131.51781463623047MB)
free = 184203016 (175.66968536376953MB)
42.81353070558876% used
Eden Space:
capacity = 286326784 (273.0625MB) #eden+两个存活区大小刚好为MaxNewSize大小,没有伸缩区了
used = 137906424 (131.51781463623047MB)
free = 148420360 (141.54468536376953MB)
48.163997120157646% used
From Space:
capacity = 35782656 (34.125MB)
used = 0 (0.0MB)
free = 35782656 (34.125MB)
0.0% used
To Space:
capacity = 35782656 (34.125MB)
used = 0 (0.0MB)
free = 35782656 (34.125MB)
0.0% used
tenured generation:
capacity = 715849728 (682.6875MB)
used = 0 (0.0MB)
free = 715849728 (682.6875MB)
0.0% used 9909 interned Strings occupying 858528 bytes.
3.3.2 项目中如何对java(JVM)进行调优?

3.4 新生代

深入理解java虚拟机JVM(上)-LMLPHP


3.4.1 新生代GC算法----复制算法(Copying)

下图红色部分为不存活对象所占内存空间,绿色为存活对象所占内存空间;

深入理解java虚拟机JVM(上)-LMLPHP

3.4.2 新生代中的算法优化

(1)BTP(Bump-The-Pointer)

深入理解java虚拟机JVM(上)-LMLPHP

(2)TLAB(Thread-Local Alloction Buffers)

深入理解java虚拟机JVM(上)-LMLPHP

3.4.3 新生代内存参数调整

深入理解java虚拟机JVM(上)-LMLPHP

3.4.4 新生代堆内存参数调优实操演示

[root@Tomcat-Jvm bin]# pwd
/usr/tomcat/bin
[root@Tomcat-Jvm bin]# sed -n '121p' catalina.sh #源参数
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m"
[root@Tomcat-Jvm bin]# vim catalina.sh
[root@Tomcat-Jvm bin]# sed -n '121p' catalina.sh #现参数
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -Xmn500m -Xss256k" #重启动tomcat
[root@Tomcat-Jvm bin]# pgrep java
7631
[root@Tomcat-Jvm bin]# kill -9 7631
[root@Tomcat-Jvm bin]# sh startup.sh
[root@Tomcat-Jvm bin]# pgrep java
7734
[root@Tomcat-Jvm bin]# pgrep java
7734 [root@Tomcat-Jvm bin]# jmap -heap 7734
Attaching to process ID 7734, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.60-b23 using thread-local object allocation.
Mark Sweep Compact GC Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 524288000 (500.0MB)
MaxNewSize = 524288000 (500.0MB)
OldSize = 549453824 (524.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB) Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 471859200 (450.0MB)
used = 168826264 (161.0052719116211MB)
free = 303032936 (288.9947280883789MB)
35.77894931369357% used
Eden Space:
capacity = 419430400 (400.0MB)
used = 168826264 (161.0052719116211MB)
free = 250604136 (238.9947280883789MB)
40.25131797790527% used
From Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
To Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
tenured generation:
capacity = 549453824 (524.0MB)
used = 0 (0.0MB)
free = 549453824 (524.0MB)
0.0% used 9870 interned Strings occupying 856216 bytes.

3.5 老年代

3.5.1 老年代GC算法1----标记-清除(Mark-Sweep)

深入理解java虚拟机JVM(上)-LMLPHP

3.5.2 老年代GC算法2----标记-压缩(Mark-Compact)

深入理解java虚拟机JVM(上)-LMLPHP

3.5.3 老年代内存参数调整

深入理解java虚拟机JVM(上)-LMLPHP

3.6 永久代(JDK1.8后被废除了)

3.6.1 永久代内存参数调整(设置也已经没用了)

深入理解java虚拟机JVM(上)-LMLPHP

3.7 元空间

3.7.1 元空间的内存参数调整

深入理解java虚拟机JVM(上)-LMLPHP

3.8 关于java的堆内存溢出(java.lang.OutOfMemoryError)

3.8.1 请问是否知道什么叫OOM?什么情况下会出现?

04-11 03:01
查看更多