z*******3 发帖数: 13709 | 1 用编码实现
我找了半天,只找到一个gc后的notification
能在gc后调用代码来做一些操作
其实我想在gc之前,就释放一些东西
然后gc时候就直接gc掉酱紫,不过现在这样也勉强能用
无非就是第一次gc之后,释放,然后等下一次gc再释放就是了
我想自己写一个vert.x的session manager
官方的那个要用到mongo,还没怎么用过,我很怀疑有没有人用过了
估计上网找也找不出什么名堂来,还是自己写方便一点
下面是我写的测试代码,idea都在这里面了
要求java 7u4以上版本,否则拿不到GarbageCollectionNotificationInfo这个类
无法编译
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.List;
import javax.management.Notification;
import javax.management.NotificationEmitter;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.openmbean.CompositeData;
import com.sun.management.GarbageCollectionNotificationInfo;
import twitter4j.GeoLocation;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.Query.Unit;
import twitter4j.auth.RequestToken;
import twitter4j.conf.ConfigurationBuilder;
public class Test {
class UserThread extends Thread {
public void run() {
final List gcmxb =
ManagementFactory.getGarbageCollectorMXBeans();
for(GarbageCollectorMXBean ob: gcmxb){
NotificationEmitter emitter = (NotificationEmitter) ob;
NotificationListener listener = new
NotificationListener() {
@Override
public void handleNotification(
Notification notification, Object handback) {
// TODO Auto-generated method stub
GarbageCollectionNotificationInfo info =
GarbageCollectionNotificationInfo.from(
(CompositeData) notification.getUserData());
System.out.println(info.getGcAction().substring(
7));
HandBack hb = (HandBack)handback;
System.out.println(hb.handUsage());
}
};
emitter.addNotificationListener(listener, new
NotificationFilter() {
private static final long serialVersionUID =
3763793138186359389L;
@Override
public boolean isNotificationEnabled(Notification
notification) {
//filter GC notification
return notification.getType()
.equals(
GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION);
}
}, HandBack.getInstance());
}
while(true){
try {
System.gc();
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private static class HandBack {
private HandBack() {
}
private static HandBack instance = new HandBack();
public static HandBack getInstance() {
return instance;
}
public String handUsage() {
return "hand back";
}
}
public static void main(String[] a){
Thread th= new Test().new UserThread();
th.start();
}
}
运行后输出:
minor GC
hand back
major GC
hand back
每次gc大概有一个major gc和一个minor gc
因为都是我自己调的,如果是实际运行环境
那估计就是一个major和n次minor了 |
z*******3 发帖数: 13709 | 2 要是能在pre gc的时候挂一个listener就好了
不过这样的话,jvm需要等这些listeners执行完毕才能执行
这个有可能造成leak |
k******n 发帖数: 451 | |
z*******3 发帖数: 13709 | 4 问题是我不知道哪些objects会被gc
我只知道我需要释放哪些引用
除了这些引用之外,我不知道其他哪些objects会被gc掉
触发点无法确定
【在 k******n 的大作中提到】 : finalize? : http://stackoverflow.com/questions/2506488/when-is-the-finalize
|
t*********e 发帖数: 630 | 5 This might be helpful:
MemoryPoolMXBean
http://stackoverflow.com/questions/2057792/garbage-collection-n
【在 z*******3 的大作中提到】 : 用编码实现 : 我找了半天,只找到一个gc后的notification : 能在gc后调用代码来做一些操作 : 其实我想在gc之前,就释放一些东西 : 然后gc时候就直接gc掉酱紫,不过现在这样也勉强能用 : 无非就是第一次gc之后,释放,然后等下一次gc再释放就是了 : 我想自己写一个vert.x的session manager : 官方的那个要用到mongo,还没怎么用过,我很怀疑有没有人用过了 : 估计上网找也找不出什么名堂来,还是自己写方便一点 : 下面是我写的测试代码,idea都在这里面了
|
h**j 发帖数: 2033 | 6 几年前的做法是用ReferenceQueue加个thread做polling来释放
【在 z*******3 的大作中提到】 : 用编码实现 : 我找了半天,只找到一个gc后的notification : 能在gc后调用代码来做一些操作 : 其实我想在gc之前,就释放一些东西 : 然后gc时候就直接gc掉酱紫,不过现在这样也勉强能用 : 无非就是第一次gc之后,释放,然后等下一次gc再释放就是了 : 我想自己写一个vert.x的session manager : 官方的那个要用到mongo,还没怎么用过,我很怀疑有没有人用过了 : 估计上网找也找不出什么名堂来,还是自己写方便一点 : 下面是我写的测试代码,idea都在这里面了
|