3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Java】Javaの3つの特徴

Posted at

#Javaの特徴

  • オブジェクト指向
  • Java仮想マシン
  • ガベージコレクション

##オブジェクト指向はデータを中心に考える

  • そもそも本質はデータをどう加工するか、何をしたいのかはデータが中心に考える
  • オブジェクト指向ではプログラムの中で扱う対象をモノ(オブジェクト)で表現
  • アプリを構成するものは全てオブジェクトによって表現され、その組み合わせによってアプリを構成する
  • データとその操作をカプセル/一体化してコードをかく
  • よくやりがちな失敗は他のオブジェクトのデータを参照するメソッドを書き、他のオブジェクトのメソッドが別のオブジェクトのデータを参照してしまう
  • オブジェクト1のメソッドが意味がなくなる→データオブジェクトという(凝集性が悪い)
  • オブジェクト1のデータを参照するのはオブジェクト1のメソッドでないといけない
  • 基本的にはデータとメソッドは一体化しよう!

1.png

##Java仮想マシンはバイナリコード

  • JavaはJava仮想マシンの上で動作
  • JavaはC++ の改良版である(とも言える)が実行するときは全く違う構成になっている
    2.png

###C++

  • PCに電気が入りCPUが動く
  • CPUはマシン語で動いてる
  • アセンブラ記述(C/C++)→コンパイル→マシン語(バイナリコード)
  • アセンブラでかくとダイレクトにマシン語になる
  • バイナリコードのみがCPUを直接動かすことができる

###Java

  • Java仮想マシンの上で動作
  • CPUの上にJava仮想マシンを作る
  • Java仮想マシンがCPUを直接動かせるバイナリコードである
    • JDK、JREをインストールしないとJava仮想マシンが動かない
  • Javaをコンパイルすると中間コードを吐き出す
    • 中間コードはバイナリコードの上で動かす必要
  • 中間コードを介するので直接CPUを動かすC++より遅い(と言われた)
  • Javaなので遅いのではない

3.png

##ガベージコレクションはメモリを自動で解放してくれる

###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は磁性体に書き込むので電気を切っても残る
  • メモリチップの種類
    • DRAM:DDR4規格など(CPUアクセスやレイテンシを決める規格)
    • SRAM:高速(今はあまり使わない)
    • フラッシュメモリ:外部メモリとして使う(SSDなど)
      4.png

###メモリの仕組み

  • 例えば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仮想マシン終了で自動でガベージコレクションがメモリを解放してくれる

5.png

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?