1. JVM的位置

JVM是运行在操作系统之上的。

 

2. JVM体系结构

 

 

 

3. 类加载器

类加载器的作用:加载class文件

加载器:①.ApplicationClassLoader应用程序类加载器,主要负责加载当前应用classpath路径下的所有类;

            ②.ExtentionClassLoader扩展类加载器,主要负责加载libext目录下的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)

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/ygmzj/p/16401221.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!