1、java运行时内存区结构
线程共享内存区
java堆区
方法区(永久代)
运行时常量池
线程私有内存区
pc寄存器
一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器, Java 的多线程机制离不开程序计数器,每个线程都有一个自己的PC,以便完成不同线程上下文环境的切换。
java栈
本地方法栈
本地方法栈则为虚拟机使用到的本地方法(比如使用c/c++代码编写的方法)服务。
2、垃圾回收算法
3、四种full GC的场景:
1、System.gc();
2、旧生代空间不足
旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError: Java heap space 。
3、Permanet Generation空间满
PermanetGeneration中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满。
4、统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。
5、堆区包含年轻代和老年代。方法区是永久代
年轻代分为三个区:一个Eden区,两个Survivor区(一个是fromspace区,另外一个是tospace区。)。大部分对象是在Eden区中生成。当Eden区满了,还存活的对象将被复制到Survivor区中(两个中的一个)。当这个Survivor也满了,此区还存活的对象将被复制到另一个Survivor中,当这个Survivor也满了还存活的对象会被复制到老年代。年轻代内存=Eden+其中一个Survivor区,也就是说两个Survivor区,虚拟机只使用了其中一个。算法过程:
1. Eden+S0可分配新生对象;
2. 对Eden+S0进行垃圾收集,存活对象复制到S1。清理Eden+S0。一次新生代GC结束。
3. Eden+S1可分配新生对象;
4. 对Eden+S1进行垃圾收集,存活对象复制到S0。清理Eden+S1。二次新生代GC结束。
5. goto 1。
Minor GC:新生对象在Eden区无法分配空间时,此时发生Minor GC。发生MinorGC,对象会从Eden区进入Survivor区(虚拟机会使用复制算法),如果Survivor区放不下从Eden区过来的对象时,将对象直接移动到年老代。
Major GC的触发条件:当年老代空间不够用的时候,虚拟机会使用“标记—清除”或者“标记—整理”算法清理出连续的内存空间,分配对象使用。
Major GC和Full GC是不一样的,前者只清理老年代,后者会清理年轻代+老年代
6、jvm参数
-Xmsl28MB JVM 初始分配的堆内有
-Xmx512MB JVM 最大允许分配的堆内存,按需分配
-Xmn300m 年轻代内存大小300M
-Xss128K jvm线程栈的内存大小
-XX: MaxMetaspaceSize 最大元空间(永久区)的大小(默认本地内存)