JVM的体系结构
类装载器
虚拟机自带的加载器、启动类(根)加载器、扩展类加载器、应用程序加载器
作用:加载Class
双亲委派机制(理解理解)
我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由我们得ClassLoader负责将这些class文件给加载到JVM中去执行。
AppClassLoader-->ExtClassLoader-->BootstarpClassLoader
当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。
Native
凡是带了native关键字的,说明java作用范围达不到了,回去调用底层C语言的库,会进入本地方法栈,调用本地方法接口(JNI)。所以JNI作用相当于扩展Java的使用,融合不同的编程语言为Java所用 最初的C、C++。
方法区:被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数、接口代码也在此定义,简单说,所有定义方法的信息都保存在该区域,此区间属于共享区间 静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池都存在方法区中,但是实例变量存在堆内存中,和方法区无关
栈
栈:先进后出 队列:先进先出(FIFO)
栈:栈内存,主管程序的运行,生命周期和线程同步。对于栈来说,不存在垃圾回收问题
栈:8大基本类型+对象引用+实例的方法
栈运行原理:栈帧
栈+堆+方法区 交互关系
对象实例化的整个流程
三种JVM
- Sun公司 HotSpot
- BEA JRockit
- IBM J9 VM
堆
堆内存调优 GC GC常用算法
GC垃圾回收:主要在伊甸园区和养老区
OOM:堆内存不够
在JDK8以后,永久存储区改成了 元空间 元空间(特殊的堆):逻辑上存在,物理上不存在
GC(垃圾回收)
JVM在进行GC时,并不是三个区间统一进行,大部分时间都是在新生代进行
- 新生代
- 幸存区(from to)
- 老年代
GC两种类:轻GC、重GC
GC题目
- JVM的内存模型和分区,具体每个区放什么?
- 堆里面的分区有哪些 Eden、from、to、老年区、说说他们的特点
- GC的四大算法:标记清除算法、复制法、标记整理算法、分代收集算法
- 轻GC和重GC分别在什么时候发生
(1)复制算法:
每次GC都会将Eden中活的对象移到幸存区中,一旦Eden被GC后 就会是空的。(2)谁空谁是to(要保证有一个空间是空的)
好处:没有内存碎片
坏处:浪费了内存空间,因为有一片空间永远是空的
复制算法最佳使用场景:对象存活度较低的时候 新生区~
(2)标记清除算法
扫描对象,对活着的对象进行标记
再扫描一次 将没被标记的对象清除
优点:不需要额外的空间
缺点:两次扫描,浪费时间,而且会产生内存碎片
(3)标记整理法
在标记清除的基础上再加上一个 再扫描:整理对象,防止内存碎片产生
总结:
内存效率:复制算法>标记清除法>标记整理法
内存整齐度:复制=标记整理法>标记清除法
内存利用率:标记整理法=标记清楚法>复制法
年轻代:存活率低-->复制算法
老年代:存活率高-->标记清除(内存碎片不是太多)+标记整理混合实现
JMM(Java Memory Model)
Java内存模型
作用:缓存一致性协议,用于定义数据的读写规则
JMM定义了线程工作内存和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory)
解决共享对象可见性这个问题:volilate
标签:标记,算法,GC,内存,JVM,加载 来源: https://www.cnblogs.com/55yyy/p/16266044.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。