JVM
JVM模型图
native关键字
凡是带了native关键字的说明java的作用范围达不到了,会去调用底层C语言的库
,会进入本地方法栈。调用本地方法栈的接口 JNI,扩展java的使用,融合不同的编程语言为java使用。
方法区
静态变量(static),常量(final),类的信息,运行时的常量池存在方法区中,但是实例变量存在堆内存中和方法区无关。
堆 heap
一个JVM只有一个堆,堆里面不可能有垃圾。
堆内存满了会出现OOM错误,可以通过调节才参数扩大堆内存。如果还是报错就分析内存看哪里有错误。(需要专业的工具)
垃圾回收机制GC
分为新生区(新生区又分为伊甸园区、幸存区0区、幸存区1区)、养老区、永久存储区。垃圾回收分为轻回收和重回收,轻回收主要在伊甸园区,重回收主要在养老区。
新生区
类:诞生和成长甚至死亡的过程。
伊甸园区:所有对象都在伊甸园区new出来。
当新new出来的对象将伊甸园的空间沾满时,这时候会进行一次轻GC(只清理伊甸园区和幸存区的垃圾),将伊甸园区的数据放入到幸存区,每进行一次轻GC两个幸存区就会发生交换(专业叫做幸存to、幸存from,总要保证一个为空,谁是空谁就是to。好处:垃圾回收算法用到复制算法)幸存to变为幸存from、幸存from变为幸存to,当一个对象进行15次轻GC后还活着,这个对象就会进入到老年区。当幸存区的内存也被沾满的时候,就会进行一次重GC(对全局进行清理),这时候大部分的垃圾都会被清理掉,但是还有一部分是有用的数据,这时候就会放入到老年区。
永久区
永久区是常驻内存的,用来存放JDK自己的类,存放java运行的环境和自带类的信息,永久区里面不可能存在垃圾回收。当JVM关闭时,永久区里的东西销毁。
在jdk1.7之前都叫永久区。但在jdk1.8之后叫元空间。
GC的算法
标记清除法、标记压缩法、复制算法、引用计数法
引用计数法
给每个对象都分配一个计术器(计数器本身就有消耗)
复制算法(幸存区用到了)
幸存区to和幸存区from用到了复制算法。可看上面的新生区。
好处:没有内存碎片。永远有一半的空间。
坏处:浪费了一半的内存,分两个幸存区。假设一个幸存区满了,每次进行轻GC,都会全部复制。效率问题。
最佳使用场景:对象存活不高的情况
标记清除法
优点:不需要额外的空间。
缺点:两次扫描,严重浪费空间,会产生内存碎片。
标记压缩法
在标记清除的算法上在进行一次扫描将存活的对象向前移。
算法比较
内存效率:复制算法 > 标记清除算法 > 标记压缩算法
内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法
内存利用率:标记清除算法 = 标记压缩算法 > 复制算法
标签:标记,算法,幸存,GC,内存,JVM,伊甸园 From: https://www.cnblogs.com/aseed/p/17355173.html