Redian新闻
>
java gc之前有没有办法得到notification?
avatar
java gc之前有没有办法得到notification?# Java - 爪哇娇娃
x*n
1
麻烦问一下,本人正在申请EB1A/NIW绿卡,独立推荐信的有效时间是多久?谢谢!
avatar
p*y
2
爱情,原来是含笑饮毒酒
avatar
z*3
3
用编码实现
我找了半天,只找到一个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了
avatar
N*g
4
啥意思? 都打出来了, 还手写一遍。
avatar
z*3
5
要是能在pre gc的时候挂一个listener就好了
不过这样的话,jvm需要等这些listeners执行完毕才能执行
这个有可能造成leak
avatar
t*e
8
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都在这里面了

avatar
h*j
9
几年前的做法是用ReferenceQueue加个thread做polling来释放

【在 z*******3 的大作中提到】
: 用编码实现
: 我找了半天,只找到一个gc后的notification
: 能在gc后调用代码来做一些操作
: 其实我想在gc之前,就释放一些东西
: 然后gc时候就直接gc掉酱紫,不过现在这样也勉强能用
: 无非就是第一次gc之后,释放,然后等下一次gc再释放就是了
: 我想自己写一个vert.x的session manager
: 官方的那个要用到mongo,还没怎么用过,我很怀疑有没有人用过了
: 估计上网找也找不出什么名堂来,还是自己写方便一点
: 下面是我写的测试代码,idea都在这里面了

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。