在数据量和并发量极高的应用中,程序的健壮性和服务的稳定性一直是性能优化的一块重点区域,而GC则永远是程序中需要重点考虑的不稳定因素之一。

JVM调优大部分是调GC参数, GC参数主要关注三点:最大堆和最小堆大小;GC算法;新生代(年轻代)大小。

在JDK8及更早的版本, GC算法通常会在默认的Parallel和CMS中根据不同场合做选择, 新生代也要根据实际需求和自身经验手动调节大小才能达到性能和STW停顿的平衡.

而在JDK9及更新的版本中, 由于更为"智能"的G1成为默认,GC算法和新生代(年轻代)大小不用手动调节就能在大多数场合下达到几乎最优的性能, 通常只需配置最大堆容量和期望的STW暂停时间即可(不配置也可获得比较均衡合理的性能), 对技术能力和经验的要求大大降低了.

当然,我们需要明白的是:在没有全面监控、收集性能数据之前,调优就是瞎调。

本文为JDK 1.8下JVM调优系列文章的初识篇,主要普及基本的JVM组成和基本编译、运行原理。

JVM概述

JVM是Java Virtual Machine(Java虚拟机)的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

一个java类从.java到编译为.class再到通过JVM运行在windows和Linux机器上的流程如下:

大概解释下上面图中的流程:

我们在学Java的时候就知道一个基本常识:那就是Java语言是一次编译,多种平台上运行,也就是所说的跨平台。那么为什么Java能跨平台呢?专业的解释是Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行;通俗的解释是我们知道,一个文件在windows和Linux中会被解析成不同的二进制文件,那么其实我们的java文件在linux和windows上编译成class文件(字节码文件),它的机器码是不一样的,那么java是如何实现跨平台的呢?主要原因就是JVM内部针对不同的环境(windows、LinUx…)封装了不同的机器码处理程序(这就是为什么我们下载jdk时不同环境需要选择不同的jdk的最主要原因),当java被编译成class文件后,在不同的操作系统上,不同的JVM会将这个class文件转换成该操作系统所能处理的二进制,于是就实现了java所谓的一次编译、多地运行的目标。

JVM运行class字节码文件机制

class字节码文件是如何在JVM中运行的呢?

如下图,在运行class文件时候,JVM虚拟机首先会通过“类装在子系统”将.class文件加载到“运行时的数据区(也就是所说的内存模型)”中,最终由“字节码执行引擎”来一行行的运行“内存模型”中的代码。

我们知道JAVA虚拟机中最重要的就是运行时内存(内存模型),接下来我们就详细讲解“运行时数据区”的运行机制。

JVM运行时内存

我们对“堆”的概念都不生疏,刚学JAVA时我们就应该知道New出来的对象都是放到“堆”里面。而且我们应该知道,JVM调优主要调的就是这块,堆放到后面讲。首先我们要讲下栈(线程栈)的概念

“栈”,官方称之为“虚拟机栈(Java Virtual Machine Stacks)”,咱们可以通俗的把它理解为“线程栈”(只要有一个线程在运行,java就会从内存模型中的栈中给它分配一个内存空间,用来放线程内部的局部变量)。“线程栈”的主要作用是为了承载线程运行过程中的局部变量。

例如如下代码:public class Math

{

public static final int initData  = 666;

public static User      user      = new User();

public int              initData1 = 666;

public int compute()

{

int a = 1;

int b = 2;

int c = (a + b) * 10;

return c;

}

public static void main(String[] args)

{

Math math = new Math();

math.compute();

System.out.println("test");

}

}

当运行main方法时,JVM就会像下图一样给这个main线程分配一个栈:

当然,如果此时有第二个线程(线程2),那么JVM同样会给线程2创建一个栈。

当然,栈的内部其实很复杂,最直观的是栈内部有“栈帧”的概念。

所谓“栈帧”,指的就是当在当前线程中如果调用了其他方法(例如math.conpute()),此时就会在main线程的栈中再分出一块空间,用于存放该方法的局部变量(可以无限的创建内存统建),该被调用的方法结束,这这个内存空间消失,这就是栈帧。

如下图所示:

我们需要知道的是,栈的数据结构就是使用的数据结构中的栈(先进后出),之所以这样说,咱们可以参照上面的代码讲下:

首先在执行main方法时,JVM给main创建了一个内存空间(栈帧),然后在main方法中调用compute方法,此时,JVM给compute方法创建了一个内存空间(栈帧),当compute方法运行结束(局部变量销毁,栈帧销毁),继续执行main方法的sysout方法,然后main方法所在的栈帧销毁,遵循了先进后出的原则。

java jdk1.8 jvm_JDK1.8 JVM调优之初识JVM(一)相关推荐

  1. jvm调优二:jvm内存模型剖析和参数设置

    简述 在开始学习java的时候,我们知道java是一个跨平台的语言,为什么java能够跨平台,主要是因为jvm屏蔽了操作系统底层的差异.下面重点来研究下jvm.本次研究的jvm都是jdk1.8的jvm ...

  2. jvm调优五:jvm调优工具和调优实战

    jvm调优工具和调优实战 jvm自带常用命令 JPS jps是用于查看有权访问的hotspot虚拟机的进程id. 当未指定hostid时,默认查看本机jvm进程id -l:输出完整jar名称 -v:输 ...

  3. 【JVM调优工具】JVM调优工具

    一.JVM调优工具 1. jstat工具 jstat命令详解_zhaozheng7758的专栏-CSDN博客_jstat 干货:JVM 堆内存和非堆内存 - 茶轴的青春 - 博客园 [JVM]jsta ...

  4. JVM调优: 转载JVM调优总结

    转载自:http://unixboy.iteye.com/blog/174173 阅读这篇文章时请注意: 整个堆大小=年轻代大小 + 年老代大小, 而非整个堆大小=年轻代大小 + 年老代大小 + 持久 ...

  5. jvm 调优_Java架构—JVM调优

    1. JVM Tuning基础知识 1.1 Java堆结构 Java堆可以处于物理上不连续的内存空间上,只要逻辑上是连续的即可.Java堆就是各种对象分配和保存的内存空间,线程间共享.Java堆分为E ...

  6. JVM 调优实战--常用JVM命令:jps/jinfo/jstat/jmap/jstack/jhat

    jps:查看jvm进程: jinfo:查看完整jvm参数信息: jstat:查看堆内存使用情况,加载的class数量及大小.-gc查看垃圾回收统计: jmap:查看堆内存使用情况,jstat是统计,j ...

  7. JAVA之JVM调优-从eclipse开始

    一.概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程栈来分析代码中不合理的地方给予 ...

  8. JVM 调优参数总结

    JVM调优小结 杂谈 JVM参数 基本参数 其他参数 指针压缩 逃逸分析 Eden Old 较大对象对直接进入老年代 对象动态年龄判断 老年代空间分配担保机制 垃圾收集器 CMS收集器(-XX:+Us ...

  9. JVM调优全面探讨-性能设计沉思录(1)

    为什么要jvm gc可能是java程序猿或非java程序猿讨论最多的话题,到底怎么回事? 本篇内容:内存管理发展史,JVM内存管理分析和实践(基础知识),JVM8调优(内存运行原理和编译优化)  :2 ...

最新文章

  1. 使用Asible连接被控端SHH拒绝解决办法
  2. SpringBoot快速开发利器:Spring Boot CLI
  3. Recover it!
  4. paramiko 使用总结(SSH 操作远端机器)
  5. Injector Job深入分析
  6. 前端学习(2536) request和response
  7. linux如何启动wifi,【教程】Wii安装运行可用WIFI的Linux系统全攻略
  8. jQuery模拟下拉框单选框复选Select,Checkbox,Radio
  9. JavaWeb三大组件小结
  10. python基础: 选择语句
  11. list筛选数据 python_「每日一练」巧用python对列表进行筛选
  12. 道德经 道可道,非常道。
  13. leetcode 思路——64. 最小路径和——174. 地下城游戏
  14. ReleaseCapture 以及 SetCapture 函数 及其应用
  15. matlab 求obb,实验六MATLAB神经网络工具箱DOC
  16. Java 对象copy之BeanCopier工具类的使用
  17. 如何快速搭建自己的云桌面和云办公服务器软件系统
  18. ORA-04091:表XX发生了变化,触发器/函数不能读它
  19. 上海市“专精特新”中小企业认定条件、流程、奖励政策
  20. 微机原理(汇编语言)学习

热门文章

  1. numpy.reshape(与ndarray.reshape一样)使用方法
  2. 用python玩转数据测试答案_大学慕课2020用Python玩转数据章节测试答案
  3. docker hub push_如何制作Docker镜像(image)?
  4. Nginx代理介绍、安装及配置详解
  5. Activiti用户指南之Activiti的API
  6. 例子---PHP与Form表单终结篇
  7. 例子---年倒计时/JS日期对象类型
  8. mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据
  9. linux的vi命令输入C,Linux中C语言简单实现之vi篇(详细内容)
  10. js 拉勾网效果_借助JShaman,建立自己的JS代码混淆平台