今天是猿灯塔“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实现字符串转换成整数

    1 问题描述 输入一个由数字组成的字符串,请把它转换成整数并输出.例如,输入字符串"123",输出整数123. 请写出一个函数实现该功能,不能使用库函数. 2 解决方案 解答本问题 ...

  2. java实现第七届蓝桥杯棋子换位

    棋子换位 棋子换位 有n个棋子A,n个棋子B,在棋盘上排成一行. 它们中间隔着一个空位,用"."表示,比如: AAA.BBB 现在需要所有的A棋子和B棋子交换位置. 移动棋子的规则 ...

  3. Java实现第八届蓝桥杯方格分割

    方格分割 题目描述 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共 ...

  4. PAT 有理数四则运算

    本题要求编写程序,计算 2 个有理数的和.差.积.商. 输入格式: 输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前 ...

  5. System.getProperty("user.dir")获取的到底是什么路径?

    一直用System.getProperty("user.dir")来获取文件目录,我在执行单个方法调试和执行测试脚本的时候碰到一个问题, 我写了一个类ElementInitiali ...

  6. 读取Excel文件,抛出类似Cleaning up unclosed ZipFile for archive D:\project\myTest\autoAppUI\excelMode\用例模板2.xlsx 错误解决

    读excel用例的时候总报这个错误,一直不知道什么原因~~~~~~~~~~ 今天突然顿悟了,原来是读excel的时候用到了文件流,我在读文件的方法里加了流关闭的操作,完美解决报错

  7. CentOS7搭建Pacemaker高可用集群(1)

    Pacemaker是Red Hat High Availability Add-on的一部分.在RHEL上进行试用的最简单方法是从Scientific Linux 或CentOS存储库中进行安装 环境 ...

  8. 【Spring注解驱动开发】使用@Scope注解设置组件的作用域

    写在前面 Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象.如果每次 ...

  9. HTTP协议浅析(一)

    先来看看百度百科对HTTP的解释 http是一个简单的请求-响应协议,它通常运行在TCP之上.它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应.请求和响应消息的头以ASCII码形式给出: ...

  10. MySQL数据库离线包安装与注册

    本文主要介绍了MySQL数据库的离线安装和将MySQL服务注册为Windows应用服务的主要步骤. 1.下在安装程序包 MySQL Community Server 5.6.15 官方下载地址http ...