java1.7的JVM 图:
1.类加载器,加载.class文件,把.class文件加载到jvm内存里面,类加载器有2大类型一共有4种,有用户自定义加载器
启动类加载器,扩展类加载器,应用程序加载器。
2.执行引擎:把jvm的相关的命令交给操作系统。
3.但凡有Native的方法,java执行不了,就会他放到本地方法栈,出栈的时候调用本地接口,
本地接口会调用本地方法库。
4.pc寄存器:指向下一个方法的指针,生命周期短,与线程同生共死,不需要垃圾回收,
5.方法区:属于共享区间,用来保存所有定义的方法的信息。如静态变量+常量+类信息(构造方法/接口定义)+运行时常量池
他的生命周期很长,jvm同生共死。
6.stack 栈:他的特点是先进后出,生命周期很短,线程一结束栈就Over,不存在垃圾回收问题,主要用来存储8种
基本类型的变量+对象的引用变量+实例方法,也会有一定的异常:java.lang.StackOverflowError栈溢出,写的代码有问题,
一直在压栈,造成这个问题。调整内存大小,治标不治本,应该找到问题代码,去解决。
7.Heap堆:在java7以前,逻辑上堆分为新生区,养老区,永久区,新生区又分为,伊甸区和幸存区,
幸存区又分为0区和1区,java8以后永久区变为元空间,物理上来说不管java7还是java8只分为新生区和养老区
堆也会引起一些异常,Full GC之后依然无法回收垃圾会报java.lang.OutOfMemoryError:java heap space 简称OOM异常,造成这个的原因是
java虚拟机堆内存不够,可以通过参数-xms -xmx来调整,还有一种可能,就是代码有问题,代码创建了大量对象,并且长时间不能被垃圾
收集器收集.