JVM调优从0到1

JVM调优(jdk1.8)

老生常谈,面试吹牛的的最佳谈资,在接下来的几天里,我找了点资料来对其进行一波学习;

本地环境是不需要对我们的虚拟机进行优化的,一般在生产环境下,也就是Linux下才有对JVM优化的需求

JVM的运行参数

参数的类型有三种

在JVM中有很多的参数是可以设置的,这些参数我们把它分为三类

  • 标准参数(比较稳定的,在未来的版本更迭中,都不会丢失的,非标准的参数不能保证)
  • -X参数(也就是非标准的 java -X 查看所有的参数)
  • -XX参数(也是非标准参数,这种类型的参数一般都是用于JVM的调优改动)

java -help:查看命令,我们可以在里面找到上面所说的三种类型的的影子

Demo:标准参数

java -version :查看jvm的版本

java -showversion :查看kvm版本信息,并执行其后的其他命令(常用)

-D:设置系统参数,相当于上下文,我们可以添加K和V进去,然后拿到K的值

  • 首先我们去Linux上写一个测试类如下所示:
  • 然后我们去编译并运行它:
  • 可见是没有值的,下面我们就对“chen”这个K,设置Value,让他被获取到:
  • java -Dchen=HelloWorld test1:意思为设置系统属性”chen“,为其赋值为HelloWorld,然后再运行test1文件,
  • 最后输出结果已经可以发现,系统属性设置生效

-server 和 -client 模式

  • server模式的话,jvm的初始化堆空间会大一些,启动慢,但是后续的运行就非常的丝滑
  • client模式的话,jvm初始化的堆空间就会小一点,启动非常快,但是运行相对较卡
  • 这个都是了解部分,以为jvm在启动的时候会根据硬件和系统自动给我选择最合适的模式
  • 现在的机器基本都是64位的系统吧,64位的系统只支持server模型,只要机器给力都是选择server模式

Demo:-X参数 [ 调优参数]

我们可以通过java -X 这个命令去获取所有-x的参数列表

  

  • -Xms和-Xmx参数设置堆内存的初始化大小和最大大小

-Xmx2048m:表示设置JVM的最大堆内存为2048兆

-Xms512m:表示设置JVM的初始化堆内存为512兆

  • -Xint、-Xcomp、-Xmixed,这三个参数的配置
  • -Xint,解释模式,会强制jvm逐行执行所有的字节码,运行速度很明显的变慢
  • -Xcomp,编译模式,jvm在第一次使用时会把所有的字节码编译成本地代码(会卡一下),带来最大的优化效果
  • -Xmixed,混合模式,将解释模式与编译模式进行混合使用,由jvm自己决定,默认使用该模式

编译模式下会卡顿一下再弹出结果,这个值得注意一下,但这也是一种优化,后面执行就会非常流畅

  

Demo:-XX参数 [调优参数]

上面已经说到,-XX也是非标准参数,主要用于jvm的调优和debug的操作

-XX参数的使用分为两种方式,一种boolean类型,一种非boolean类型

  • boolean类型

    -XX[+/-]<name> :表示启动或者禁用某个属性,+:启动,-:禁用

    如:-XX:+DisableExplicitGC:表示开启禁用手动调用gc操作,也就是说System.gc无效

  • 非boolean类型

    -XX:<name>=<value> :表示name的值为Value

    如:-XX:NewRatio=1 :表示新生代和老年代的比值

查看当前JVM的运行参数

  • 运行Java命令时打印出运行参数

    • 执行:java -XX:+PrintFlagsFinal test1
    • 会得到一堆信息配置的信息,大部分的信息我们都看不懂,但还是有一点需要说明
    • 在我们得到的信息列表中都是KV结构的,V一般分为true/false或者为属性值这两种方式
    • k=V,这种通过=符号表示的,是使用的默认值
    • k:=V,这种方式表示已经被我们改动,是使用的我们给定的参数
  • 查看正在运行的java进程的参数

    • 启动一个tomcatu用于测试,下面我们通过jinfo命令查看所有的运行参数信息
    • jinfo -flags <进程id>:进程ID,我们可以通过ps -ef | grep tomcat 拿到,下面我们一起来看看
    • 通过上面这张体,可以发现,很多参数被被打印了,虽然我们大部分都不知道他的意思,但我们仔细读读还是有那么两个我们在上面讲过的
    • 如果我们只想单一的查看某个运行参数的值,我们可以通过下面这种方式获取:
    • jinfo -flag <参数名称> <进程id>,比如我们去获取最大的堆内存空间大小:

JVM的内存模型

你也可以 :回顾往日学习:jvm内存模型

或者我们再对其进行学习一次,内容如下:

原文地址:https://www.cnblogs.com/msi-chen/p/11651431.html

时间: 2024-10-09 08:17:52

JVM调优从0到1的相关文章

JVM调优-新生代

JAVA虚拟机新生代,包括eden space+2个survivor空间. 新生代用来存放新近创建的对象,新生代的特点是对象更新速度快,在短时间内产生大量的"死亡对象".对年轻代的垃圾回收称作次级回收 (minor gc) 1.新生代与次级回收 新生代分为三个区域,  一个eden spac , 2个大小相同的survivor,  应用程序只能使用一个eden和一个survivor, 当发生初级垃圾回收的时候,gc挂起程序, 然后将eden和survivorA中的存活对象复制到另外一个

JVM调优经验分享

前言 一.JVM调优知识背景简介 二.JVM调优参数简介 三.JVM调优目标 四.JVM调优经验 结束语 <br/> 本次分享探讨的JVM调优是指server端运行的JVM调优,适应版本为[1.6– 1.7], 不涉及最新的1.8版本. 假设线程池.连接池.程序代码等都已经做过优化,效果(系统吞吐量.响应性能)仍然不理想,我们就可以考虑JVM调优了. <br/> 一. JVM调优知识背景简介 1.堆与栈的概念 堆和栈是程序运行的关键:栈是运行时的单位,而堆是存储的单位. 栈解决程序

JVM调优

转自:http://blog.csdn.net/chen77716/article/details/5695893 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小. 年轻代(N

Spark性能调优之JVM调优

Spark性能调优之JVM调优 通过一张图让你明白以下四个问题 1.JVM GC机制,堆内存的组成                2.Spark的调优为什么会和JVM的调优会有关联?--因为Scala也是基于JVM运行的语言                3.Spark中OOM产生的原因                4.如何在JVM这个层面上来对Spark进行调优 补充:                Spark程序运行时--JVM堆内存分配比例 RDD缓存的数据(0.6)    默认 对象_

Tomcat的JVM调优实战

一些调优点在上篇日志中已写到,在此不做说明 直接使用Jmeter进行调优测试吞吐量Code package cn; import java.io.IOException; import java.util.Map; import java.util.WeakHashMap; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Htt

JVM调优及参数设置

(1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8. -XX:NewSize:设置年轻代大小 -XX:MaxNewSize:年轻代最大值 -XX:NewRatio 年老代与年轻代的比值 -XX:SurvivorRat

JVM 调优参数详解

GC有两种类型:Scavenge GC 和Full GC 1.Scavenge GC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor的两个区中. 2.Full GC 对整个堆进行整理,包括Young.Tenured和Perm.Full GC 比Scavenge GC要慢,因此应该尽可能减少Full GC,有如下原因可能导致Full GC a.Tenured被写满: b.P

jvm调优小结

不区分tomcat,resion等应用,主要是针对jvm调优 tomcat家目录下catalina.sh  catalina.bat 从http://unixboy.iteye.com/blog/174173 http://my.oschina.net/shootercn/blog/15393这个更详细 http://www.360doc.com/content/15/0429/15/7853380_466822446.shtml详细讲解-XX:ParallelGCThreads 学到了很多东西

【转 】JVM调优 网上一篇很好的文章 (复制摘要了 一边参考 )

为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象.线程.Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长.但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至