特征:
当 GC 根据JVM 内存的情况来回收,JVM发现内存不够的时候就会回收
释放空间的条件: JVM 发现内存不够。
在Android的Handler 和Bitmap 使用的时候 在Activity的生命周期中不会被释放 , 成为指针指向是一个空 , 内存实际没有被释放的
特征:
只要系统进行了GC,无论内存是否足够,都会被回收。
get()的时候是空null的值
存储的使用, 用的时候是空的null
package com.songli.ref;
import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
/**
> Author: songli
> QQ: 2734030745
> Mail: [email protected]
> CSDN: http://my.csdn.net/Poisx
> github: https://github.com/chensongpoixs
*/
public class RefSongli {
public static class Bean {
String name;
Integer va;
public Bean(String name, Integer value) {
this.name = name;
this.va = value;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name +": " + va;
}
}
public static void main(String[] args) {
//强引用
Bean bean = new Bean("songli", 67);
Bean[] referent = new Bean[20000];
for (int i=0;inew Bean("mybean:" + i,100);// 抛 Exception
}
System.out.println(referent[1000].toString());
//软引用
Reference[] referent = new SoftReference[20000];
for (int i=0;inew SoftReference(new Bean("mybean:" + i,100));
}
System.out.println("finish");
System.out.println(referent[499].get() + " " +
referent[10000].get() + " " +
referent[19999].get());// “null”
////
Object object = new Object();
WeakReference
总结java中引用
// 定义方式多样:FindClass,NewObject,GetObjectClass,NewCharArray…. NewLocalRef()
//释放方式: 1 方法调用完JVM 会自动释放 2.DeleteLocalRef
// 不能在多线程里面使用
JNIEXPORT void JNICALL Java_com_localRef
(JNIEnv * env, jobject jobj) {
int i = 0;
for (i = 0; i < 5; i++)
{
jclass cls = (*env)->FindClass(env, "java/util/Date");
jmethodID jmid = (*env)->GetMethodID(env, cls, "" , "()V");
//创建一个Date类型的局部引用
jobject obj = (*env)->NewObject(env, cls, jmid);
//使用这个引用
//释放引用
(*env)->DeleteLocalRef(env, cls);
(*env)->DeleteLocalRef(env, obj);
}
}
//跨线程,跨方法使用
// NewGlobalRef 是创建全局引用的唯一方法
jstring global_str;
JNIEXPORT void JNICALL Java_com_createGlobalRef
(JNIEnv * env, jobject jobj) {
jobject obj = (*env)->NewStringUTF(env, "JNI is intersting");
global_str = (*env)->NewGlobalRef(env, obj);
}
JNIEXPORT jstring JNICALL Java_com_getGlobalRef
(JNIEnv * env, jobject jobj) {
return global_str;
}
JNIEXPORT void JNICALL Java_com_delGlobalRef
(JNIEnv * env, jobject jobj) {
(*env)->DeleteGlobalRef(env, global_str);
}
//它不会阻止GC,/跨线程,跨方法使用
jclass g_weak_cls;
JNIEXPORT jstring JNICALL Java_com_createWeakRef
(JNIEnv * env, jobject jobj) {
jclass cls_string = (*env)->FindClass(env, "java/lang/String");
g_weak_cls = (*env)->NewWeakGlobalRef(env, cls_string);
return g_weak_cls;
}
//JNI 异常处理
JNIEXPORT void JNICALL Java_com_exception
(JNIEnv * env, jobject jobj) {
jclass cls = (*env)->GetObjectClass(env, jobj);
jfieldID fid = (*env)->GetFieldID(env, cls, "key", "Ljava/lang/String;");
//检查是否发送异常
jthrowable ex = (*env)->ExceptionOccurred(env);
// 判断异常是否发送
if (ex != NULL) {
jclass newExc;
//清空JNI 产生的异常
(*env)->ExceptionClear(env);
//IllegalArgumentException
newExc = (*env)->FindClass(env, "java/lang/IllegalArgumentException");
if (newExc == NULL)
{
printf("exception\n");
return;
}
//JNI 异常获取
(*env)->ThrowNew(env, newExc, "Throw exception from JNI: GetFieldID faild ");
}
}
static 在C语言中有一个静态区