2021
02-23
02-23
Java字节码中jvm实例用法
要想使Java运行,我们可以设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换为它可以识别的指令序列,也称为Java字节码。由于Java字节码指令的操作码被固定为一个字节,所以它的名字就这样命名了。本篇要带来的是Java字节码中jvm的使用,主要分为两个操作视角,一起来看看具体内容吧。1、虚拟机视角在执行Java代码时,首先需要将编译后的class文件装入Java虚拟机。装入的Java类将存储在方法区(MethodArea)中。虚拟机...
继续阅读 >
和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢。字段、方法、常量池。方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多,方法区内存不够肯定会导致方法区溢出,虚拟机同样会抛出内存溢出信息。(内存溢出后面相关文章给大家总结)jdk6和jdk7中,方法区可以理解为永久区(Perm).永久区可以使用参数-XX:PermSize和-XX:MaxPermSize制定。默认情况...
JVM自带的类加载器:其关系如下:其中,类加载器在加载类的时候是使用了所谓的“父委托”机制。其中,除了根类加载器以外,其他的类加载器都有且只有一个父类加载器。关于父委托机制的说明:当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统类加载器将成为该类加载器的父类加载器下面,自定义类加载器。自定义的类加载器必须继承java.lang.ClassLoader类importjava.io.*;publicclassMyClassLoaderexten...
本文已被Github仓库收录https://github.com/silently9527/JavaCore前言在前面整理了一篇关于JVM故障诊断和处理工具,考虑到大部分的Java程序员都使用的是IntelliJIdea,本篇就使用工具来实战演练对IntelliJIdea运行速度调优调优前的运行状态 原始配置内容要查询idea原始配置文件的路径可以在VisualVM中的概述中查看原始配置内容:-XX:ReservedCodeCacheSize=240m-XX:+UseCompressedOops-Dfile.encoding=UTF-8-XX:SoftRefLR...
1.对象的创建虚拟机接收到new指令时,检查这个指令能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化。如果都没有,先执行类加载过程。在类加载通过后,虚拟机为新对象分配内存(把一块确定大小的内存从Java堆中划分出来),内存大小在类加载完成后即可完全确定。两种分配方式:(1):指针碰撞:假设Java堆中内存是绝对规整的,即使用过的内存在一边,空闲的内存在另外一...
1.一段java程序是如何运行起来的呢?Java源文件,通过编译器,产生.Class字节码文件,字节码文件通过Java虚拟机中的解释器,编译成特定及其上的机器码,那Java虚拟机又是怎样加载java程序并执行起来的呢?简单来说:通过类加载器加载字节码文件,被分配到JVM的运行时数据区的字节码会被执行引擎执行。(1)类加载器,加载.class文件(2)运行数据区:栈区、堆区、PC寄存器、本地方法栈、方法区(3)执行引擎:执行包在装载类方法中...
1、JVM内存模型总结:可以发现最明显的一个变化是元空间从虚拟机转移到了本地内存。默认情况下,元数据空间大小仅受限于本地内存,这意味着以后不会因为永久代大小不够而抛出OOM异常了。jdk1.8以前,HotSpotVM将class和类的jar包数据存储在PermGen里,PermGen大小是固定的,而且项目之间无法公用公有的class,所以很容易碰到OOM异常。改成MateSpace后,各个项目会共享同样的class空间。比如多个项目都引用了apache-common包,...
【内容】:问题情况出现之前做了什么 出错之前通过这个功能增加了个错误的vm参数:-agent:xxx.jar怎么办?百度了一圈,都是让删掉:C盘\用户\用户名\.IntelliJIdea2019.3\config\idea64.exe.vmoptions然而,我这并没有这个文件。百思不得其解,重装等各种方式都试过还是不能用。思考之:1、这明显是一个用户下的配置文件,因此肯定是配置文件使用到了用户级别的,改idea下的配置文件肯...
一.现象前段时间公司线上环境的一个Java应用因为OOM的异常报警,导致整个服务不可用被拉出集群,本地模拟重现的现象如下:当时的解决方案是增加metaspace的容量:-XX:MaxMetaspaceSize=500m,从原来默认的256m改为500m,虽然没有再出现oom,但这个只是临时解决方案,通过公司的监控系统观察metaspace的使用情况还是在上升,而且后面随着业务访问量越来越大还是有可能达到阈值。二.分析Metaspace元空间主要是存储类的元数据信息,...
一.CodeCache简介从字面意思理解就是代码缓存区,它缓存的是JIT(JustinTime)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(nativecode)。当然JNI(Java本地接口)的机器码也放在codeCache里,不过JIT编译生成的nativecode占主要部分。大致在JVM中的分布如下:大家都知道javac编译器,把java代码编译成class字节码,它和JIT编译器的区别是,javac只是前端编译(有的叫前期编译),jvm是通过执行机器码和底层交互的,这...
java-version命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:ServerVM表示我们的虚拟机类型,mixedmode表示虚拟机以混合模式工作。一.虚拟机先说下本篇文章的内容都是基于HotSpot虚拟机。我们熟知的Java虚拟机是一种规范标准,有多种实现,比如HotSpot虚拟机就是JVM的一种实现,也是目前使用范围最广的Java虚拟机。其实HotSpot最早也不是Sun开发的,是他早期收购的一...
垃圾回收算法和垃圾回收器对于JVM的垃圾回收算法有复制算法、标记清除、标记整理。用阳哥的话就是:这些算法只是天上飞的理念,是一种方法论,但是真正的垃圾回收还需要有落地实现,所以垃圾回收器应运而生。JVM回收的区域包括方法区和堆,jvm对于不同区域不同的特点采用分代收集算法,比如因为所有的对象都是在Eden区进行分配,并且大部分对象的存活时间都不长,都是“朝生夕死”的,每次新生代存活的对象都不多,所以新采取复制...
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(...
很多时候我们需要在项目中读取外部属性文件,用到了System.getProperty("")方法。这个方法需要配置JVM系统属性,那么如何配置呢?那就是使用java-D配置系统属性。使用格式是:java-Dkey=value比如新建一个测试类,如下:publicclassTest{publicstaticvoidmain(String[]args){System.out.println(System.getProperty("configurePath"));}}这段代码直接执行的话,会输出null接下来需要配置configurePath属性了,有...