JAVA虚拟机知识整理
JVM知识整理
迟到的help
这个作者很懒,什么都没留下…
展开
-
java方法调用之解析调用与分派调用
方法调用过程是指确定被调用方法的版本(即调用哪一个方法),并不包括方法执行过程。我们知道,Class 文件的编译过程中并不包括传统编译中的连接步骤,一切方法调用在 Class 文件调用里面存储的都只是符号引用,而不是方法在实际运行时的内存布局入口地址,也就是说符号引用解析成直接引用的过程。这个特性使得Java 具有强大的动态扩展能力,但也使得 Java方法调用过程变得复杂起来,需要在类加载器件,甚...原创 2020-03-20 22:09:10 · 547 阅读 · 1 评论 -
jvm 局部变量表slot复用问题
如果当前字节码PC计数器的值已经超出了某个变量的作用域,那这个变量对应的Slot就可以交给其他变量使用。字节码PC计数器就是程序计数器,程序计数器记录当前线程所执行的字节码的偏移地址。如果这个值超出了某个变量的作用域,那么接下来这个变量就不会再被访问到。slot的复用会影响到系统的垃圾收集行为:1、没有回收b所占的内存,因为在执行System.gc()时,变量b还处于作...原创 2020-03-20 15:06:38 · 687 阅读 · 2 评论 -
java类加载时机,过程,机制总结
目录类加载的时机类加载过程一、加载二、连接1、验证2、准备3、解析三、初始化类加载器类加载的时机隐式加载:new 创建类的实例 显式加载:ClassLoader,forName等 访问类的静态变量,或者为静态变量赋值 调用类的静态方法 使用反射方式创建某个类或者接口对象的Class对象 初始化某个类的子类,子类和当前类都会被加载 直接使用ja...原创 2020-03-18 02:58:04 · 235 阅读 · 0 评论 -
Class 文件结构 和 Java虚拟机字节码指令集
Class 文件结构https://www.cnblogs.com/wade-luffy/p/5929325.html#_label1咖啡贝比表示是java的class文件 00000034分别表示版本号Java虚拟机字节码指令集https://www.cnblogs.com/yelao/p/9492238.html...原创 2020-03-16 01:04:57 · 222 阅读 · 0 评论 -
java虚拟机常用工具之VisualVM及插件安装问题
VisualVM 官方下载地址https://visualvm.github.io/index.html当然,其实jdk中也集成了这个工具名字叫 jvisualvm.exe,并且是中文的,位于jdk安装路径的bin文件下双击打开jvisualvm.exe例如查看程序Test5可以很方便的对内存,线程进行监控VisualVM 提供了很多很好的插件,但...原创 2020-03-14 17:23:02 · 1561 阅读 · 0 评论 -
java虚拟机常用工具之jconsole
jconsole.exe 是java自带的一个可用来监控内存,线程等信息的可视化小工具在java安装bin目录下堆内存监视准备如下代码,并通过“内存”视图进行查看public class JconsoleTest { //定义b1是为了增大类的占用空间,使jconsole的视图变化更明显,这里定义的是128kb //情况一: byte[] ...原创 2020-03-13 22:37:50 · 319 阅读 · 0 评论 -
Java中成员变量和局部变量在内存中的分配
首先说明,"Java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量 局部变量就是方法或语句块内部定义的变量局部变量必须初始化。 形式参数也是局部变量局部变量中 基础数据类型的引用 和值都存储在栈中 局部变量中 对象引用存在栈中,对象实例存在堆中栈内存中的局部变量随着方法的消失而消失。 成员变量存储在...原创 2020-03-13 21:39:57 · 465 阅读 · 0 评论 -
java虚拟机常用工具之jstack
jstack用于生成java虚拟机当前时刻的线程快照线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,js...原创 2020-03-13 16:23:56 · 177 阅读 · 0 评论 -
java虚拟机常用工具之jhat
JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。目前来说jhat使用的场景还是比较少的,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上,使用一些可视化工具进行分析。主要命令:jhat ...原创 2020-03-13 15:50:12 · 578 阅读 · 0 评论 -
java虚拟机常用工具之jmap
语法jmap [option] <pid>常用方法:jmap -heap pid:打印堆使用的概况;jmap -clstats pid:打印出类加载器使用情况,主要用来看加载的类的数量,jdk8及以后才可使用。之前版本的jdk使用jmp -perstats pid命令;jmap -histo[:live] pid:打印heap中各类的实例数目,倒序排。加上li...原创 2020-03-13 15:20:51 · 462 阅读 · 0 评论 -
java虚拟机常用工具之jinfo
jinfo可以实时查看和调整虚拟机各项参数语法jinfo [option] {pid}option可选值:-flag {name}打印指定的JVM参数值。如:查看新生代中Eden区域和Survivor区域(From幸存区或To幸存区)的比例jinfo -flag SurvivorRatio 55394结果为: -XX:SurvivorRatio=8...原创 2020-03-12 18:39:35 · 196 阅读 · 0 评论 -
java虚拟机常用工具之jstat
Jstat名称:Java Virtual Machine statistics monitoring tool官方文档:https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html目录功能描述:1.-class 类加载统计2.-compiler 编译统计3.-gc 垃圾回收统计 常用4.-gcca...原创 2020-03-12 17:47:01 · 361 阅读 · 0 评论 -
java虚拟机常用工具之jps
jps直接使用黑窗口命令行jps 全称JVM Process Status Tool,命令位于 jdk 的 bin 目录下,其作用是显示当前系统的 Java 进程情况,及其 pid 号。他是 Java自带的一个命令 jps命令用来查看所有 Java 进程,每一行就是一个 Java 进程信息。 jps仅查找当前用户的 Java 进程,而不是当前系统中的所有进程,要显示其他用户的还只...原创 2020-03-12 17:26:02 · 355 阅读 · 0 评论 -
java逃逸分析与栈上分配
什么是栈上分配?栈上分配主要是指在Java程序的执行过程中,在方法体中声明的变量以及创建的对象,将直接从该线程所使用的栈中分配空间。 一般而言,创建对象都是从堆中来分配的,这里是指在栈上来分配空间给新创建的对象什么是逃逸?逃逸是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收...原创 2020-03-08 02:56:00 · 450 阅读 · 0 评论 -
java对象在内存中的分配优先级
优先分配到Eden验证方法:配置jvm运行参数参数说明:-verbose:gc 输出虚拟机中GC的详细情况-XX:+PrintGCDetails 打印GC详细信息-XX:+UseSerialGC 使用Serial收集器编写代码:public static void main(String[] args) { byte [] b1 = n...原创 2020-03-08 02:23:03 · 452 阅读 · 0 评论 -
java垃圾回收整理
如何判定对象为垃圾对象? 引用计数法 可达性分析法 如何回收? 回收策略 标记清除算法 标记整理算法 复制算法 分代收集算法 垃圾回收器 Serial Parnew Cms ...原创 2020-03-07 01:57:52 · 176 阅读 · 0 评论 -
java对象的访问定位
java对象的访问定位主要有两种方式:直接指针 使用直接指针的话,reference(对象的引用)中存储的就是对象的地址,此时对象中就要存储到对象类型数据的指针了。这种方式的好处就是访问对象比较快。 句柄池 使用句柄访问的话,两次寻址,Java堆中划出一块内存存储句柄池,引用中存储的是句柄的地址,而句柄中存储了到对象实例数据和到对象类型数据的指针。其...原创 2020-03-05 01:37:13 · 286 阅读 · 0 评论 -
java对象的内存结构
关于对象的内存布局,可以先看下面这张图,图中已经画的很清楚了可以看到内存中存储的区域可以分为三部分: 对象头(Header) 运行时数据 (哈希值,GC分代年龄,锁状态标识,线程持有的锁,偏向线程ID,偏向时间戳等,这部分数据的长度在32位和6...原创 2020-03-05 01:17:46 · 121 阅读 · 0 评论 -
java对象的创建过程
第一步:虚拟机遇到new关键字时,先检查此指令的参数是否能在常量池中找到类的符号引用,并检查符号引用代表的类是否被加载、解析、初始化,若没有则先进行类加载。如果没有加载,需要先进行类加载。第二步:对象内存分配:类加载检查通过后,虚拟机为新生对象分配内存,对象所需内存大小在类加载完成后便可完全确定。分配内存的任务等同于从堆中分出一块确定大小的内存。根据Java堆是否规整,分配内存的方...原创 2020-03-04 19:38:10 · 143 阅读 · 0 评论 -
java内存结构之运行时常量池
运行时常量池运行时常量池是方法区的一部分。CLass文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入...原创 2020-03-02 18:01:05 · 279 阅读 · 0 评论 -
java内存结构之方法区
存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据 类信息包括:类的版本,字段,方法,接口 方法区和永久代 垃圾回收在方法区的行为 异常的定义...原创 2020-03-02 16:56:17 · 294 阅读 · 0 评论 -
java内存结构之堆内存
存放对象实例 垃圾收集器管理的主要区域 新生代,老年代,Eden空间原创 2020-03-02 16:50:07 · 231 阅读 · 0 评论 -
java内存结构之虚拟机栈
虚拟机栈描述的是java方法执行的动态内存模型 栈帧 每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成。 栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等 局部变量表 存放编译器可知的各种基本数据类型,引用类型,returnAddress类型 局部变量表的内存空间在编译器完成分配,当进入一个方法时,这个方法需要在帧中分配多少内存是固定的,在方法运行期间是不会改变...原创 2020-02-29 16:54:09 · 223 阅读 · 0 评论 -
java内存结构之程序计数器
程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码(代码)的行号指示器。当前执行到哪一行,下面该执行哪一行代码。程序计数器处于线程的独占区,每个线程都有各自独立的计数器。 如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的native方法,这个计数器的值为undefined。 此区域是唯一一个在java虚拟机规范中没有规...原创 2020-02-29 16:10:06 · 223 阅读 · 0 评论 -
java8 新特性 lanmbda表达式初体验
java8 新特性中加入了lanmbda表达式,写个小程序体验一下package com.jvm.test1;import javax.swing.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class LanmbdaTest extends JFrame { ...原创 2020-02-26 17:13:59 · 1023 阅读 · 0 评论 -
java监视和管理控制台 jconsole
jconsole.exe 是java自带的一个可用来监控内存,线程等信息的可视化小工具在java安装bin目录下写个小程序,来玩一下这个程序,主要看堆内存变化情况public class JconsoleTest { //定义b1是为了增大类的占用空间,使jconsole的视图变化更明显,这里定义的是128kb //情况一: byte[] b1...原创 2020-02-25 13:19:30 · 293 阅读 · 0 评论 -
内存溢出问题定位方法
内存溢出问题定位方法设置虚拟机参数:-XX:+HeapDumpOnOutOfMemoryError设置完成后,当出现内存溢出的时候会在项目对应的目录下生成一个.hprof结尾的文件使用工具进行分析:工具一:eclipseMemoryAnalyzer下载地址:https://www.eclipse.org/mat/downloads.php解压打开 Me...原创 2020-02-24 21:21:10 · 940 阅读 · 0 评论 -
体验内存溢出
体验内存溢出//内存溢出代码public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); int i = 0; while (true) { ...原创 2020-02-24 21:20:22 · 123 阅读 · 0 评论 -
jdk,jre,jvm的包含关系
jdk,jre,jvm的关系他们三个是包含关系 jdk包含jre,jre包含jvmjdk(Java Development ToolKit):java开发工具包jre(Java Runtime Environment):java运行时环境jvm(Java Virtual Machine):java虚拟机javac是用来编译的,所以jre中没有javac...原创 2020-02-24 21:10:29 · 2836 阅读 · 0 评论