zoukankan      html  css  js  c++  java
  • JVM和GC垃圾回收机制和内存分配

    JVM运行期间


    线程共享 线程私有

    线程共享: 方法区 堆
    方法区:存放可以共享数据,静态常量,类的共有方法属性字段等,可以共享的存在方法区。

    堆:存放class对象 。

     


    线程私有:本地方法栈 虚拟机栈 程序计数器

    本地方法栈:存储有关键字native的对象

    虚拟机栈:存储引用对象

    程序计数器:假如两个线程从0执行到100,先是线程A抢到了cpu资源,他从0执行到了15,cpu重新分配资源,
    线程B抢到了从0执行到了10,下一次资源线程A抢到他从15执行到了20。那这个线程是怎么延续上一次的操作继续执行的呢? 这就是用到了程序计数器去计算。

    类的加载机制

    1.加载:将.class字节码文件加载到内存中,并在堆中生成了一个对象。作为方法区的入口。

    2.连接:判断加载的时候有没有出现过异常,类的验证,类的准备,类的解析。

    3.初始化/实例化:就是实例化的时候, 创建对象的时候。实例化对象分为:类的主动引用,和类的被动引用。

    4.运行:写代码的期间。

    5.结束:程序运行结束。

    GC垃圾回收机制
    01.基本概念
    c语言中,垃圾回收是程序员手动控制!
    可能会出现的问题:
    没有及时清除不用的对象
    误操作,清除了系统类。
    在java的运行过程中,java虚拟机提供了一个垃圾回收线程。
    他负责自动回收程序中不在使用的对象,我们称作垃圾回收机制(Garbage Collection)
    02.特点
    减轻了程序员的压力
    防止误操作导致程序崩溃
    只有在一个对象没有引用的时候,才会回收
    程序无法控制垃圾回收器进行工作
    当GC在回收无用的对象的使用,首先会调用一次finalize()
    如果调用成功,则对象不回收,但是,这个方法只有一次机会!
    03.对象的状态
    可触及状态:对象还有引用
    不可触及状态:对象调用finalize(),如果没有还原成可触及状态。
    可复活状态:对象没有引用,没有调用finalize()
    GC回收的不是对象,而是对象在内存中的空间!!


    内存分配区域
    分代分配,分代回收

    01.新生代
    新生代分为两部分 绝大部分放进eden区 eden占20%
    在eden区满的时候,会把区里的对象放到survivor区 survivor区占80% survivor区分为两个区域一个survivor0区,一个survivor1区。
    这两个区必须有一个是空的, 加入survivor0区满了会把对象转移到survivor1区中,把死亡的对象清除。survivor1区满了转移到survivor0区。
    当一个对象在新生代区域存活已久,并且没有清空,则会被放到老年代中。
    02.老生代
    内存空间远远大于新生代!
    如果创建的对象eden区放不下,会直接放进老年代!
    在老年代执行GC我们称为 Full GC(Major GC)
    当老年代内存快满的时候,执行Full GC
    03.永久代
    所有类的实例对象(class对象的引用)已经被回收
    加载类的classloader已经回收了

  • 相关阅读:
    Flex4之关于Embed外部资源的使用方法总结
    Flex tree的开发 后台数据连接
    Flex4之Tree开发
    Flex自定义组件开发
    解决AS3请求数据的“安全沙箱冲突”问题
    purMVC代码备份
    译:如何配置Red5应用程序
    关于RED5——配置文件详解
    关于socket使用Amf直接进行对象传输的
    垃圾回收机制
  • 原文地址:https://www.cnblogs.com/java-263/p/9831238.html
Copyright © 2011-2022 走看看