赞
踩
如果是基本数据类型,看他是局部变量还是成员变量,局部变量在栈上开辟空间,成员变量在堆区开辟空间。
如果是引用数据类型,JVM在堆中创建对象,对象的引用存在虚拟机栈上的局部变量表中。
里面放的都是类对象
Java 虚拟机栈的作用:Java 虚拟机栈的生命周期和线程相同,Java 虚拟机栈是用来描述 Java 方法执行的
内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数
栈、动态链接、方法出口等信息。咱们常说的堆内存、栈内存中,栈内存指的就是虚拟机栈。
本地方法(native method)指的是JVM内部的方法(C++写的)
.java代码 =》.class(二进制字节码,里面就是一些指令) =》放到内存中 =》每条指令都有自己的地址=》 CPU执行指令就要从内存中取除地址,然后再在CPU上执行
类加载就是从加载到初始化这个过程
1.加载:通过全限定名称找到这个类的二进制字节流,在内存中生成一个代表这个类的Java.long.Class对象作为这个类的各种访问数据的入口
2.链接
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,如果父类中找不到这个类,就交给子类加载器完成。
1.避免重复加载类,这样一套机制的目的就是创造一个优先级顺序
2.保证Java核心API的安全性,因为有些类是用户自己写的,不能保证他的安全性
给对象增加一个引用计数器,每当有一个地方引用他的时候,计数器自增;当引用失效的时候计数器自减,当计数器为0的时候我们就认为这个对象不能再被使用了,判断他“死亡”。
优点:规则简单,实现方便,判定高效。
缺点:如果对象很多,但是引用少的情况加一个int型的计数器会导致得不偿失,内存压力大。他就适合对象少,引用多的情况。
还有一个致命的缺点,循环引用可能导致计数器失效。
通过一系列我们称之为GCRoost 的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称之为"引用链",当一个对象和引用链没有任何相连的时候,我们就可以说这个对象是不可用的。
GCRoots对象可以包含以下几种:
四种引用情况:
首先标记所有要回收的对象,然后再进行统一回收。
缺点:
它将可用内存按照大小划分为相等的两块,每次只用其中的一块,在标记完清除的对象后,就把这片区域还存活的对象复制到另外一边内存上去,然后回收的时候把当前内存整体回收。
优点:解决了内存碎片化的问题
缺点:每次只有一半内存可用,当回收的对象少的时候这种办法显然不合适,他适合对象被快速回收,并且对象不多需要的内存不大。
复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。
为了解决这个问题,我们对需要清除的对象先标记,再清除,然后让所有存活的对象向一端移动。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。