Java 虚拟机

Posted 吼怠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 虚拟机相关的知识,希望对你有一定的参考价值。

# Java 虚拟机
 
## Java 虚拟机概述和基本概念
 
### 类加载子系统、方法区、Java堆、直接内存、Java栈、本地方法栈、垃圾回收系统、PC寄存器、执行引擎
 
+ 类加载子系统:负责从文件系统或者网络中加载 Class 信息,加载的信息存放在一块称之为方法区的内存空间。
+ 方法区:就是存放类信息,常量信息,常量池信息,包括字符串面量和数字常量等。
+ Java 堆:在 Java 虚拟机启动的时候建立 Java 堆,他是 Java 程序最主要的内存工作区域,几乎所有的对象实例都存放到 Java 堆中,堆空间是所有线程共享的。
+ 直接内存:Java 的 NIO 库允许 Java 程序使用直接内存,从而提高性能,通常直接内存速度会优于 Java 堆。读写频繁的场合可能会考虑使用。
+ 每一个虚拟机线程都会有一个私有的栈,一个线程的 Java 栈在线程创建的时候被创建,Java 栈中保存着局部变量、方法参数、同时 Java 的方法调用、返回值等。
+ 本地方法栈和 Java 栈非常类似,最大不同为本地方法栈用于本地方法调用。Java 虚拟机允许 Java 直接调用本地方法(通常使用 C 编写)。
+ 垃圾收集系统是 Java 的核心,也是必不可少的,Java有一套自己的垃圾清理机制,开发人员无需手工清理。
+ PC(Program Counter) 寄存器也是每个线程私有的空间,Java虚拟机会为每个线程创建 PC 寄存器,在任意时刻,一个 Java 线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC 寄存器就会执行当前正在被执行的指令,如果是本地方法,则 PC 寄存器值为 undefined,寄存器存放如当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等信息。
+ 虚拟机最核心的组件就是执行引擎,他负责执行虚拟机的字节码,一般会先进行编译成机器码后执行。
 
### 堆、栈、方法区的概念和联系
 
堆解决的是数据存储的问题,即数据怎么放,放在哪
 
栈解决程序的运行问题,及程序如何执行,或者说如何处理数据
 
方法区是辅助堆栈的快永久区(Perm),解决堆栈信息产生,是先决条件。
 
![mark](http://oumk5fhgp.bkt.clouddn.com/blog/170813/DcFE6FE48m.png?imageslim)
 
类信息存放在方法区,
 
### Java 堆
 
**Java 堆**是和 **Java 应用程序**关系最密切的内存空间,几乎所有的对象都存放在其中,并且 Java 堆完全是自动化管理的,通过垃圾回收机制,垃圾对象会自动清理,不需要显示的释放。
 
根据垃圾回收机制的不同,Java 堆可能拥有不同的结构,最为常见的就是将整个堆分为 **新生代** 和 **老年代**。其中新生代存放新生的对象或者年龄不大的对象,老年代则存放老年对象。
 
新生代分为 eden 区、s0 区、s1 区,s0 和 s1 也被称为 from 和 to 区域。他们是两块**大小相等**并且可以**互换的角色的空间**。
 
绝大多数的情况,对象**首先**分配在 **eden 区**,在一次新生代回收后,如果**对象还存活**,则会进入 **S0 区或者 S1 区**,之后没经过一个新生代回收,如果对象存活则它的年龄就加1,当对象达到一定的年龄后,则进入老年代。
 
![mark](http://oumk5fhgp.bkt.clouddn.com/blog/170813/m5kLdGdeIb.png?imageslim)
 
 
 
有很多垃圾收集器,GC。对于GC垃圾收集,对于新生代会频繁的进行垃圾收集,对于老年代也会经历回收,
 
### Java 栈
 
Java 栈是一块**线程私有**的**内存空间**,一个栈,一般由三部分组成,局部变量表、操作数栈、帧数据区。
 
**局部变量表**:用于报错函数的参数及局部变量
 
**操作数栈**:主要保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
 
**帧数据区**:除了局部变量表和操作数栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着访问常量池的指针,方便程序访问常量池。另外,当函数返回或者出现异常时,虚拟机必须有一个异常处理表,方便发送异常的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。
 
### Java 方法区
 
Java 方法区和堆一样,方法区是一块所有**线程共享**的**内存区域**,他保存系统的类信息,比如类的字段、方法、常量池等。方法区的大小决定了系统可以保存多少个类,如果系统定义太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误。方法区可以理解为永久区(Perm)。
 
 
 
 
 
 
 
通过根据垃圾收集的次数,来类比垃圾收集为新生代后台老年代
 
刚实例化、出事初始数据  eden
 
s1 和 s0 也被称为 from 和 to 区域,他们是两块大小相等并且可以相互转化角色的空间
 
 
 
## 堆、栈、方法区
 
## 虚拟机参数
 
## 垃圾回收

以上是关于Java 虚拟机的主要内容,如果未能解决你的问题,请参考以下文章

java虚拟机和java内存区域概述

java虚拟机工作原理图解

Java虚拟机--虚拟机字节码执行引擎

java虚拟机的原理

android -------- java虚拟机和Dalvik虚拟机

深入理解Java虚拟机:JVM高级特性与最佳实践的内容简介