#Javaの特徴
- オブジェクト指向
- Java仮想マシン
- ガベージコレクション
##オブジェクト指向はデータを中心に考える
- そもそも本質はデータをどう加工するか、何をしたいのかはデータが中心に考える
- オブジェクト指向ではプログラムの中で扱う対象をモノ(オブジェクト)で表現
- アプリを構成するものは全てオブジェクトによって表現され、その組み合わせによってアプリを構成する
- データとその操作をカプセル/一体化してコードをかく
- よくやりがちな失敗は他のオブジェクトのデータを参照するメソッドを書き、他のオブジェクトのメソッドが別のオブジェクトのデータを参照してしまう
- オブジェクト1のメソッドが意味がなくなる→データオブジェクトという(凝集性が悪い)
- オブジェクト1のデータを参照するのはオブジェクト1のメソッドでないといけない
- 基本的にはデータとメソッドは一体化しよう!
##Java仮想マシンはバイナリコード
###C++
- PCに電気が入りCPUが動く
- CPUはマシン語で動いてる
- アセンブラ記述(C/C++)→コンパイル→マシン語(バイナリコード)
- アセンブラでかくとダイレクトにマシン語になる
- バイナリコードのみがCPUを直接動かすことができる
###Java
- Java仮想マシンの上で動作
- CPUの上にJava仮想マシンを作る
- Java仮想マシンがCPUを直接動かせるバイナリコードである
- JDK、JREをインストールしないとJava仮想マシンが動かない
- Javaをコンパイルすると中間コードを吐き出す
- 中間コードはバイナリコードの上で動かす必要
- 中間コードを介するので直接CPUを動かすC++より遅い(と言われた)
- Javaなので遅いのではない
##ガベージコレクションはメモリを自動で解放してくれる
###CPU/メモリ(DRAM)/ストレージ(HDD/SSD)の構成
- CPU/DRAMは基盤上で足がくっついている
- データバス、アドレスバスでつながっている
- DRAMが保存できる容量は8byteとする
- アドレスバスは0-7までのどのアドレスにアクセスしたいか信号を出す
- データバスはその中身を出力
- CPU/メモリは1つの基盤の上に乗っている
- データバス、アドレスバスでつながっている
- これとは別に直でつながってる
- アドレスバスにI/OポートというIO空間を指定するポートがついてる
- I/OポートにHDD/SSDがつながっている
- CPUと直接つながってないのがストレージ(HDD/SSD)、直接つながっているのがDRAM
- CPUが持っているメモリは電源がついてないと消える、HDDは磁性体に書き込むので電気を切っても残る
- メモリチップの種類
###メモリの仕組み
- 例えばZ80の場合、
データバス8本+アドレスバス16本 (=CPUがアクセスしたい番地を示す)- 0000 0000 0000 0000 ~ 1111 1111 1111 1111 までアクセスできる
- 8bitCPUのZ80の場合、0~65535番地まである
- Java仮想マシンはOSにメモリを使う使わないを要求する
-
OSはメモリをブロックで管理する機能がある
- Java仮想マシンはOSに100byteのメモリを要求
- OSが管理している使ってない番地を仮想マシンに返す
- Javaはそのメモリを使うことができる
-
メモリリーク:
あるApplicationで仮想マシンが使うと指定して終わりを伝えず死ぬと100byte使ったままになってしまい、他の領域に使えない
- C/C++ではポインタを使いメモリアロケーターを使って割当、解放命令で解放してあげる
- Javaでは、提供するメモリはJDKのJavaマシン管理下
-
hoge = null;
と書くかJava仮想マシン終了で自動でガベージコレクションがメモリを解放してくれる