jvm

深入理解JVM Note

对着背影说爱祢 提交于 2020-02-02 13:28:40
第2章 Java内存区域与内存溢出异常 运行时数据区域 在虚拟机有栈、堆和方法区。 线程共享的:堆、方法区 不共享的:栈、程序计数器(代码执行的行号) 程序计数器(Program Counter Register): 一小块内存空间,单前线程所执行的字节码行号指示器。字节码解释器工作时,通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 栈 通常我们定义一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间。 栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。 存在栈中的数据可以共享。假设我们同时定义: int a = 3;  int b = 3; 编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,如果没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。 StackOverflowError 方法压入和弹出 连续 1.引用类型总是被分配到“堆”上。不论是成员变量还是局部 2.基础类型总是分配到它声明的地方:成员变量在堆内存里,局部变量在栈内存里。 比如

Monitoring java native memory

南楼画角 提交于 2020-02-02 11:58:07
问题 We are monitoring jvm metrics like heap, metaspace, threads and gc count and we are able to push these metrics to monitorng server like prometheus. Similarly we wanted to track Java native memory metrics(output of jcmd VM.sumary). My question is, is it possible to get these metrics by calling any jvm runtime classes? 回答1: Yes, it is possible to get NativeMemoryTracking summary directly from a Java application: import javax.management.JMException; import javax.management.ObjectName; import

Monitoring java native memory

末鹿安然 提交于 2020-02-02 11:57:46
问题 We are monitoring jvm metrics like heap, metaspace, threads and gc count and we are able to push these metrics to monitorng server like prometheus. Similarly we wanted to track Java native memory metrics(output of jcmd VM.sumary). My question is, is it possible to get these metrics by calling any jvm runtime classes? 回答1: Yes, it is possible to get NativeMemoryTracking summary directly from a Java application: import javax.management.JMException; import javax.management.ObjectName; import

JVM认知(一)

别等时光非礼了梦想. 提交于 2020-02-02 03:42:56
接下来的几篇博客只是对JVM的一个简单认知,主要是对JVM的组成部分以及程序的运行流程的一个介绍,并没有深入到每一个层次的每一个点,如果有错或者以后掌握到更深入层次的知识后,还会更新的。 JVM:Java Virtual Machine(Java虚拟机) 先看一张图,在最开始接触Java的时候的HelloWorld的运行: 我们编写的Java文件,经过javac指令,编译成为class字节码文件,再将字节码文件放到Java运行环境中运行。我们都知道,Java是个跨平台的语言,那么如何实现在windows环境以及linux环境都可以运行呢?JVM就起到了关键作用。JVM就是从软件层面屏蔽不同操作系统在底层硬件与指令的不同。 那么,JVM到底是什么,或者说长什么样呢? 我们来看下JVM的模型图: 可以看到,JVM主要由三部分组成:类装载子系统、运行时数据区、字节码执行引擎。其中运行时数据区则是主要部分。 首先来看栈部分:栈用来存储局部变量。 先来看一段简单代码: package com . hpu . dong ; public class test { public static final int m = 100 ; public static User user = new User ( ) ; public int add ( ) { int a = 1 ; int b = 2

JVM学习记录

寵の児 提交于 2020-02-02 01:02:34
目录 第一章 JVM与Java体系结构 1.字节码 2.虚拟机 3.JVM的位置 4.JVM的整体结构 5.Java代码执行流程 6.JVM的架构模型 7. JVM的生命周期 第二章 类加载子系统 1.类加载器与类的加载过程 2.类加载器的分类 3.ClassLoader的使用说明 4.双亲委派机制 5.沙箱安全机制 第三章 运行时数据区及线程 1.运行时数据区 ​ 2.线程 第四章 程序计数器(pc寄存器) 1.相关面试题 第五章 虚拟机栈 1.虚拟机栈概述 2.栈的存储单位 3.局部变量表 4.操作数栈 5.代码追踪 6.栈顶缓存技术 7.动态链接(指向运行时常量池方法的引用) 8.方法的调用:解析与分派 9.方法返回地址(return address) 10.一些附加信息 第六章 本地方法接口与本地方法栈 1.本地方法接口 2.本地方法栈 第一章 JVM与Java体系结构 1.字节码 不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的jvm上运行 Java虚拟机与Java语言并没有必然联系,它只与特定的二进制文件格式——class文件格式所关联,class文件中包含了Java虚拟机指令集(字节码)和符号表,和其他辅助信息 2.虚拟机 虚拟机就是一台虚拟的计算机,是一款软件,用来执行一系列虚拟的计算机指令 系统虚拟机:VMware,对物理计算机的仿真

深入理解JVM:虚拟机字节码执行引擎

可紊 提交于 2020-02-02 00:40:25
一、运行时栈结构 栈帧 是用于支持虚拟机进行方法调用和方法执行的数据结构。 栈帧 包括: 局部变量表、操作数栈、动态连接、方法的返回地址 和一些额外的附加信息。 执行引擎运行的所有字节码指令只针对当前栈帧进行操作。需要注意的是一个栈中能容纳的栈帧是受限,过深的方法调用可能会导致StackOverFlowError,当然,我们可以认为设置栈的大小。其模型示意图大体如下: 执行引擎的所有字节码指令都只针对当前栈帧进行操作。 1、局部变量表 是变量值的存储空间,由方法参数和方法内部定义的局部变量组成,其容量用Slot 1 作为最小单位。 slot可以存放32位以内的数据类型。slot的长度可以随处理器、操作系统或虚拟机不同而发生改变。 局部变量表 的大小在编译时就可以确定,Code中的max_local。 局部变量表 不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。 JVM通过索引定位方式使用 局部变量表 。 在方法执行时,如果是实例方法,那么局部变量表的第0位索引的slot默认是用于传递方法所属类实例的引用(也就是this)。 2、操作数栈 操作数栈 的最大深度也在编译的时候写入到Code属性的max_stacks数据项中。 另外我们说Java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是 操作数栈 。 操作数栈

JavaAgent学习小结

好久不见. 提交于 2020-02-01 18:54:09
前言 最近因为公司需要,需要了解下java探针,在网上找资料,发现资料还是有很多的,但是例子太少,有的直接把公司代码粘贴出来,太复杂了,有的又特别简单不是我想要的例子, 我想要这样的一个例子: jvm在运行,我想动态修改一个类,jvm在不用重启的情况下, 自动加载新的类定义. 动态修改类定义,听着感觉就很酷. 本文将实现一个方法监控的例子, 开始方法是没有监控的, 动态修改后, 方法执行结束会打印方法耗时. Instrumentation介绍 使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了一种 虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。 在 Java SE 5 中,Instrument 要求在运行前利用命令行参数或者系统参数来设置代理类,在实际的运行之中,虚拟机在初始化之时(在绝大多数的 Java 类库被载入之前),启动instrumentation 的设置,从而可以在加载字节码之前,修改类的定义。 在 Java SE6 里面,则更进一步,可以在jvm运行时,动态修改类定义,使用就更方便了

JVM垃圾回收机制之引用类型

南楼画角 提交于 2020-02-01 04:58:31
一:引用的类型   javac编译器编译源文件后,生成字节码文件,在类加载器加载字节码文件到内存中时,在内存中开辟 空间,栈、堆以及方法区,来存放对象以及引用。引用可以分为四种: 强引用:平常我们在编写程序时使用比较多的是强引用,在栈内存中有引用指向的对象,即使内存不足也不会被回收,而是 抛出OutOfMemoryException,这就是强引用,如果我们希望回收,可以手动将引用置为null。 StringBuilder sb = new StringBuilder();    软引用:在内存空间充足的情况下不会被回收,但是在内存溢出前会回收掉该引用对象,以释放内存空间,多用于高速缓存。 弱引用:无论内存空间是否充足,只要垃圾回收器扫描到就会被回收。这种情况用的比较少,主要是引入WeakHashMap类 虚引用(幽灵引用):永远都获取不到的对象,可以用来检测引用是否被回收。 具体解释可以参考: http://blog.csdn.net/qq_34280276/article/details/52863626 来源: https://www.cnblogs.com/warrior4236/p/6770635.html

这一次,终于系统的学习了 JVM 内存结构

时光总嘲笑我的痴心妄想 提交于 2020-02-01 02:37:33
这一次,终于系统的学习了 JVM 内存结构 原创平头哥的技术博文 最后发布于2019-11-05 11:15:20 阅读数 5652 收藏 展开 最近在看《 JAVA并发编程实践 》这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课堂上,一直没有系统的学习这一块的知识,所以这一次我把《 深入理解Java虚拟机JVM高级特性与最佳实践 》、《 Java虚拟机规范 Java SE 8版 》这两本书中关于 JVM 内存结构的部分都看了一遍,算是对 JVM 内存结构有了新的认识。JVM 内存结构是指:Java 虚拟机定义了若干种程序运行期间会使用的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁,另一些则与线程一一对应,随着线程的开始而创建,随着线程的结束而销毁。具体的运行时数据区如下图所示: 在 Java 虚拟机规范中,定义了五种运行时数据区,分别是 Java 堆、方法区、虚拟机栈、本地方法区、程序计数器,其中 Java 堆和方法区是线程共享的。接下来就具体看看这 五种运行时数据区。 Java 堆(Heap) Java 堆是所有线程共享的一块内存区域,它在虚拟机启动时 就会被创建,并且单个 JVM 进程有且仅有一个 Java 堆。Java 堆是用来存放对象实例及数组

JVM高频面试题

风流意气都作罢 提交于 2020-01-31 23:56:56
1、 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,它们的执行顺序 先静态、先父后子。 先静态:父静态 > 子静态 优先级:父类 > 子类 静态代码块 > 非静态代码块 > 构造函数 一个类的实例化过程: 1、父类中的static代码块,当前类的static 2、顺序执行父类的普通代码块 3、父类的构造函数 4、子类普通代码块 5、子类(当前类)的构造函数,按顺序执行 6、子类方法的执行 2、 JVM内存分配 3、 Java 8的内存分代改进 从永久代到元空间,在小范围自动扩展永生代避免溢出 4、 JVM垃圾回收机制,何时触发MinorGC等操作  分代垃圾回收机制:不同的对象生命周期不同。把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。  JVM中共划分为三个代:年轻代、年老代和持久代。年轻代:存放所有新生成的对象;年老代:在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象;持久代:用于存放静态文件,如Java类、方法等。新生代的垃圾收集器命名为“minor gc”,老生代的GC命名为”Full GC 或者Major GC”.其中用System.gc()强制执行的是Full GC 判断对象是否需要回收的方法有两种: 1.引用计数 当某对象的引用数为0时,便可以进行垃圾收集。 2