jvm

JVM字节码解析

不问归期 提交于 2020-03-11 13:57:52
一.字节码查看 将.java源文件编译成.class二进制字节码文件,运行该字节码文件 1.将class字节码文件内容输出到文本文件当中 javap -v xxx.class > xxx.txt 第一个部分: 显示生成class的java源文件的基本信息 Classfile /C:/Users/FLC/Desktop/授课内容/授课案例/Y2170/day22/jvm_project/jvm_day01/target/classes/com/wdksoft/ClassTest.class Last modified 2020-3-11; size 585 bytes MD5 checksum 39fa2636495e5b4bf08da6decc537381 Compiled from "ClassTest.java" public class com.wdksoft.ClassTest minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_SUPER 第二个部分:显示该类所涉及到的常量池,共有35个常量 Constant pool: #1 = Methodref #5.#23 // java/lang/Object."<init>":()V #2 = Fieldref #24.#25 // java/lang

记录一下jvm的相关知识点

有些话、适合烂在心里 提交于 2020-03-11 13:22:06
java 运行时数据区域: 程序计数器 => (每个线程都包含一个程序计数器)用来记录字节码执行的行号,字节码指令的循环,跳转,异常处理,线程恢复等需要依靠计数器。 Java虚拟机栈 => 主要用来描述Java方法执行的内存模型,(每个线程都包含一个虚拟机栈)主要用来处理方法的调用,虚拟机栈中的存储单元是栈帧,方法在执行的同时都会在虚拟机栈中创建一个栈帧,栈帧包含操作数栈,局部变量表,动态链接和方法出口等,每个方法从调用到执行完毕都对应着一个栈帧在虚拟机栈中的入栈和出栈的过程。局部变量表的存储单位为slot(4个字节),因此double 和long类型需要占用2个slot的存储空间。 栈的深度有一定限制,当深度操作最大的调用栈大小会出现StackOverflowError异常。 本地方法栈 => 为虚拟机执行java方法的服务(native方法),类似虚拟机栈 java堆 => 对象和数组存储的场所,也是gc收集器的主要管理区域,现在收集器基本采用分代收集算法,可通过-Xmx -Xms来分配堆内存大小,当堆内存无法分配内存时,会出现OutOfMemoryError异常。 方法区 => 用于存储已被虚拟机加载的类信息,静态变量,常量以及即时编译器编译后的代码等,方法区无法分配内存是会出现OutOfMemoryError异常。 运行时常量池 =>方法区的一部分

Linux从入门到放弃 zabbix监控jvm原理

跟風遠走 提交于 2020-03-11 11:06:25
zabbix-server [ root@zabbix ~ ] # yum install zabbix-java-gateway.x86_64 [ root@zabbix ~ ] # java -version openjdk version "1.8.0_242" OpenJDK Runtime Environment ( build 1.8.0_242-b08 ) OpenJDK 64-Bit Server VM ( build 25.242-b08, mixed mode ) [ root@zabbix ~ ] # vim /etc/zabbix/zabbix_server.conf [ root@zabbix ~ ] # egrep -v '^$|^#' /etc/zabbix/zabbix_server.conf LogFile = /var/log/zabbix/zabbix_server.log LogFileSize = 0 PidFile = /var/run/zabbix/zabbix_server.pid SocketDir = /var/run/zabbix DBHost = localhost DBName = zabbix DBUser = zabbix DBPassword = 123456 JavaGateway = 127.0.0.1

JVM内存结构学习:三、堆外内存

微笑、不失礼 提交于 2020-03-10 10:56:40
一、什么是堆外内存 1、堆内内存(on-heap memory)回顾 堆外内存和堆内内存是相对的二个概念,其中堆内内存是我们平常工作中接触比较多的,我们在jvm参数中只要使用-Xms,-Xmx等参数就可以设置堆的大小和最大值,理解jvm的堆还需要知道下面这个公式: 堆内内存 = 新生代+老年代+持久代 如下面的图所示: Paste_Image.png 在使用堆内内存(on-heap memory)的时候,完全遵守JVM虚拟机的内存管理机制,采用垃圾回收器(GC)统一进行内存管理,GC会在某些特定的时间点进行一次彻底回收,也就是Full GC,GC会对所有分配的堆内内存进行扫描,在这个过程中会对JAVA应用程序的性能造成一定影响,还可能会产生Stop The World。 2、堆外内存(off-heap memory)介绍 和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。 作为JAVA开发者我们经常用java.nio.DirectByteBuffer对象进行堆外内存的管理和使用,它会在对象创建的时候就分配堆外内存。 DirectByteBuffer类是在Java Heap外分配内存,对堆外内存的申请主要是通过成员变量unsafe来操作

Java学习的正确打开方式

橙三吉。 提交于 2020-03-10 03:37:19
https://blog.csdn.net/qq_44543508/article/details/102651841 在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。 文章目录 一、Java基础 1、Java基础教学视频 2、Java基础博客文章目录 3、Java基础书籍 二、关于JavaWeb基础 1、JavaWeb基础教程视频 2、关于JavaWeb博客文章 三、关于数据库 1、关系型数据库教学视频 2、非关系性数据库Redis视频 四、关于JDK新特性 五、关于并发编程 六、关于NIO 七、关于ssm框架 1、spring框架视频 2、Mybatis 框架视频 3、SpringMVC框架视频 4、SSM框架博客文章 4.1、spring框架 4.2、Mybatis框架 4.3、SpringMVC框架 4.5、SSM框架整合文章 八

JVM内存结构学习

丶灬走出姿态 提交于 2020-03-09 08:08:03
JVM内存结构学习 简介 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 Java 虚拟机所管理的内存一共分为Method Area(方法区)、VM Stack(虚拟机栈)、Native Method Stack(本地方法栈)、Heap(堆)、Program Counter Register(程序计数器)五个区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。具体如下图所示: 上图介绍的是JDK1.8 JVM运行时内存数据区域划分。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。 程序计算器 、程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 程序计数器是一块 “线程私有” 的内存,每条线程都有一个独立的程序计数器,能够将切换后的线程恢复到正确的执行位置。

一、JVM — Java内存区域

前提是你 提交于 2020-03-09 05:16:11
Java 内存区域详解 写在前面 (常见面试题) 基本问题 拓展问题 一 概述 二 运行时数据区域 2.1 程序计数器 2.2 Java 虚拟机栈 2.3 本地方法栈 2.4 堆 2.5 方法区 2.5.1 方法区和永久代的关系 2.5.2 常用参数 2.5.3 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? 2.6 运行时常量池 2.7 直接内存 三 HotSpot 虚拟机对象探秘 3.1 对象的创建 Step1:类加载检查 Step2:分配内存 Step3:初始化零值 Step4:设置对象头 Step5:执行 init 方法 3.2 对象的内存布局 3.3 对象的访问定位 四 重点补充内容 4.1 String 类和常量池 4.2 String s1 = new String("abc");这句话创建了几个字符串对象? 4.3 8 种基本类型的包装类和常量池 参考 Java 内存区域详解 如果没有特殊说明,都是针对的是 HotSpot 虚拟机。 写在前面 (常见面试题) 基本问题 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题 String 类和常量池 8 种基本类型的包装类和常量池 一 概述 对于 Java

JVM内存模型

我的梦境 提交于 2020-03-09 01:01:39
JVM的内存划分: 方法区: 是线程共享的,常量静态变量的JIT(即时编译器)编译后代码也在方法区存放。用来 存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。 虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有个别名Non-Heap(非堆),目的是为了与Java堆区分。 堆内存: 是 线程共享的,垃圾回收的主要场所 。Java虚拟机所管理的 内存最大的一块 ,在 虚拟机启动时创建。 此内存区域的 唯一目的就是存放对象实例 (也就是new出来的),几乎所有的对象实例以及数组都在这里分配。Java堆是垃圾收集管理器的主要区域,因此也被称作GC堆。 程序计数器: 当前线程执行的字节码的位置指示器。是一块较小的内存空间,可以看做是 当前线程所执行的符号指示器。 两个主要作用: 字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,如:顺序执行,选择,循环,异常处理。 在多线程的情况下,程序计数器用于记录当前程序执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行的位置。 注意: 程序计数器是 唯一一个不会出现OutOfMemoryError的内存区域 ,他的生命周期随着现成的创建而创建,随着线程的结束而死亡。 Java虚拟机(栈内存): 保存局部变量,基本数据类型以及堆内存中对象的引用变量。是线程私有的

JVM,DVM虚拟机

允我心安 提交于 2020-03-09 00:44:59
Java虚拟机–JVM,类加载器,双亲委派 https://www.iteye.com/blog/welcome66-2216572 1、JVM(Java Virtual Machine),java虚拟机 JVM就是虚拟出来的计算机,有自己完善的架构,处理器,堆栈,寄存器,指令系统。使用jvm就是为了支持与操作系统无关,java跨平台的原理,因为java代码都在这上运行, .java 文件通过javac命令编译后生成. class 字节码文件,JVM的java解释器负责把.class字节码文件转化为特定的机器码文件运行。 1.进程级别,守护线程和非守护线程(用户线程) 守护线程:后台线程,为前台线程提供便利服务,比如GC线程。不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。 非守护线程:前台线程 设置守护线程: public final void setDaemon ( boolean on ) 判断守护线程: public final boolean isDaemon ( ) 2.生命周期: 启动:启动java是开启,起点是public static void main 运行:main起点,两种线程:守护线程(JVM),非守护线程(JAVA),java也可以创建自己的守护线程 消亡:程序终止则退出,也可以用System.exit或Runtime类来退出 3.体系结构

JVM—GC垃圾回收器总结

本小妞迷上赌 提交于 2020-03-08 23:11:12
收集算法(标记-清理、复制、标记-整理、分代收集)是内存回收的方法论,垃圾收集器就是内存回收的具体实现。 主要有7个gc器,如下图。 1 Serial收集器 1.1 介绍 Serial收集器是单线程的收集器。 单线程 :1.不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,2.且在垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。 Stop the world :是VM在后台自动发起和自动完成的,在用户不可见情况下把用户正常工作的线程全部停掉。 1.2 缺点: 由于Stop The World,给用户带来不良体验,比如,计算机每运行一段时间就会暂停响应几分钟来处理垃圾收集。 1.3 优点 1)简单而高效(与其他收集器的单线程比); 2)对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。 1.4 应用场景 1)VM运行在 Client 模式下的默认新生代收集器; 2)在用户的桌面应用场景中,停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,不频繁发生,是可接受的 1.5 Serial/Serial Old收集器运行示意图 2 ParNew收集器 2.1 介绍 ParNew收集器是Serial收集器多线程版本(是GC线程的多线程,并行)。 • 并行 :Parallel指多条垃圾收集线程并行工作