java虚拟机与反射机制

1 什么是虚拟机

2 虚拟机内存模型

  程序计数器:线程私有,记录下一个执行的java字节码地址,如果是本地方法区,则为Null

虚拟机栈:线程私有,存储变量、方法返回值、类的引用,变量的值、类型、名称、如果变量是引用变量则存的是引用值,占用的内存大小可以是固定的,也可以是动态扩展的,如果请求的栈的大小大于固定大小时,会抛出stackOverflowError,如果栈是可动态扩展的,当没有内存空间可扩展时,抛出outofMemoryError。里面采用栈的形式回收垃圾,所以是100百回收

java堆:线程共享的,存放数组和对象实例。堆结构可以分为新生代和老生代,新生代分为Eden、Survivor(from,to),刚创建的对象都是放在Eden区(有些大对象需特殊处理),经过GC一定的次数后,FROM,to 区会放到老生代,当然To去内存满也会放到老生代。新生代使用标志-复制算法回收垃圾。

方法区:线程共享,用于存放被虚拟机加载的类的元数据信息:如 常量、静态变量、编译器编译后的代码,也称为永久代。当虚拟机确定该类定义的信息不会被使用,也会被回收,回收条件:该类的所有实例被回收,同时装载该类的ClassLoader类也被回收。

本地方法区:用于管理本地方法,本地方法是用c写的

java代码通常占内存比较大,有时会降低系统性能,而像 C/C++ 它们的运行效率会高的多,当代码的执行
速度至关重要的时候,可以考虑使用本地代码。如果当前应用程序需要访问系统的各个特性和设备时。但使用会影响java可移植性。
 定义本地方法步骤:
 1 在一个类中定义一个本地方法,方法用native修饰,可以是静态方法或者非静态
 2 使用javac xx.java javah xx,生成头文件xx.h
 3 将函数原型写到源文件中
 4 将本地的 C 代码编译到一个动态装载库中,此步操作依赖于编译器。
 5 在定义本地方法的java类中添加一个对System.loadLibrary(xx)方法的调用,一般写在静态代码块中。
注意:静态库在链接的时候,就把需要的函数与可执行文件绑定。
      动态库只需要在运行的时候把需要的库与可执行文件绑定。

3 垃圾回收算法

标志-清除算法

根节点开始标记所有可达对象,其余没标记的即为垃圾对象,但回收后的空间是不连续的。

标志-复制算法

将内存分成两块,每次只使用其中一块,,gc开始的时候,对象只存在Eden与from区,to区是为空的,GC时,清除没有被标记的对象,将Eden区标记的对象(存活)拷贝到to中,from区存活的对象根据年龄次数来决定去向,达到要求的年龄就进入老生代,没达到就进入to区。然后把to中所有的对象复制到from区,(当to区内存满时就复制到老生代)。之后to为空。复制后的空间是连续的。复制算法适用于新生代,因为垃圾对象多于存活对象,复制算法更高效。在新生代串行垃圾回收算法中,将eden中标记存活的对象拷贝未使用的to中,from中的年轻对象也进入to,如果to空间已满,则进入老年代;这样交替使用from和to。这种改进的复制算法,既保证了空间的连续性,有避免了大量的内存空间浪费。

标记-压缩(整理)算法

适合用于老年代的算法(存活对象多于垃圾对象)。
标记后不复制,而是将存活对象压缩到内存的一端,(即修改指针指向)然后清理边界外的所有对象。内存是连续的。

4 什么是反射机制

5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值