感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

【プログラミング 45時間目】結城浩さんのJavaプログラミングレッスンを使って、Javaの基礎の振り返り。

<スポンサーリンク>

ある程度理解が進んだと思っていましたが、ここで一旦基礎の振り返りをかねて、結城浩さんのプログラミングレッスンを読んで、もう一度基礎固めをしたいと思います。

僕はバスケットボールをやっていたのですが、やっぱりどんなときも、定期的に基礎を振り返り、基礎に戻ることがすごく大切だと思っています。


■URL先からHTMLを読み込み、表示するサンプル

package yuki.reigai;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 指定したURLのHTMLを読み込んで表示する。
 */
public class DisplayURL {
	private static String searchUrl = "http://google.com";
	public static void main(String[] args) {
		try {
			URL url = new URL(searchUrl);
			BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
			while(true) {
				String line = reader.readLine();
				//1行ずつ読み込んで、読み込む行がなくなったらwhileから抜ける
				if (line == null) {
					break;
				}
				System.out.println(line);
			}
			reader.close();
		} catch (MalformedURLException e) {
			System.out.println("URLの形式が誤っています:" + e);
		} catch (IOException e) {
			System.out.println("I/Oエラーです:" + e);
		}
	}
}

●結果●
省略

■インターフェースとは
・インターフェースが持つフィールドは必ず定数
・インターフェースが持つメソッドは必ず抽象メソッド
・インターフェースはインスタンスを作ることができない

implementsで同じインターフェースを実装させることによって、「共通のメソッドを持っている」ことをプログラムで記述することができる。

■ガーベージコレクションって何?
・使っていないインスタンスとは、「誰も参照していないインスタンス」のことである。

Hoge foo = new Hoge();

と書くと、Hogeクラスのインスタンスが1個作られる。
この「foo」変数が保持しているものは何かというと、Hogeクラスのインスタンスの場所を指す情報(アドレス)を持っている(★超重要)
C言語でいうポインタみたいなもので、「objはインスタンスを参照している」という。

インスタンスそのものが確保されているメモリ領域のことを「ヒープ」という。

さらに。

thisとは→「現在のインスタンスへの参照」
nullとは→「何もインスタンスを参照していないことを表す」

誰からも参照されていないインスタンスは、誰からも使用される事はない。
そのインスタンスはゴミになった、ということである。
ガーベッジ=ゴミである。

Javaのメモリの管理に関するメソッドを使ってみる

package yuki;

/**
 * Javaのメモリ処理に関するメソッドを使ってみます
 */
public class MemoryTest {
	public static void main(String[] args) {
		//利用可能なメモリの大きさを取得する
		long freeMemory = Runtime.getRuntime().freeMemory();
		System.out.println("フリーメモリ:" + freeMemory);
		
		//全メモリの大きさを取得する
		long totalMemory = Runtime.getRuntime().totalMemory();
		System.out.println("全メモリ:" + totalMemory);
		
		//最大メモリの大きさを取得する
		long maxMemory = Runtime.getRuntime().maxMemory();
		System.out.println("最大メモリ:" + maxMemory);
		
		//ガーベッジコレクタを発動させる
		Runtime.getRuntime().gc();
		System.gc();
		
		//無駄なインスタンスを発動させまくる
		for(int i = 0; true; i++) {
			String hoge = new String("fugafugafugafuga");
			System.out.println("["+ i +"]残りのメモリ = " + Runtime.getRuntime().freeMemory());
			
			if (i == 150000) {
				System.out.println("ガーベッジコレクションを発動します");
				System.out.println("ガーベッジコレクション発動前のメモリ:"+ Runtime.getRuntime().freeMemory());
				Runtime.getRuntime().gc();
				System.out.println("ガーベッジコレクション発動後のメモリ:"+ Runtime.getRuntime().freeMemory());
				System.out.println("ループを抜けます");
				break;
			}
		}
	}
}

●結果●

[149999]残りのメモリ = 12514416
[150000]残りのメモリ = 12514416
ガーベッジコレクションを発動します
ガーベッジコレクション発動前のメモリ:12514416
ガーベッジコレクション発動後のメモリ:16066160
ループを抜けます

結果を見ればわかるように、ガーベッジコレクション発動後にフリーメモリが増えていることがわかります。