JAVA语言学习-Day13
参考教学视频:
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分别在什么时候发生 
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号