jvm之内存分配与垃圾回收

1、java运行时内存区结构

线程共享内存区

java堆区

它是JVM用来存储对象实例以及数组值的区域,可以认为Java中 所有通过new创建的对象的内存都在此分配

方法区(永久代)

方法区在物理上也属于java堆区的一部分。 它用于存储每一个类的结构信息,例如运行时常量池, 成员变量和方法数据,构造函数和普通函数的字节码内容,还包括一些在类、实例、接口初始化时用到的特殊方法。 当开发人员在程序中通过Class对象中的getName、isInstance等方法获取信息时,这些数据都来自方法区。

运行时常量池

存放的为类中固定的常量信息、方法和域的引用信息。属于方法区的一部分,内存大小超过方法区的所能提供的最大值会有异常。

线程私有内存区

pc寄存器

一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器, Java 的多线程机制离不开程序计数器,每个线程都有一个自己的PC,以便完成不同线程上下文环境的切换。

java栈

每一个 JVM 线程都有自己的 java 虚拟机栈,这个栈与线程同时创建,它的生命周期与线程相同。 虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、 方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈

本地方法栈则为虚拟机使用到的本地方法(比如使用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 最大元空间(永久区)的大小(默认本地内存)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值