参考教学视频:秦疆
JVM概述
JVM位置:操作系统之上
JVM的体系结构
.java -> Class File -> 类加载器 Class loader <--> 运行时数据区 Runtime Data Area <--> 本地方法接口 <- 本地方法库
运行时数据区 Runtime Data Area <--> 执行引擎
-
方法区:Method Area
-
Java栈:Stack
-
本地方法栈:Native Method Stack
-
堆:Heap
-
程序计数器:
-
执行引擎:executeEngine
-
本地方法接口:Native Method Interface
JVM调优,方法区,堆
类加载器
作用:加载class文件
-
虚拟机自带的加载器
-
启动类(根)加载器
-
扩展类加载器 ExtClassLoader
-
应用程序加载器 AppClassLoader
双亲委派机制:安全
//App -> Ext -> Boot(最终执行)
-
类加载器收到类加载的请求
-
将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
-
启动加载器检测是否能够加载当前类,如果能就结束,使用当前类加载器,否则抛出异常,通知子类加载器进行加载
-
重复步骤3
沙箱安全机制
沙箱:限制程序运行的环境
native、方法区
//native:凡事带了native关键字,说明java的作用范围无法达到,调用了底层c语音库 //会进入本地方法栈,调用本地方法接口 JNI //JNI的作用:扩展Java的使用,融合不同的编程语言为java使用
栈
程序 = 数据结构 + 算法
-
栈:数据结构,先进后出
-
主管程序的运行,生命周期和线程同步;线程结束,占内存释放,对于栈来说,不存在垃圾回收问题
-
8大基本数据类型+对象引用+实例方法
-
队列:先进先出
HotSpot和堆
三种JVM
-
Sun公司:HotSpot
-
BEA公司:JRockit
-
IBM:J9VM
堆(Heap)
一个JVM只有一个堆内存,堆内存的大小是可以调节的
类加载器读取的类文件后,一般会把类、方法、常量、变量~放入堆内存中,保存所有引用类型的真实对象;
堆内存中细分为三个区域:
经过研究,99%的对象都是临时对象
-
新生区(伊甸园区)Young/New
-
伊甸园:所有的对象都是在伊甸园区new出来,满了触发一次轻GC
-
幸存者区(0,1):
-
-
老年区 old
-
永久区 Perm
这个区域常驻内存的,用来存放JDK自身携带的class对象。Interface元数据,存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收,关闭虚拟机就会释放这个区域的内存
一个启动类,加载了大量的第三方jar包。Tomcat部署了太多的应用,大量动态生成的反射类。不断的被加载,直到内存满就会出现OOM
-
jdk1.6之前:永久代,常量池在方法区
-
jdk1.7:永久代,但是慢慢的退化了,去永久代,常量池在堆中
-
jdk1.8之后:无永久代,常量池在元空间
-
-Xms1024m -Xmx1024m -XX:+PrintGCDetails
Jprofilter工具分析OOM
-
能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler
-
Debug,一行行分析代码
MAT,Profiler工具作用:
-
分析Dump内存文件,快速定位内存泄露;
-
获得堆中的数据
-
获得大的对象
-
。。。。
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
GC
-
JVM的内存模型和分区
-
堆里面的分区有哪些,说说他们的特点
-
Eden
-
From
-
to
-
old
-
-
GC的算法有哪些
-
标记清除法
-
标记整理
-
复制算法
-
引用计数器
-
-
轻GC和重GC分别在什么时候发生
新生区轻,老年代重
标签:JAVA,语言,对象,GC,内存,JVM,Day13,方法,加载 From: https://www.cnblogs.com/-Gin/p/18138941