jvm

JVM基本结构

◇◆丶佛笑我妖孽 提交于 2020-03-04 03:14:58
1.类加载子系统 .class文件由类加载子系统加载到内存,放入数据区的方法区内,在堆区创建一个类对象 重点:双亲委派机制 步骤:加载,链接,初始化 得到Class的对象:(1):调用Object类的getClass()方法 Class class = x.getClass();x是MyObject x; (2):使用Class类的中静态forName()方法 Class class =Class.forName("MyObject") (3):Class class = T.class;T是一个Java类型 注:子类调用了初始化(父类静态代码>子类静态代码>父类构造器>子类构造器) 2.内存结构 共享 方法区:类信息,常量,static,jit等 堆:实例对象 私有 stack:栈帧(局部变量表,操作数栈,动态链接,方法出口) 程序计数器 本地方法栈 3.执行引擎 来源: CSDN 作者: a_higher 链接: https://blog.csdn.net/a_higher/article/details/104638022

JVM性能优化

给你一囗甜甜゛ 提交于 2020-03-03 16:46:59
内存溢出 内存溢出的原因:程序在申请内存时,没有足够的内存空间。 内存溢出的几种方式 : 1,栈溢出:方法死循环递归(StackOverflowError),不断创立线程(OutOfMemoryError) 2,堆溢出:不断创建对象,分配对象大于最大堆的大小(OutOfMemoryError) 3,直接内存:分配的本地内存大小大于JVM的限制。 4,方法区溢出:在经常动态生产大量Class的应用中,CGLib字节码增强,动态语言,大量JSP文件,大量基于OSGi的应用 内存泄漏 程序在申请内存后,无法释放已申请的内存空间。 内存泄漏的集中原因 : 1,长生命周期的对象持有短生命周期对象的引用:例如将ArrayList设置为静态常量,则容器中的对象在程序结束之前是不能被释放的,从而造成内存泄漏。 2,链接未关闭:如数据库连接池、网络链接和IO链接等,只有链接被关闭后,才会回收对应的对象 3,变量作用域不合理:例如 1.一个变量的定义的作用范围大于其使用范围。2.没有及时把对象设置为null 4,内部类持有外部类:内部类的生命周期长于外部类,程序很容易产生内存泄漏。解决办法,使用软引用或弱引用,通过构造方法传递 5,Hash值得变化:在集合中,如果修改参与计算哈希值字段,会导致无法从集合中单独删除当前对象,造成内存泄漏 内存溢出和内存泄漏的区别 内存溢出:实实在在的内存空间不足导致

JVM内存模型基础

狂风中的少年 提交于 2020-03-03 15:24:18
1. JVM 线程私有内存 : 程序计数器(Program Counter Register):保留当前线程执行方法 Java虚拟机栈(JVM Stack):方法的栈帧 本地方法栈(Native Method Stack):存储native方法信息 多线程共享内存 : 堆(Heap):存储对象和数组 方法区(Method Area):存储类结构/常量/静态变量,运行时常量池:属于方法区 1.1. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 1.2. Heap Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域用来 存放对象实例 ,几乎所有的对象实例都在这里分配内存,垃圾回收器也主要在堆内工作。 java堆:分为新生代和老年代, 老年代进行fullGC: 或者使用system.gc 老年代满后 java heap详解 java性能调优的目的 :

JVM参数详解

半腔热情 提交于 2020-03-03 10:38:38
内存参数 参数 含义 默认值 示例 说明 -Xms 初始堆大小 物理内存的1/64(<1GB) -Xms1g 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. -Xmx 最大堆大小 物理内存的1/4(<1GB) -Xmx1g 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 -Xmn 年轻代大小 -Xmn512m 注意 :此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 -XX:NewRatio 年轻代与年老代的比值 -XX:NewRatio=1 -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。 -XX:SurvivorRatio Eden区与Survivor区的大小比值 默认8:1:1 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10 -Xss 每个线程的堆栈大小

JVM类加载

心已入冬 提交于 2020-03-03 07:55:19
类加载机制 类从被加载到虚拟机内存开始,到卸载出内初为止,它的整个生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为链接(Linking) 初始化 :5种情况 1,遇到new、getstatic、putstatic和invokestatic这4个字节码指令时,如果类没有进行过初始化,则需要先触发其初始化 2,使用java.lang.reflect包的方法对类进行反射调用 3,当初始化一个类,如果发现其父类没有进行过初始化,则需要先触发其父类的初始化。 4,当虚拟机启动时,需要启动一个主类,虚拟机先初始化其主类 5,当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后解析结果Ref_getStatic、REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,这个方法对应类没有初始化,则需先进行初始化。 加载阶段: 1,通过一个类的全限定名来获取定义此类的二进制自己流 2,将静态存储结构转换为方法区运行时数据结构 3,再内存中生成一个java.lang.Class对象

What causes ClassCastException when serializing TypeTags?

ε祈祈猫儿з 提交于 2020-03-03 04:46:26
问题 Situation I'm serializing an implementation of this class: abstract class FnDescriptor[T <: FnRequest: TypeTag, R <: FnResponse: TypeTag] with Serializable { override type Input = T override type Output = R override type State = S val inputTag: TypeTag[Input] = implicitly[TypeTag[T]] val outputTag: TypeTag[Output] = implicitly[TypeTag[R]] } and sending it over REST to a Gateway, which reads it to find the types of input and output state. (Yes I know this isn't a great design) Results Now if I

maven 编译 run test的时候控制台输出乱码信息

∥☆過路亽.° 提交于 2020-03-02 17:13:19
直接运行 junit测试用例的时候,输出中文正常 用 eclipse-->run as --> maven test 就出现中文乱码 maven-surefire-plugin是运行mvn test时执行测试的插件, 其有一个配置参数forkMode,默认为once,即表示每次运行test时,新建一个JVM进程运行所有test. 这可能会导致乱码问题.首先将forkMode设置为never,即不新建.再运行mvn test,全部OK了.果然是这个问题!! 于是再找官方参数说明,发现了argLine参数,这个参数与forkMode一起使用,可以设置新建JVM时的JVM启动参数, 于是设置<argLine>-Dfile.encoding=UTF-8</argLine>,明确指定一下JVM的file.encoding,并将forkMode从never改回once, 还是每次新建一个JVM进程.再次运行mvn test,一起OK了,问题解决. 究其原因,是因为MAVEN的maven-surefire-plugin在新建JVM进程后,由于没有指定encoding, 采用了OS的默认编码,导致读取UTF-8文件(测试类的sql脚本文件)时出现乱码 部分 pom.xml 代码 <build> <plugins> <!-- 解决maven test命令时console出现中文乱码乱码 -->

JVM解毒——JVM与Java体系结构

笑着哭i 提交于 2020-03-02 10:53:42
你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重新背一遍JVM的一些原理概念性东西 这段广告语写的好,趁着在家办公学习下JVM,先列出整体知识点 Java开发都知道JVM是Java虚拟机,上学时还用过的VM也叫虚拟机,先比较一波 虚拟机与Java虚拟机 所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 Visaual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台 程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令 JVM 是什么 JVM 是 Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java虚拟机是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数

关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

匆匆过客 提交于 2020-03-02 09:16:28
一、前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”; 我当时的想法:方法中的局部变量在运行的时候,是存在JAVA栈中的,方法运行结束,局部变量也就都弹光了,理论上单线程的话是不会有问题的,我之所以不知道,是因为不清楚在JAVA内存模型中,一个线程对应一个栈,还是多个线程共享一个栈... 其实如果知道每个线程都有一个自己的JAVA栈的话,问题也就很清楚了,不会被其它线程给污染掉; 当然,问题并不能止于此,这个问题已经暴露出自己对这方面比较薄弱,因此打算对JAVA内存模型和多线程并发问题做个小小总结; 二、JAVA中的内存模型 程序运行的时候,内存主要由以下部分组成: 堆 :所有线程共享一个堆;存放的都是new 出来的对象;由垃圾回收器回收; 方法区 :所有线程共享一个方法区;里面存放的内容有点杂,可以认为是除堆和栈中的其它东西(如类信息,静态变量,常量,代码等);Java虚拟机规范规定可以不对方法区进行垃圾回收,当并不是不回收,主要看具体虚拟机的实现,比如可以回收一些废弃常量和无用的类; 程序计数器 :也叫PC,存放下一条指令所在单元的地址的地方; JAVA栈 :每个线程都有一个自己的JAVA栈;存放的一般是方法的局部变量,方法出口信息等

[Java] JAVA和JVM运行原理

元气小坏坏 提交于 2020-03-02 04:24:08
个人博客导航页(点击 右侧 链接 即可打开个人博客): 大牛带你入门技术栈 JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。 编译器负责把Java程序转成Class文件,方便Jvm来读取它. Jvm是java虚拟机,其实它就是解释器,把Class文件中的命令转成某种平台的命令,比如把Java命令转成Windows下的命令,然后Java程序就执行了. 这里和大家简单分享一下JAVA和JVM运行的原理,Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器 JAVA和JVM运行的原理 1.Java语言运行的过程 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行。 也相当与 注:JVM(java虚拟机)包括解释器,不同的JDK虚拟机是相同的,解释器不同。 2.JVM: JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器