Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

java

newするとJVM内で何が起こるのかという話(前編)

私的まとめ。2段階に分かれており、今回はその初回。 JVM内の挙動を知るにはJVMに渡されるバイトコードを知ることからと考え、これについてまとめる。 バイトコードの確認 例えば public class Test { public static void main(String[] args) { Test test =…

ほんとに怖いfinalize

import java.util.concurrent.TimeUnit; public class Laputa { public static void main(String[] args) { new Laputa(); while (true) { try { System.gc(); System.runFinalization(); TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException …

ASMで実行時にメソッド定義を書き換える

今さらながらJavaクラスに対する動的なweavingを試してみました。DIコンテナやフレームワークに任せることが一般的になった領域であり技術が直接役に立つことはないでしょうが、JVMやクラスファイルに対する理解を深めるきっかけにもなると考えたためです。 …

Googleカレンダーで給料日を調べる

自作TwitterBotに給料日判定ロジックを組み込むべく、GoogleカレンダーのAPIを利用するコードを書きました。APIのご利用は利用規約に従って計画的に。 1.jarを入手する gdata-java-clientから最新のjarを入手。ビルドパスに追加。 2.ユーティリティを書く 簡…

GoogleのJava基礎ライブラリguava librariesというものがあるらしい

Google Collections Libraryを使おうと思ってGoogle Codeにアクセスしたら、開発が継続されていないことに気づきました。どうやらGuavaというプロダクトにマージされたようです。 This project has evolved into Guava! http://code.google.com/p/google-col…

Twitter4Jで非推奨メソッドを使わずにOAuthログイン

今月からBasic認証が廃止されたことを受け、Twitter4Jで作ったツールをOAuth利用版に書き換えていらっしゃる方も多いのではないでしょうか。 公式サイトにもコード例が載っていますが、残念ながら非推奨メソッドTwitter.setOAuthAccessToken(AccessToken)を…

とりあえず知っておきたいMapの鉄則と周辺知識

わりと多種類で使い方に迷うJavaの連想配列(Map)について、各実装の紹介と周辺知識をまとめました。Javaに触れる際の参考になれば。 鉄則その1「とりあえずHashMap」 Mapインタフェースの実装はたくさんありますが、まずはHashMapから使うことを勧めます。…

Javaプログラムをプロファイルするためのチートシートを作成しました

jps, jstack, jmap, jstackといったJDK6に付属するツール群の使い方をA4用紙1枚にまとめたものです。 Java Profiling Cheat Sheet スレッドダンプとヒープダンプだけでも使えるようになると、Javaプログラムの理解と問題判別にずいぶん役に立つと思います。…

DeflaterOutputStreamの内部実装とBufferedOutputStreamと組み合わせる際の注意点

前回の実験で、DeflaterOutputStreamとBufferedOutputStreamの組み合わせ方によってパフォーマンスが大きく異なることがわかりました。今回はこの遅延の原因がDeflaterOutputStreamの実装に起因することを確認し、なぜBufferedOutputStreamでデコレートすべ…

出力を高速化するBufferedOutputStreamとDeflaterOutputStream

Javaで入出力のコードを書く場合、必ずと行ってもいいほどBufferedOutputStream, BufferedInputStream, BufferedWriter, BufferedReaderのいずれかを使うのではないでしょうか。これらはJavaヒープ上にデータを蓄積*1し、I/Oの回数を削減する機能を担うもの…

LinkedHashMapを応用した、意外と便利なLRUCacheの実装

※この記事の内容は古いです。実用されるならこちらの記事も参照ください。 アプリケーションのパフォーマンス向上にキャッシュが有効なケースがあります。 memcachedをはじめとした分散型キャッシュのAPIやJava標準(候補)のJCacheを利用しても良いのですが…

TLを読み込んでRTの件数を数える

twitter4jを使ってTLを読み込み、RT(もしくはQT)の件数を数えるプログラム。TLに表れるPOSTがRTまたはQTである確率分布を求めるために作成しました。 twitter4jのStatusクラスにもisRetweetメソッドが用意されていますが、判定条件がわからないことと明ら…

非staticな内部クラスが持つ暗黙的な参照

Effective Java 第2版 (The Java Series)の項目22で言及されているように、原則として内部クラスはstaticにすることが推奨されます。主な理由は、staticでない内部クラスが暗黙的にエンクロージングクラス(トップレベルクラス)のインスタンスを参照するた…

Listを直接変更してもIteratorがConcurrentModificationExceptionをスローしない件

容量拡張コストの低いArrayListの実装中に見つけた、AbstractListが持つ既知の不具合についてまとめておきます。 不具合概要 ArrayListなどの同期化されないListの実装に対してIterator利用中に要素を変更すると、ConcurrentModificationExceptionをスローす…

同期化のパフォーマンス計測

シルバーウィークのまとまった時間を利用して、同期化のパフォーマンスについて調査。どのように遅いのか・なぜ遅いのかを追いましたが、詳細な内部実装はJVM仮想マシン仕様書にも記載されておらず「なぜ」まではわかりませんでした。 中途半端な内容になり…

Twitter4JとRで最近Tweetしたユーザーを調べる

Rのキャッチアップのために「直近の100Tweetsを投稿したユーザーを調べる」プログラムを作成しました。最初は「自身の投稿を曜日を横軸・時間を縦軸にプロットする」プログラムを組もうと思ったのですが、Twitter APIを利用するためのJavaライブラリ(Twitte…

Java6のFileInputStream#close()はいつIOExceptionを投げる?

Javaにおける例外の扱い方*1に関して考える上で必要になったため調べたものの、さほど有用な情報は得られませんでした。JDK6のソースコードも読みましたが結局はnativeメソッドに行き着くのであまり効果なし、残念です。現時点では以下の状況下で発生すると…