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的更多相关文章

  1. 深入理解JVM虚拟机(二):JDK 内存类的异常分析

    JVM数据存储 堆存储(Heap):对象存储,实际上就是JAVA的数据存储 方法堆栈(Method Stack):存储方法调用的关系. 永久代(Perm):在JDK1.6及之前,常量数据存储于此区域 ...

  2. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  3. (转)分布式深度学习系统构建 简介 Distributed Deep Learning

    HOME ABOUT CONTACT SUBSCRIBE VIA RSS   DEEP LEARNING FOR ENTERPRISE Distributed Deep Learning, Part ...

  4. Unsupervised Learning: Use Cases

    Unsupervised Learning: Use Cases Contents Visualization K-Means Clustering Transfer Learning K-Neare ...

  5. 17 Great Machine Learning Libraries

    17 Great Machine Learning Libraries 08 October 2013 After wonderful feedback on my previous post on ...

  6. JVM探索(二)

    java has four types of garbage collectors, Serial Garbage Collector Parallel Garbage Collector CMS G ...

  7. 读learning spark lighting chapter1~chapter2

    chapter 1 introduction to the analysis with spark the conponents of Sparks spark core(contains the b ...

  8. Deep Learning in R

    Introduction Deep learning is a recent trend in machine learning that models highly non-linear repre ...

  9. Machine Learning, Homework 9, Neural Nets

    Machine Learning, Homework 9, Neural NetsApril 15, 2019ContentsBoston Housing with a Single Layer an ...

  10. Machine Learning 资料

    Awesome系列 Awesome Machine Learning Awesome Deep Learning Awesome TensorFlow Awesome TensorFlow Imple ...

随机推荐

  1. Spring Boot 学习-基础

    一.Spring Boot 概述 SpringBoot 定义 Spring Boot 并不是用来替代 Spring 的新框架,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具 ...

  2. Java中的Unsafe在安全领域的一些应用总结和复现

    目录 0 前言 1 基本使用 1.1 内存级别修改值 1.2 创建对象 1.3 创建VM Anonymous Class 2 利用姿势 2.1 修改值以关闭RASP等防御措施 2.2 创建Native ...

  3. [旧][Android] View 工作原理(一)

    备注 原发表于2016.05.23,资料已过时,仅作备份,谨慎参考 前言 本文参考<Android 开发艺术探索>及网上各种资料进行撰写,目的是为自己理清 Android 中 View 的 ...

  4. 案例三:shell统计ip访问情况并分析访问日志

    题目要求 有日志 1.log,部分内容如下: 112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com"/secco ...

  5. mysql 语句的使用

    查看数据库 show databases; use 数据库名: show tables; //显示数据库的表名describe 表名; //显示某表的字段, 建表模板 这是为了清楚直观,再mysql行 ...

  6. Qt:QDir

    0.说明 QDir提供了访问目录及目录下内容的类. QDir既可以用于访问文件系统,也可以用于访问Qt 资源系统(Qt's resource system.). Qt用 "/" 作 ...

  7. (转载)虚拟化(3):os调度策略。

    转自:https://zhuanlan.zhihu.com/p/38046313 这一章主要是介绍几个简单的调度器策略.内容比较简单,就简单汇总下. 首先我们对现有的计算机环境有如下几个假设: 1.每 ...

  8. @Async的用法和示例

    @Async 注解的用法和示例 目录 @Async 注解的用法和示例 背景 异步调用 @Async介绍 在Spring中启用@Async 示例一:基本使用方式 示例二:在同一个类中调用异步方法 示例三 ...

  9. Solon 1.6.30 发布,更现代感的应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  10. tp6微信公众号开发者模式token认证

      微信公众号开发完整教程(一) PHP7.0版本,TP5.0框架 技术标签: 微信公众号开发         因为工作的需要,这一两年对微信公众号和小程序,项目制作的比较多.所以我才打算写一篇全面的 ...