JVM-learning
JVM是什么??
Java Virtual Mechine
JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。
JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包
JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现
JDK将java程序编译成为class文件,JVM可以将class文件翻译成为不同平台的对应的不同识别

JVM的结构:
两个子系统:1Class Loader类加载系统 2Execution engine执行子系统
连个组件:1Runtime data area 运行时数据区域 2Native interface本地接口组件
Class loader 子系统的作用 :根据给定的全限定名类名(如 java.lang.Object)来装载 class 文件的
内容到 Runtime data area 中的 method area(方法区域)。Javsa 程序员可以 extends
java.lang.ClassLoader 类来写自 己的 Class loader。
Execution engine 子系统的作用 :执行 classes 中的指令。任何 JVM specification 实现(JDK)的核
’心是 Execution engine, 换句话说:Sun 的 JDK 和 IBM 的 JDK 好坏主要取决于他们各自实现的
Execution engine 的好坏。每个 运行中的线程都有一个 Execution engine 的实例
Native interface 组件 :与 native libraries 交互,是其它编程语言交 互的接口。
Runtime data area 组件:这个组件就是 JVM 中的内存。
重点是Runtime data area

由上图可以知道Runtime data area的结构:
Heap 实例,数组,同一个java程序多个线程都共享一个堆空间。
Method Area class信息。根据类型读取类型信息。
Java Stack 两种操作:以帧为单位压栈出栈
每当线程调用一个方法的时 候,就对当前状态作为一个帧保存到 java stack 中(压栈);
当一个方法调用返 回时,从 java stack 弹出一个帧(出栈),栈大小有限制,
Program Counter 每个线程都有PC寄存器,指向下一条要执行的指令。
Native Method stack调用操作系统原生本地方法时,所需要的内存区域。不受JVM限制于控制
Runtime Constant Pool:运行常量池。:字符串,int -128到127范围的值
上面六个区域,处理PC register不会抛出OOM异常,其他都有可能oom
内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;
详细来讲就是:
本地方法栈(Native Method Stack): 与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,
而本地方法栈则为虚拟机使用到的Native方法服务。
程序计数器(Program Counter Register) 因为代码是在线程中运行的,线程有可能被挂起。即CPU一会执行线程A,线程A还没有执行完被挂起了,接着执行线程B,最后又来执行线程A了,
CPU得知道执行线程A的哪一部分指令,线程计数器会告诉CPU。
Heap
Java 程序在运行时创建的所有类实或数组都放在同一个堆中。而一个 Java 虚拟 实例中只存在一个堆空间,
因此所有线程都将共享这个堆。每一个 java 程序独 占一个 JVM 实例,因而每个 java 程序都有它自己的
堆空间,它们不会彼此干扰。 但是同一 java 程序的多个线程都共享着同一个堆空间
存放所有new出来的东西
Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。
在实现时,既可以实现成固定大小的,也可以在运行时动态地调整:-Xms256M -Xmx 1024M
在通常情况下,服务器在运行过程中,堆空间不断地扩容与回缩,会形成不必要的系统压力 所以在线上生产环境中
JVM的Xms和 Xmx会设置成同样大小,避免在GC 后调整堆大小时带来的额外压力。
Method area现在应该叫做Meta SPace
在 Java 虚拟机中,被装载的 class 的信息存储在 Method area 的内存中。当虚 拟机装载某个类型时,
它使用类装载器定位相应的 class 文件,然后读入这个 class 文件内容并把它传输到虚拟机中。紧接着
虚拟机提取其中的类型信息,并 将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。
与 Heap 一样,method area 是多线程共享的
Java stack
以帧为单位保存线程的运行状态。虚拟机只会直接对 Java stack 执行两种操作:以帧为单位的压栈或出栈。
每当线程调用一个方法的时 候,就对当前状态作为一个帧保存到 java stack 中(压栈);当一个方法调用返回时,
从 java stack 弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能 出现 StackOverFlow 问题。
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、
动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。
在活动线程中, 只有位于栈顶的帧才是有效的, 称为当前栈帧。正在执行的方法称为当前方法。在执行引擎运行时, 所有指令都只能针对当前栈帧进行操作。
而StackOverflowError 表示请求的栈溢出, 导致内存耗尽, 通常出现在递归方法中。 虚拟机栈通过pop和push的方式,对每个方法对应的活动栈帧进行运算处理,方法正常执行结束,肯定会跳转到另一个栈帧上。在执行的过程中,如果出现了异常,
会进行异常回溯,返回地址通过异常处理表确定。

栈帧当中的: 局部变量表:
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,
在方法运行期间不会改变局部变量表的大小。
如果局部变量是Java的8种基本基本数据类型,则存在局部变量表中,如果是引用类型。
如new出来的String,局部变量表中存的是引用,而实例在堆中。
动态链接
每个栈帧中包含一个在常量池中对当前方法的引用, 目的是支持方法调用过程的动态连接。
java的内存布局,JVM

按照线程是否私有划分

垃圾分代回收算法(Generational Collecting)
年轻代:JVM-Heap一部分
年老代:JVM-Heap一部分
持久代:JVM-Method area
Heap里面的分区情况:
11Young generation space:
Young Genaration 新生区:更是又细为分 eden space,S0,S1 三个区。 Eden space 伊甸区:新创建的对象存储地方
Survivor 0 Space: 当Eden里面需要创建对象,但是空间已经用完了,JVM垃圾回收器将
对Eden进行垃圾回收。
1-不被其他对象所引用的对象进行销毁
2-存在被其他对象引用的对象移动到Survivor 0 Space。
存放新生区被垃圾回收新村下来的Java对象。
当Survivor 0 Space也没有空间存放的时候,JVM垃圾回收器将对此区进行垃圾回收
注意:如果该对象仅仅被一个没有其他对象引用的 对象引用的话,此对象也被归为没有存在的必要, Survivor 1 Space: 22Tenure generation space养老区:如果Survivor 1 Space也没有空间了就会垃圾回收,将存活的对象放到养老区。 当养老区,幸存者1,0区,伊甸区都没空间,JVM就会出现内存溢出OOM
下面去各个区域的JVM参数,可以启动通过-D注入设置

下面是自带的JVM监控工具,安装插件
Java VisualVM默认没有安装Visual GC插件,需要手动安装,JDK的安装目录的bin目露下双击jvisualvm.exe,即可打开Java VisualVM,点击菜单栏 工具->插件 安装Visual GC就可以了

JVM-learning的更多相关文章
- 深入理解JVM虚拟机(二):JDK 内存类的异常分析
JVM数据存储 堆存储(Heap):对象存储,实际上就是JAVA的数据存储 方法堆栈(Method Stack):存储方法调用的关系. 永久代(Perm):在JDK1.6及之前,常量数据存储于此区域 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- (转)分布式深度学习系统构建 简介 Distributed Deep Learning
HOME ABOUT CONTACT SUBSCRIBE VIA RSS DEEP LEARNING FOR ENTERPRISE Distributed Deep Learning, Part ...
- Unsupervised Learning: Use Cases
Unsupervised Learning: Use Cases Contents Visualization K-Means Clustering Transfer Learning K-Neare ...
- 17 Great Machine Learning Libraries
17 Great Machine Learning Libraries 08 October 2013 After wonderful feedback on my previous post on ...
- JVM探索(二)
java has four types of garbage collectors, Serial Garbage Collector Parallel Garbage Collector CMS G ...
- 读learning spark lighting chapter1~chapter2
chapter 1 introduction to the analysis with spark the conponents of Sparks spark core(contains the b ...
- Deep Learning in R
Introduction Deep learning is a recent trend in machine learning that models highly non-linear repre ...
- Machine Learning, Homework 9, Neural Nets
Machine Learning, Homework 9, Neural NetsApril 15, 2019ContentsBoston Housing with a Single Layer an ...
- Machine Learning 资料
Awesome系列 Awesome Machine Learning Awesome Deep Learning Awesome TensorFlow Awesome TensorFlow Imple ...
随机推荐
- git使用小技巧-忽略提交文件设置
前言 我们可以把自己的代码放到github上,但是我们有的文件或者文件夹不想提交到github上,这时候用到一个忽略文件 操作方法 * 在项目根目录创建一个 .gitignore文件 * 打开.git ...
- Windows原理深入学习系列-访问控制列表
这是[信安成长计划]的第 19 篇文章 0x00 目录 0x01 介绍 0x02 DACL 0x03 创建DACL 0x04 文件读取测试 0x05 进程注入测试 0x06 原理分析 Win10_x6 ...
- 【基础知识】CPU 指令执行的五个阶段,cpu就是用来执行指令的
IF(Instruction fetch) 取指:从 Instruction-Memory 中读取指令,并在下一个时钟上升沿到来时把指令送到 ID 级的指令缓冲器 id_ir 中.该级控制信号决定下一 ...
- WPF中RichTextBox中添加文字的两种方法
RichTextBox控件不同于TextBox控件,后者可以直接通过其Text属性绑定或者在后台动态添加文字. (一)使用数据绑定 <RichTextBox FontSize="12& ...
- 5个相见恨晚的Linux命令,每一个都非常实用
转至:https://zhuanlan.zhihu.com/p/57866239 作为一个开发人员,经常要用到终端命令,最让人头疼的是记不住繁琐的参数.用谷哥度娘检索效率低下,通过man命令显示的结果 ...
- POJ2663,3420题解
两道非常像的题,放到一起来写 题目大意:用若干2x1的砖去铺一个3xN的空间(POJ3420为4xN),问总共有多少种不同的铺法(POJ3420还要求结果对MOD求模). 思路:找规律.对于3xN的空 ...
- vue项目部署到IIS服务器上
前端Vue项目需要部署到IIS服务器上: 准备工作: 1:部署IIS服务器 2:项目npm run build打包生成需要部署的文件(dist文件夹)我的是manage文件夹 开始部署: 1:复制文件 ...
- c# 去除TextBox的获取焦点事件
/// <summary> /// 去除TextBox的获取焦点事件 /// </summary> /// <param name="sender"& ...
- C#读写自定义的多字段配置文件
mark一下,日后填坑 参考: WPF 读写自己写的配置文件
- .net core 学习笔记一 Program与Startup
一.Program文件: 1.CreateWebHostBuilder(): 构建web服务2.WebHost.CreateDefaulBuilder(): 使用默认配置,包括 1.使用了Kestre ...