JVM相关之JVM运行参数和内存模型

Jvm优化
了解下我们为什么要学习 JVM优化
掌握 jvm的运行参数以及参数的设置
掌握 jvm的内存模型(堆内存)
掌握 jamp命令的使用以及通过MAT工具进行分析
掌握定位分析内存溢出的方法

为什么要学习JVM优化
JVM被称为Java虚拟机,所有Java程序的运行都依赖于JVM
1.应用运行一段时间后突然停止,程序没有响应
2.服务器的CPU突然升高
3.在多线程应用下,如何去分配线程数量
。。。。。。。。。。。。。。。。。。。。。。。
优化JVM目的是为了让程序运行的更快

JVM运行参数

合理的调整JVM参数,也能够加快运行速度
标准参数

无论如何更新迭代版本,标准参数不会进行更改
-version
-help
-X参数,非标准参数:在更新迭代过程中,有一些参数信息是变化的
-Xms 初始内存
-Xmx 最大内存
-XX参数,非标准参数:专门做优化和debug用的,使用率比较高
-XX:+UseSerialGC

标准参数:一般来说标准参数比较稳定,我们可以使用java -help来查看所有的标准参数
java -help查看所有的标准参数

java -version查看版本

java -D设置系统参数

设置系统参数

1).使用idea中的application中vm options设置参数

2).使用命令创建参数

-server和-client有什么区别
ServerVM模式当中:

初始堆空间会大一些,

默认使用的是并行垃圾回收器,

启动慢,运行快

ClientVM模式当中:

初始堆空间相对小一些,使用串行垃圾回收期,

目的是为了让JVM启动速度更快一些,运行就比ServerVM慢一些

JVM运行的时候是根据操作系统选择运行的模式
如果是32位的window操作系统,默认使用的client
如果在其他系统上,只要有2G以上的内存以及至少两个以上的CPU那么默认使用Server模式
在64位操作系统当中只有Server模式,不支持Client模式

-X非标准参数
在不同版本的JVM当中,参数可能有所不同,通过java -X查看非标准参数列表

1.非标准参数列表的三种模式
-Xint:解释模式(interpreted model),强制要求JVM执行所有的字节码,效率低
-Xcomp:编译模式,与-Xint相反,第一次会将所有的字节码编译成本地的代码,第一次运行慢,后续运行快
万一我们有一些字节码只需要编译一次
-Xmixed:混合模式,就是解释模式和编译模式混合使用,有jvm自身决定应该采用哪种模式,jvm默认的默认

-XX参数:也是非标准参数,主要用于JVM调优和Debug操作
-XX参数有两种模式:
1.boolean类型 +代表true,代表应用该参数 -代表false代表不应用该参数
2.非boolean模式
-XX:NewRatio=1
3.默认情况下没有禁用手动调用GC,也就是说程序员可以手动调用,手动回收
禁用手动调用垃圾回收器,程序员手动调用gc是无效的 java -showversion -XX:+DisableExplicitGC xxx

-Xms -Xmx参数调整堆内存大小
-Xms代表初始的堆内存大小 -Xmx代表最大堆内存大小
java -Xms512m -Xmx1024m JVMTest

-Xms512m等价于-XX:InitialHeapSize
-Xmx2018m等价于-XX:MaxHeapSize

查看Java程序运行时使用的参数
java -XX:+PrintFlagsFinal JVMTest,查看过程中发现有=和:=,=代表默认值 :=代表修改过的值
更改参数信息:java -XX:+PrintFlagsFinal -XX:+VerifySharedSpaces -version

查看当前正在运行的Java的参数
jps命令查看当前所有正在运行Java进程
jps -l 查看当前所有正在运行Java进程详细信息
查看正在运行的Java进程信息jinfo -flags 进程id
查看进程的参数信息:jinfo -flag MaxHeapSize 6752

内存模型
jdk1.7的内存模型
1.年轻代:新创建的对象,比如new的对象,在对象比较小会放在年轻代当中存储
2.年老代:如果当前创建对象比较大,不经过年轻代直接放在年老代当中,年轻代通过多次垃圾回收期没有回收掉的对象也会放在年老代当中
3.永久代:比如我们部署一个程序到Tomcat当中,Tomcat启动的时候要去加载所有的Class,以及Method,以及Field都会存放在永久代当中

jdk1.8的内存模型
1.年轻代:新创建的对象,比如new的对象,在对象比较小会放在年轻代当中存储
2.年老代:如果当前创建对象比较大,不经过年轻代直接放在年老代当中,年轻代通过多次垃圾回收期没有回收掉的对象也会放在年老代当中
3.MetaSpace元数据空间

1.8版本以后废除了永久代,因为要融合JRocket VM虚拟机使用,JRocket VM虚拟机不支持永久代,所以废除了

现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen。

基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。

通过jstat命令进行查看堆内存使用情况

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

查看class加载统计

查看编译统计

垃圾回收统计

原文地址:https://www.cnblogs.com/wishsaber/p/12404178.html

时间: 2024-10-11 08:11:04

JVM相关之JVM运行参数和内存模型的相关文章

JVM虚拟机(五):JDK8内存模型—消失的PermGen

一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈: 每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫"栈帧"的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用).操作数栈.方法出口等信息.栈的大小可以固定也可以动态扩展.当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误,不过这个深度范围不是一个恒定的值,我们通过下面这段程序可以

JVM学习(五):Java内存模型

1.Java内存模型(Java Memory Model,JMM):线程.主内存和工作内存.所有的变量都存储在主内存(虚拟机内存的一部分)中,每条线程还有自己的工作内存.线程对变量的所有操作(读取.赋值等)必须在工作内存中进行,不同线程之间无法直接访问对方工作内存中的变量,需要通过主内存来完成. 2.如果要把一个变量从主内存复制到工作内存,就要顺序地执行read和load操作,如果要把变量从工作内存同步回主内存,就要顺序地执行store和write操作. 3.由于volatile变量只能保证可见

JVM内存模型以及HotSpot的GC策略

概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳理. 什么是Java的内存模型? 众所周知,Java程序是运行在JVM上面的,但是不具体指定是哪一款JVM,只要是符合一定的规范的JVM,都可以正确的运行Java字节码.该规范由Oracle官方提供,旨在描述一个抽象的JVM,它包含很多部分,包括class文件结构.运行时内存状态.指令集等. 而上述

深入理解JVM JVM内存模型

1.JVM内存模型        说起JVM内存模型,都是知道是Java方法区.Java栈.Native方法区.Java堆和程序计数器五部分,不过具体是做什么的,又有什么关系可能大家就不太清楚了,所以话不多说,直接上干货. 首先是JVM内存规范. 编译器和类加载在上篇博客已经讲了,不了解的可去看一下.现在主要就是运行时数据区了.具体请看下图 先给简单介绍一下什么是堆.桟.方法区以及格子 首先就是堆与栈分开设计是为什么呢? 栈存储了处理逻辑.堆存储了具体的数据,这样隔离设计更为清晰堆与栈分离,使得

深入理解JVM(一)——JVM内存模型

JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. 下面对这五个区域展开深入的介绍. 1. 程序计数器 1.1. 什么是程序计数器? 程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器.也就是说,程序计数器里面记录的是当前线程正在执行的那一条字节码指令的地址. 注:但是,如果当前线程正在执行的是一个本地方法,那么此时程

多线程并发之java内存模型JMM

多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果按一条线程执行将会在很多节点产生阻塞,使计算效率低下.另外,服务器端是java最擅长的领域,作为服务器必须要能同时响应多个客户端的请求,同样需要多线程的支持.在多线程情况下,高并发将带来数据的共享与竞争问题,tomcat作为中间件将多线程并发等细节尽量封装起来处理,使用户对多线程透明,更多地关注业务

Java 内存模型及GC原理 (转载)

一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存

【转】Java 内存模型及GC原理

一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存

浅析Java的内存模型

一.前言 ??之前过年在家,空闲时间比较多,想要了解一下JVM相关的内容,于是买了<深入理解Java虚拟机>这本书,过了一遍其中的基础知识.时隔多日,都忘得差不多了.为了重新捡起来,我决定复习一遍,并编写相关的系类博文加深印象,这是第一篇,来讲一讲JVM最基础的内容--Java的内存模型. 二.正文 ?2.1 Java内存分布 ??Java的内存主要分为五个部分: 程序计数器: Java虚拟机栈: 本地方法栈: 堆内存: 方法区: ??具体结构如下图所示: 2.2 程序计数器 ??首先看第一部