JVM

一、Java 虚拟机的概念

所谓虚拟机,就是一台虚拟的机器,它是一款软件,用来执行一系列虚拟计算机指令。大体上虚拟机可以分为系统虚拟机和程序虚拟机。Virtual Box、VMWare 就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是 Java 虚拟机,它专门为执行单个计算机程序而设计,在 Java 虚拟机中执行的指令我们称为 Java 字节码指令。

二、Java 虚拟机的结构

  1. 类加载子系统
    负责从文件系统或者网络中加载 Class 信息,加载的信息存放在一块称之为方法区的内存空间。

  2. 方法区
    存放类信息、常量信息、常量池信息,包括字符串字面量和数字常量等。

  3. Java 堆
    在 Java 虚拟机启动的时候建立 Java 堆,它是 Java 程序最主要的内存工作区域,几乎所有的对象实例都存放到 Java 堆中,堆空间是所有线程共享。

  4. 直接内存
    Java 的 NIO 库允许 Java 程序使用直接内存,从而提高性能,通常直接内存的速度会优于 Java 堆,读写频繁的场合可能会考虑使用。

  5. Java 栈
    每个虚拟机线程都有一个私有的栈,一个线程的 Java 栈在线程创建的时候被创建,Java 栈中保存着局部变量,方法参数,方法调用、返回值等。

  6. 本地方法栈
    本地方法栈与 Java 栈非常类似,最大不同是,本地方法栈用于本地方法调用,Java 虚拟机运行 Java 直接调用本地方法(通常使用 C 编写)。

  7. 垃圾收集系统

  8. PC(Program Counter) 寄存器
    PC 寄存器也是每个线程私有的空间,Java 虚拟机会为每个线程创建 PC 寄存器。在任意时刻,一个 Java 线程总在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC 寄存器就会执行当前正在被执行的指令;如果是本地方法,则 PC 寄存器值为 undefined。寄存器存放如当前执行环境指针,程序计数器,操作栈指针,计算的变量指针等信息。

  9. 执行引擎
    虚拟机最核心的组件就是执行引擎了,它负责执行虚拟机的字节码。

堆、栈、方法区的区别与联系:
堆解决的是数据存储的问题,即数据怎么放,放在哪儿。
栈解决的是程序运行的问题,即程序如何运行,或者说如何处理数据。
方法区则是辅助堆栈的快永久区(Perm),解决堆栈信息的产生,是先决条件。

例如,我们创建一个新的对象 User。那么,User 类的一些信息(类信息、静态信息都存在于方法区中);而 User 对象被实例化出来以后,被存储到 Java 堆中,一块内存空间;当我们去使用的时候,都是使用 User 对象引用,形如 User user = new User() 这里的 user 就是存放在 Java 栈中的,即 User 真实对象的一个引用。

根据垃圾回收机制的不同,Java 堆有可能拥有不同的结构。最为常见的就是将整个 Java 堆分为新生代和老年代。其中新生代存放新生的或者年龄不大的对象,老年代则存放老年对象。新生代分为 Eden 区、s0 区、s1 区,s0 区、s1 区是两块大小相等且可以互换角色的空间。

Java 栈一块线程私有的内存空间,栈一般由三部分组成:局部变量表、操作数栈和帧数据区。

Java 方法区和堆一样,是一块所有线程共享的内存区域,它保存系统的类信息,比如类的字段、方法、常量池等。方法区的大小决定了系统可以保存多少个类,如果系统定义太多的类,会导致方法区溢出,虚拟机也会抛出内存溢出错误。方法区可以理解为永久区(Perm)。

三、JVM 参数

  1. 堆分配参数
    -XX:+UseSerialGC:配置串行回收期
    -Xms:设置 Java 程序启动时初始堆大小
    -Xmx:设置 Java 程序能获得的最大堆大小
    -Xmn:设置新生代的大小。新生代大小一般会设置为整个堆空间的 1/3 到 1/4 左右。
    -XX:SurvivorRatio:设置新生代中 Eden 区域和 s0/s1 区域的比例。

四、垃圾回收及其算法

  1. 引用计数算法
    无法处理循环引用的情况,且每次进行加减操作比较浪费系统性能。

  2. 标记-清除算法
    会产生空间碎片.

  3. 复制算法

  4. 标记压缩算法

五、垃圾收集器

  1. 串行垃圾收集器

  2. 并行垃圾收集器
    ParallelGC,吞吐量优先收集器

  3. CMS 收集器

  4. G1 收集器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 2,510评论 2 26
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 743评论 0 1
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,604评论 3 83
  • 秀才张葛今年二十有二了,为了方便赶考上个月借住到京城旁李家村的叔父家。 已经连着几天都阴云不开,昨个还下了场小雪,...
    GreenBear阅读 403评论 0 1
  • 人常说:“爱能使心灵的创伤痊愈。”我深信:爱的能力取决于审美能力。 非暴力不是今天用了,明天就可以抛弃的权宜之计。...
    Lucky_ce60阅读 946评论 0 0