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 ...
随机推荐
- [c/c++]c++控制台操作(基本操作的代码)
本文转自:http://blog.csdn.net/stude/article/details/7645056 控制台窗口界面编程控制 〇.摘要一.概述二.控制台文本窗口的一般控制步骤三.控制台窗口操 ...
- 企业如何建立一体化数据分析平台?还是得说说那几家BI工具
近年来,BI工具和报表工具犹如一股春风,吹遍了大江南北,成为了众多企业的发展利器,受到了企业决策者的拥戴.同时,在企业信息化需求日益旺盛的市场里也孕育了不少BI工具与报表工具厂商.商业智能的应用在国外 ...
- 为什么DRAM采用地址复用技术?为什么SRAM不采用地址复用技术?
行列地址复用:比如你的存储器容量是16bit,那么可以将这16个比特组织成一个4*4的矩阵,为了找到某个你想要找的bit,比如第1行第2列的那个bit.你先发送二进制的01,表示要找的数据在第1行:接 ...
- 【C# .Net GC】延迟模式 latencyMode 通过API-GC调优
延迟模式 lowlatency 使用环境:后台工作方式只影响第 2 代中的垃圾回收:第 0 代和第 1 代中的垃圾回收始终是非并发的,因为它们完成的速度很快.GC模式是针对进程配置的,进程运行期间不能 ...
- tput用法详解-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月28日 tput 命令将通过 terminfo 数据库对终端会话进行初始化和操作. 主要功能为:移动更改光标.更改文本属性颜色.清除屏幕特定区域. ...
- VirtualBox 共享文件夹设置
1. 安装VirtualBox的增强功能 2. 设置共享文件夹 参考:VirtualBox主机与虚拟机文件夹共享
- Log4j2详解——XML配置详解
Log4j2详解--XML配置详解 找到了个很详细的文章链接 https://www.jianshu.com/p/bfc182ee33db
- laravel 框架简易增删改查
参看网址:http://www.yan.com/mou/add 图书增加HTML页面 //图书增加路由 Route::get('mou/add','MouController@store'); //控 ...
- sklearn.preprocessing.LabelEncoder_标准化标签,将标签值统一转换成range(标签值个数-1)范围内
. LabelEncode(),标签值编码用在将一些类别型的列进行编码,方便用于训练
- 快速整明白Redis中的字典到底是个啥
字典简介 字典是一种用于保存键值对的数据结构,可以通过键值对中的键快速地查找到对应的值.在Redis所使用的C语言中,并没有内置字典,所以Redis自己实现了字典. 整个Redis数据库的所有的键和值 ...