今天是猿灯塔“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实现 LeetCode 4 寻找两个有序数组的中位数

    寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...

  2. java实现字符串比较

    标题:字符串比较 我们需要一个新的字符串比较函数compare(s1, s2). 对这个函数要求是: 1. 它返回一个整数,表示比较的结果. 2. 结果为正值,则前一个串大,为负值,后一个串大,否则, ...

  3. java实现三进制转十进制

    ** 三进制转十进制** 不同进制的数值间的转换是软件开发中很可能 会遇到的常规问题.下面的代码演示了如何把键盘输入的3 进制数字转换为十进制.试完善之. BufferedReader br = ne ...

  4. MIPI CSI-2

    目录 1 MIPI简介 2 MIPI CSI-2简介 2.1 MIPI CSI-2 的层次结构 2.2 CSI-2协议层 2.3 打包/解包层 2.4 LLP(Low Level Protocol)层 ...

  5. 百度poi搜索

    package baidumapsdk.demo.search; import android.os.Bundle; import android.support.v4.app.FragmentAct ...

  6. k8s学习-Ingress

    4.5.Ingress Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginxIngress-Nginx 官方网站:ht ...

  7. Python常用推导式

    列表推导式: #列表推导式 #基本格式[] # 变量 = [for循环的变量 for循环一个可迭代对象] # 变量 = [i for i in 可迭代对象 if 条件] 条件为true才进行appen ...

  8. DBusConnection for c

    dbus的C API D-Bus 1.13.10 目录 dbus的C API Detailed Description Typedef Documentation ◆ DBusAddTimeoutFu ...

  9. mac 排查被占端口

    Last login: Wed Sep :: on ttys000 sam:~ sam$ sudo lsof -i : Password: COMMAND PID USER FD TYPE DEVIC ...

  10. [转] C++项目中的extern "C" {}

    点击阅读原文 引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: #ifdef __cplusplus extern "C" { #endif /*...*/ #if ...