由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Java版 - java gc之前有没有办法得到notification?
相关主题
问个Object.hashCode()的问题Java练习题 10
输入中文导致的死 机static final的问题
eclipse 怪问题override/overload/overwrite in Java
急问如何append double 数据到txt文件basic java question
JMX question , help pleasequestion: how to implement this
为啥画不出来?a synchonized problem!
Skylinestatic getInstance()
请问一个serialize class object下载运行的问题我脑袋短路,大家来帮一下:
相关话题的讨论汇总
话题: import话题: handback话题: gc话题: public
进入Java版参与讨论
1 (共1页)
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都在这里面了

1 (共1页)
进入Java版参与讨论
相关主题
我脑袋短路,大家来帮一下:JMX question , help please
thread safe Singleton 的几种方法?为啥画不出来?
看到一个关于singleton的面试题Skyline
面试的一些题目请问一个serialize class object下载运行的问题
问个Object.hashCode()的问题Java练习题 10
输入中文导致的死 机static final的问题
eclipse 怪问题override/overload/overwrite in Java
急问如何append double 数据到txt文件basic java question
相关话题的讨论汇总
话题: import话题: handback话题: gc话题: public