ブラウザのJavaを無効にする方法
1. 最新版のJavaに更新する
2. Javaコントロールパネルを開く
(Win7の場合、コントロールパネル→プログラム→Java )
3. 「セキュリティ」タブを開き、「ブラウザでJavaコンテンツを有効にする」のチェックをはずす
4.以下にアクセスして、たしかに無効になっていることを確認
http://java.com/ja/download/testjava.jsp
ブラウザごとに設定しなくても、Java7u10以降は、Javaコントロールパネルでオフにすれば、無効にできる。
IEの場合、ブラウザの設定でJavaをオフにしても(レジストリをいじったりしないと)ちゃんとオフにならならなくて、困ったもんだったのが、Javaコンパネ側で設定できるようになってよかった。
参考
Java 7 Update 10 からブラウザ上の Java の実行を簡単に無効にできるようになった
http://fnya.cocolog-nifty.com/blog/2012/12/java-7-update-1.html
米政府がJavaの無効を推奨とかで、
世間ではいらないJavaなんてOSからアンインストールしちゃえ、とか言われてるけど、やめてあげて・・・
Javaは悪くないの。ブラウザ上で動くJavaプラグイン(Javaアプレット)が危険なの。
Javaを作ってるOracleという会社が、定期アップデート以外ではめったに、緊急セキュリティーアップデートしなくて、定期アップデートの間隙をついて悪い人たちが、悪いウェブサイトにトラップを仕掛けるのが流行ってるの。
しかしJavaのアップデートって何か毎回、ダイアログがでてインストールとかおさないといけないし、何か重いつーか、自動的感がなくて評判悪いよなー。Flashの更新とは言わないまでも、Windowsの更新ぐらい軽い?感じにできないものだろうか・・・
MySQLの Abandoned connection cleanup thread
TomcatのWebアプリでMySQLに接続した後、Tomcatの終了やWebアプリのリロードなどをするとTomcatのログに以下のようなエラーが表示される。
9 18, 2012 12:29:13 午後 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/xxxxx] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.
デプロイの激しい運用に使うんでもなし無視してもいいかなーって気もしたけど、
SEVERE とまで言われると、ちょっとほっておくのもよくないかということで調べてみた。
利用したバージョンは以下
Tomcat 7.0.30
MySQL Connecter/J 5.1.22
バグレポート
レポートが上がってた
Bug #65909 referenceThread causes memory leak in Tomcat
http://bugs.mysql.com/bug.php?id=65909
目下議論中の模様
たぶんこんな感じ
NonRegisteringDriverでスレッド作りっぱなしなんだけど
↓
referenceThread.setContextClassLoader(null) してくれたら、Tomcat側でエラーでないよ
↓
いやいや、警告は出ないけど、スレッドが残っててメモリリークになるんじゃ (今ココ)
しばらくしたら、何がしかの解決にいたると思うけど、
仕様的にどこで対処すべき問題だとか、おらー何だかよくわからないので、
中の人がうまいこと決着してくれるのを待つことにします
以下補足メモ
JDBCクライアント側 NonRegisteringDriver
Tomcatに文句を言われているMySQLのJDBCクライアントのコードは以下
com.mysql.jdbc.Driverの親クラスの
com.mysql.jdbc.NonRegisteringDriverのstaticイニシャライザ
static {
Thread referenceThread = new Thread("Abandoned connection cleanup thread") {
public void run() {
while (true) {
try {
Reference ref = refQueue.remove();
try {
((ConnectionPhantomReference) ref).cleanup();
} finally {
connectionPhantomRefs.remove(ref);
}
} catch (Exception ex) {
// no where to really log this if we're static
}
}
}
};
referenceThread.setDaemon(true);
referenceThread.start();
}
Class.forNameでロードしたときに呼ばれるコードなので、DBに接続しなくても再現可能
1年前のバージョンのConnector/J(5.1.16)のNonRegisteringDriverには、この処理はなかった
Tomcat側 clearReferencesThreads
Tomcatでエラーを出力してるコードは
org.apache.catalina.loader.WebappClassLoader クラスの
#clearReferences メソッドから呼ばれる
#clearReferencesThreads メソッドの中の以下の部分
@SuppressWarnings("deprecation") // thread.stop()
private void clearReferencesThreads() {
Thread[] threads = getThreads();// Iterate over the set of threads
for (Thread thread : threads) {
if (thread != null) {
ClassLoader ccl = thread.getContextClassLoader();
if (ccl == this) {
// Don't warn about this thread
if (thread == Thread.currentThread()) {
continue;
}// JVM controlled threads
ThreadGroup tg = thread.getThreadGroup();
if (tg != null &&
JVM_THREAD_GROUP_NAMES.contains(tg.getName())) {// HttpClient keep-alive threads
if (clearReferencesHttpClientKeepAliveThread &&
thread.getName().equals("Keep-Alive-Timer")) {
thread.setContextClassLoader(parent);
log.debug(sm.getString(
"webappClassLoader.checkThreadsHttpClient"));
}// Don't warn about remaining JVM controlled threads
continue;
}// Skip threads that have already died
if (!thread.isAlive()) {
continue;
}// TimerThread can be stopped safely so treat separately
// "java.util.TimerThread" in Sun/Oracle JDK
// "java.util.Timer$TimerImpl" in Apache Harmony and in IBM JDK
if (thread.getClass().getName().startsWith("java.util.Timer") &&
clearReferencesStopTimerThreads) {
clearReferencesStopTimerThread(thread);
continue;
}if (isRequestThread(thread)) {
log.error(sm.getString("webappClassLoader.warnRequestThread",
contextName, thread.getName()));
} else {
log.error(sm.getString("webappClassLoader.warnThread",//※←(1)
contextName, thread.getName()));
}
// Don't try an stop the threads unless explicitly
// configured to do so
if (!clearReferencesStopThreads) {//※←(2)
continue;
}// If the thread has been started via an executor, try
// shutting down the executor
try {//...
※(1) 該当のエラーを出力している箇所
ぐぐったら日本語の解説あった。
技術者が知っておきたいTomcat 7の新機能20連発
http://www.atmarkit.co.jp/fjava/rensai4/tomcat7_03/02.html
の「実行中スレッドの停止」の「リクエスト処理スレッド以外のスレッドが実行中の場合」にあたる処理
※(2) context.xmlで
この後のコードでスレッドをstopに行くが、メッセージの後なので、結局のところSEVEREな警告は出ると思われる
EclipseのデバッグでJNIエラー
Eclipseでデバッグしてたら抜けるときに変なエラーが出る
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:838]
Java6でもJava7でも発生
超単純なHello Worldみたいなので発生
8割方発生するがたまーに出ない
Eclipse使わずにコマンドラインでjdbだと発生しない
ぐぐったらコンパイル環境と実行環境が違う場合に出るとか
とりあえずSystem.exit(0)にすれば出ないとか(そんなご無体な…)とか書いてたけど…
というかVirtualBox上のWindows7上で実行したんだけど、環境壊れて一からインストールしたらエラーが出はじめた
それで、ふと設定でCPUを1から2に増やしたら出なくなった
ホスト側PCでハイパースレッディングオフにして6コア6スレッドにしてるのも何か影響してるのだろうか
(あとメモリも増やした)
さっぱり謎だし忘れることにします
もし同じ事態になったら面倒なので一応メモ
Eclipse4.2でJD-Eclipseでデコンパイルできない
File Associationsで ".class without source" のエディターが初期設定だと "Class File Viewer"なんだけど、"Class File Editor"を追加してデフォルトにすると実行されるようだ。
3.7(.0)のときはそんな関連付けいじらなくても動いてた気がしたけど
参考
http://d.hatena.ne.jp/terazzo/20101230/1293707864
https://plus.google.com/104469447717794601049/posts/6gikMpgQLDH
[追記]
関連付け設定すればOKかと思ったけど、
ソース添付JARとそうでないJARがある場合、ソース添付してたらソースを開いて、でなければデコンパイルってのがうまく動かない。本家(Emmanuel Dupuy氏)をフォークした(Alex Kosinsky氏)のをフォークした(Mchr氏)バージョンがうまく動いてるようなので、こっちがよさそう。
Mchr3k - JDEclipse-Realign
http://mchr3k.github.com/jdeclipse-realign/
http://mchr3k-coding.blogspot.co.uk/2012/08/jd-eclipse-realign-source-lifetime.html
JD-Eclipseの更新サイト消えてる
久々にJD-Eclipseをインストールしようと思ったら更新サイトが落ちてる というか消えてる?
代替のサイトを探し中のようだけど、とりあえず、JD-Eclipse自体は1.0.3から変わってないから、お急ぎの方はInternetarchiveからZIPをローカルに落として、更新サイトでZIPを指定してインストールすればいいらしい
もともとの更新サイト(消えてる)
http://java.decompiler.free.fr/?q=jdeclipse
更新サイトのアーカイブ
http://web.archive.org/web/20110720221237/http://java.decompiler.free.fr/jd-eclipse/update/jdeclipse_update_site.zip
参考
https://twitter.com/EmmanuelDupuy/status/218575349531951105
http://stackoverflow.com/questions/11218792/cant-access-jd-eclipse-site-http-java-decompiler-free-fr-q-jdeclipse
Eclipse上でANTのjunitreportタスクを実行すると失敗する
こんなの出るんだけど、
[junitreport] : Error! staticでないJava関数'replace'の最初の引数は無効なオブジェクト参照です。 [junitreport] : Error! データ型'void'を'reference'に変換できません。 [junitreport] : Fatal Error! スタイルシートをコンパイルできませんでした
ぐぐったら、バグだそうです
Bug 384757 - Ant build fails in junitreport using Java 6u32 or later
https://bugs.eclipse.org/bugs/show_bug.cgi?id=384757
Bug 51668 -
https://issues.apache.org/bugzilla/show_bug.cgi?id=51668
とりあえず、スタンドアロンのAntでコマンドラインからだと普通に動いたし、深く考えないことにする。
あと、targetの外にjunitreportタスクを書いて実行したらなぜか動いた。