今天是猿灯塔“365天原创计划”第2天。
 
今天讲:
 
为什么写这个主题呢?
之前看到不少同学在讨论,
 
 
今天呢火星哥抽出点时间来帮大家整理一下关于JVM的一些知识点
 
 
一.JVM是什么?
JVM,即Java Virtual Machine ,Java虚拟机 运行在操作系统之上的虚拟的计算机 。我们主要研究的是 HotSpot VM JDK自带的虚拟机,这个虚拟机有两个很好的优点: 准确式GC + 热点代码探测技术。所谓准确式GC,就是让JVM知道内存中某位置数据的类型什么。比如当前内存位置中的数据究竟是一个整型变量还是一个引用类型。这样JVM可以很快确定所有引用类型的位置,从而更有针对性的进行GC roots枚举。JVM进行一段代码是不是热点代码,是不是需要触发即时编译,这样的行为称为热点探测。Java语言最重要的特点之一:跨平台使用,正是由于JVM的存在。
二.JVM怎么来?
我们都知道,要做Java开发,必须在你的电脑上安装JDK才行,安装JDK之后里面会有一个JRE的目录,JRE提供了软件环境----JVM。
 
三.JVM虚拟机内存结构
JVM虚拟机将其内存分为程序计数器、虚拟机栈、本地方法栈、java堆、方法区。
程序计数器:是一块私有的内存空间,比较小。主要记录下一条要运行的命令。
虚拟机栈:也是线程私有的内存空间,和java线程同一时间创建,主要用来保存局部变量、部分结果、并参与方法的调用和返回。(虚拟机栈运行时使用一种叫“栈帧”的数据结构保存上下文数据。)
本地方法栈:虚拟机栈用于管理java函数的调用,本地方法栈用于管理本地方法的调用(用C实现的方法)
java堆:所有的对象、数组都是在堆中分配空间。
堆分为:新生代、老年代。
新生代:存放刚刚产生的对象和年轻对象。新生代分为:e'den(对象刚创建时)、survivor space()、1(至少被GC一次)。
方法区(永久区):被JVM中的所有线程共享(独立于java堆的内存空间)。主要保存的是类的元数据(类的类型信息、常量池、域信息、方法信息:存放常量和类的定义信息)。GC回收时,只回收永久区中常量池的回收(未被引用的常量),再就是对类元数据的回收。
 
四.对象的堆内存布局
在HotSpot虚拟机中,对象在堆内存的布局分为三个区域,分别是对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。
对象头:对象头包括两部分信息分别是Mark World和元数据指针,Mark World用于存储对象运行时的数据,比如HashCode、锁状态标志、GC分代年龄等。而元数据指针用于指向方法区的中目标类的类型信息,通过元数据指针可以确定对象的具体类型。
实例数据:用于存储对象中的各种类型的字段信息(包括从父类继承来的)。
对齐填充:对齐填充不一定存在,起到了占位符的作用,没有特别的含义。
 
五.垃圾回收(GC)
GC是jvm的垃圾回收,当实例化一个java对象的时候jvm为此对象分配一块内存,当此对象不再被使用时,由jvm自动回收此内存块。不用人为的释放内存,降低了内存溢出的风险。
GC算法通常有两种,一是引用计数,当对象创建、引用时该对象的计数增加,引用超出作用域或者对象为空的时候,此计数减少。当计数为0的时候此对象可以回收。二是对象引用遍历,也称向图法。就是从根开始沿着整个对象图遍历,标记可到达的对象。再通过扫描整个堆栈处理不可到达的对象。
这两种算法对应了多种实现机制
1.标记-清除
2.标记-压缩
这两种机制是对不可到达的对象进行清理、压缩处理。
3.复制机制
这种机制将堆栈分为两个区域,称为半空间。每次使用一半的空间,生成的新对象在一个空间GC时将可到达的对象复制到另一个空间,从而实现堆栈的压缩。
4.增量机制
这种机制是将内存分为多个区域,每次从一个区域进行垃圾回收。
5.分代机制
这个一个比较常用的机制,这种收集机制是将堆栈分为两个或多个区域。用于存放不同寿命的对象,根据对象的使用频率分配不同寿命的区域。
以上机制称为串行GC,GC的时候会造成程序的暂停,jvm还有基于多线程的GC,称为并行GC和并发GC,他们的扫描复制都是在多线程的基础上进行的不会造成程序的暂停,适用于多cpu和对暂停时间要求较短的应用程序。是server级默认的GC机制。
 
6.为什么要掌握JVM?
或者火星哥换种方式问你:
当你的程序出现OOM的时候怎么处理?
当我们出现内存泄漏、内存溢出的时候我们不应该直接想到用-Xms去设置内存 或者栈的-Xss或者restart来解决,而是更应该去想想:为什么会出现OOM?是什么原因导致?怎么优化?怎么避免?。
其实火星哥认为,我们为什么要去学习JVM呢?两点考虑:从感性角度来看应该是:知其然,知其所以然,从理性角度来分析:我们更应该看重的是JVM的准确式内存管理。不管是为了加薪,还是为了过面试或者为了知识栈储备,我们都应该掌握JVM。
 

别逃避,是时候来给JVM一记重锤了的更多相关文章

  1. <转> 纸牌屋1-4集分析

    原文:http://blog.sina.com.cn/s/blog_b86c61490102v56t.html 第一季第一集 主人公弗兰克的出场,是以对待一只邻家将死之狗的态度展开的,充分显示了主人公 ...

  2. 完了!CPU一味求快出事儿了!

    自我介绍 我叫阿Q,是CPU一号车间里的员工,我所在的这个CPU足足有8个核,就有8个车间,干起活来杠杠滴. 我所在的一号车间里,除了负责执行指令的我,还有负责取指令的小A,负责分析指令的小胖和负责结 ...

  3. 一步步优化JVM六:优化吞吐量

    如果你已经进行完了前面的步骤了,那么你应该知道这是最后一步了.在这一步里面,你需要测试应用的吞吐量和为了更高的吞吐量而优化JVM.    这一步的输入就是应用的吞吐量性能要求.应用的吞吐量是在应用层面 ...

  4. JVM学习与问题总结——java内存区域与内存溢出异常

    java虚拟机将内存分为哪些区域? 根据Java SE7版本的Java虚拟机规范,虚拟机管理的内存包括5个运行时数据区域: 程序计数器 虚拟机栈 本地方法栈 方法区 堆 运行时数据区各部分的作用? 程 ...

  5. JVM知识(一) 求你了,别再说Java对象都是在堆内存上分配空间的了!

    求你了,别再说Java对象都是在堆内存上分配空间的了! https://baijiahao.baidu.com/s?id=1661296872935371634&wfr=spider& ...

  6. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  7. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  8. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  9. JVM类加载

    JVM的类加载机制就是:JVM把描述类的class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型 ClassLoader JVM中的ClassLoade ...

随机推荐

  1. Java实现蓝桥杯正则问题

    题目描述 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式. 小明想求出这个正则表达式能接受的最长字符串的长度. 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是 ...

  2. java实现Synchronized锁的用法

    Java线程同步中的一个重要的概念synchronized. synchronized是java的关键字,是一种同步锁,它作用的对象有以下几种: ①作用在代码块上.该代码块称为同步代码块,作用范围是大 ...

  3. 卷积生成对抗网络(DCGAN)---生成手写数字

    深度卷积生成对抗网络(DCGAN) ---- 生成 MNIST 手写图片 1.基本原理 生成对抗网络(GAN)由2个重要的部分构成: 生成器(Generator):通过机器生成数据(大部分情况下是图像 ...

  4. 如何将自己在github写的android library开源,让大家依赖使用

    编写library并上传至github后,让别人可以通过gradle的方式添加依赖 http://www.jianshu.com/p/9aedfd749cec

  5. Vue好书推荐

    1.Vue.js实战 从基础知识到ui组件封装和剖析,层层推进,最后两个案例实战.适合零基础入门,学完可就业.(推荐看这本) 交流地址(pdf原件):链接(点击跳转):提取码:7IsG 2.vue.j ...

  6. wdcp如何添加反向代理功能

    1.winscp进入目录 /www/wdlinux/httpd-x.x.x/conf/右键编辑 httpd.conf 这个文件 依次把下面文件名字前面的 # 号去掉 LoadModule proxy_ ...

  7. 动手造轮子:实现一个简单的 AOP 框架

    动手造轮子:实现一个简单的 AOP 框架 Intro 最近实现了一个 AOP 框架 -- FluentAspects,API 基本稳定了,写篇文章分享一下这个 AOP 框架的设计. 整体设计 概览 I ...

  8. matplotlib添加子图(拼图功能)

    我们已经知道,matplotlib是python中的一个十分好用的作图库,它的简单的使用方法可以在之前的随笔中找到.传送门:https://www.cnblogs.com/chester-cs/p/1 ...

  9. 力扣:二叉树着色游戏(DFS详解)

    有两位极客玩家参与了一场「二叉树着色」的游戏.游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同. 游戏从「一号」玩家开始(「一号 ...

  10. Windows 程序设计(4) MFC-01前置知识

    1. Windows编程简介 1.0 开发环境 操作系统 Win10 IDE: VS2017 1.1 Windows程序简介 Windows程序呢也主要分那么几种,例如:exe的可执行程序,dll的动 ...