1. JVM的位置
JVM是运行在操作系统之上的。
2. JVM体系结构
3. 类加载器
类加载器的作用:加载class文件
加载器:①.ApplicationClassLoader应用程序类加载器,主要负责加载当前应用classpath路径下的所有类;
②.ExtentionClassLoader扩展类加载器,主要负责加载/lib/ext目录下的jar包和class文件;
③.BootstrapClassLoader启动类加载器,主要负责加载/lib下的tr、resources.jar、charset.jar和class等;
④.UserClassLoader用户自定义类加载器,可加载指定路径的class文件。
4. 双亲委派机制
类加载器收到类加载的请求,会将请求向上委托给父类加载器区完成,一直到BootstrapClassLoader启动类加载器。
启动类加载器收到加载类的请求会检查这个类能否加载,能够加载则完成。不能加载就抛出异常,通知子加载器进行加载。
5. 沙箱安全机制
①. Java安全模型的核心就是java沙箱(sandbox),什么是沙箱?沙箱是限制程序访问系统资源的环境。沙箱机制就是将java代码
限定在JVM虚拟机特定的运行范围中,并且严格限制代码对本地资源(CPU、内存、文件系统、网络)的访问,通过这样的措施
来保证对代码的有效隔离,防止对本地系统造成破坏。
②. 在java中将执行程序分为本地代码和远程代码两类,本地代码默认是可信任的,而远程代码则被视为不受信任的。对于授信的
本地代码来说,可以访问一切系统资源。
6. native
凡是带有native关键字的代码,说明java代码达不到了,需要调用底层c语言的库。
本地方法库的作用:扩展java的使用,融合不同的编程语言为Java所用!在java诞生的时候,c、c++横行,
想要立足必须调用c、c++的程序,所以它在内存区域中专门开辟了一块标记区域:Native Method Stack,
登记native方法。在最终执行的时候,加载本地方法库中的方法。
7. 方法区
Method Area方法区:方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码
也在此定义。简单说,所有定义的方法的信息都保存在该区域,该区域是属于共享区间;静态变量、常量、类信息(
构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。
8. 栈
略
9.堆
一个JVM只有一个堆(Heap)内存,堆内存的大小是可以调节的。
类加载器读取到类文件后,一般会把什么东西放到堆中?类,方法,常量,变量,保存我们所有引用类型的真实对象。
堆内存中还可以细分为三个区域: 新生区(Eden、ServivorTo、ServivorFrom)、养老区(Old)、永久区(Perm)
GC垃圾回收,主要是在伊甸园区和养老区。
10. 新生区、永久区、堆内存调优
新生区: ①类诞生和成长的地方,甚至死去。
②伊甸园,所有的对象都是在伊甸园区new出来的
③幸存者区
真理: 经过研究发现,99%的对象都是临时对象!
永久区: 这个区域存储的是java运行时的一些环境或类信息,这个区域不存在垃圾回收,关闭JVM虚拟机就会释放这个区域的内存。
GC分为两类: ①轻GC(针对新生代,偶尔针对下幸存区) ②重GC(全局GC,所有东西都释放一遍,释放内存)
11. 使用Jprofiler工具分析OOM原因
Jprofiler作用: 分析Dump内存文件,快速定位内存泄漏;获得堆中的数据;获得大的对象
-Xms 设置初始化内存分配大小(默认为1/64)
-Xmx 设置最大分配内存(默认1/4)
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/269662.html