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 ...
随机推荐
- kali linux更新msf 报错Unable to find a spec satisfying metasploit-framework (>= 0) in the set. Perhaps the解决办法
首先换更新源 :vim /etc/apt/sources.list deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free co ...
- 中了勒索病毒的win7系统
- Html简单标签
学习html <h1> 标题标签</h1> 标题标签 <p>段落标签</p> 段落标签 换行标签</br> 换行标签 水平线标签</h ...
- Java刷题时常用的标准库数据结构和相应算法
目录 一.线性表(广义的数组) 1. 数组 一维数组的定义和初始化 二维数组的定义和初始化 Arrays工具类的一些常用方法 2. List接口容器 对象的构建 读写和插入删除数据 排序 反转数组 二 ...
- VS编译时,出现无法将文件“obj\Debug\*.exe”复制到“bin\Debug\*.exe”。文件“bin\Debug\*.exe”正由另一进程使用,因此该进程无法访问此文件。
重命名将MyThread.exe 重命名 一下其他名字后就可以了.
- C++ 字符串 string
1.使用前应先包含头文件string.h,有的是cstring #include<string> 这样才能正确的cin和cout字符串. cin时,是按照空格.TAB和换行进行分割的 例如 ...
- WIN10:显示隐藏文件夹
AppData是默认隐藏文件夹,可以通过工具栏显示隐藏项目显示
- 有关base64的作业
1.有关Base64的介绍:Base64这个术语最初是在"MIME内容传输编码规范"中提出的.Base64不是一种加密算法,虽然编码后的字符串看起来有点加密的赶脚.它实际上是一种& ...
- 判断jQuery是否加载,如果未加载则加载
一般情况返回的js这么写history.go(-1) 但是如果是从别人分享过来的,就没有反应 所以就做个判断,没有上一页就返回首页 if (typeof jQuery == 'undefined') ...
- 神奇的 CSS,让文字智能适配背景颜色
最近几天,有好几个同学都问了同样一个问题. 页面上有一段文本,能否实现这段文本在不同背景色下展示不同的颜色?也就是俗称的智能变色.像是下面这样: 文本在黑色底色上表现为白色,在白色底色上表现为黑色.看 ...