java jdk1.8 jvm_JDK1.8 JVM调优之初识JVM(一)
在数据量和并发量极高的应用中,程序的健壮性和服务的稳定性一直是性能优化的一块重点区域,而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(一)相关推荐
- jvm调优二:jvm内存模型剖析和参数设置
简述 在开始学习java的时候,我们知道java是一个跨平台的语言,为什么java能够跨平台,主要是因为jvm屏蔽了操作系统底层的差异.下面重点来研究下jvm.本次研究的jvm都是jdk1.8的jvm ...
- jvm调优五:jvm调优工具和调优实战
jvm调优工具和调优实战 jvm自带常用命令 JPS jps是用于查看有权访问的hotspot虚拟机的进程id. 当未指定hostid时,默认查看本机jvm进程id -l:输出完整jar名称 -v:输 ...
- 【JVM调优工具】JVM调优工具
一.JVM调优工具 1. jstat工具 jstat命令详解_zhaozheng7758的专栏-CSDN博客_jstat 干货:JVM 堆内存和非堆内存 - 茶轴的青春 - 博客园 [JVM]jsta ...
- JVM调优: 转载JVM调优总结
转载自:http://unixboy.iteye.com/blog/174173 阅读这篇文章时请注意: 整个堆大小=年轻代大小 + 年老代大小, 而非整个堆大小=年轻代大小 + 年老代大小 + 持久 ...
- jvm 调优_Java架构—JVM调优
1. JVM Tuning基础知识 1.1 Java堆结构 Java堆可以处于物理上不连续的内存空间上,只要逻辑上是连续的即可.Java堆就是各种对象分配和保存的内存空间,线程间共享.Java堆分为E ...
- JVM 调优实战--常用JVM命令:jps/jinfo/jstat/jmap/jstack/jhat
jps:查看jvm进程: jinfo:查看完整jvm参数信息: jstat:查看堆内存使用情况,加载的class数量及大小.-gc查看垃圾回收统计: jmap:查看堆内存使用情况,jstat是统计,j ...
- JAVA之JVM调优-从eclipse开始
一.概述 什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配.回收的情况来调整各区域内存比例或者gc回收的策略:更深一层就是根据dump出来的内存结构和线程栈来分析代码中不合理的地方给予 ...
- JVM 调优参数总结
JVM调优小结 杂谈 JVM参数 基本参数 其他参数 指针压缩 逃逸分析 Eden Old 较大对象对直接进入老年代 对象动态年龄判断 老年代空间分配担保机制 垃圾收集器 CMS收集器(-XX:+Us ...
- JVM调优全面探讨-性能设计沉思录(1)
为什么要jvm gc可能是java程序猿或非java程序猿讨论最多的话题,到底怎么回事? 本篇内容:内存管理发展史,JVM内存管理分析和实践(基础知识),JVM8调优(内存运行原理和编译优化) :2 ...
最新文章
- 使用Asible连接被控端SHH拒绝解决办法
- SpringBoot快速开发利器:Spring Boot CLI
- Recover it!
- paramiko 使用总结(SSH 操作远端机器)
- Injector Job深入分析
- 前端学习(2536) request和response
- linux如何启动wifi,【教程】Wii安装运行可用WIFI的Linux系统全攻略
- jQuery模拟下拉框单选框复选Select,Checkbox,Radio
- JavaWeb三大组件小结
- python基础: 选择语句
- list筛选数据 python_「每日一练」巧用python对列表进行筛选
- 道德经 道可道,非常道。
- leetcode 思路——64. 最小路径和——174. 地下城游戏
- ReleaseCapture 以及 SetCapture 函数 及其应用
- matlab 求obb,实验六MATLAB神经网络工具箱DOC
- Java 对象copy之BeanCopier工具类的使用
- 如何快速搭建自己的云桌面和云办公服务器软件系统
- ORA-04091:表XX发生了变化,触发器/函数不能读它
- 上海市“专精特新”中小企业认定条件、流程、奖励政策
- 微机原理(汇编语言)学习
热门文章
- numpy.reshape(与ndarray.reshape一样)使用方法
- 用python玩转数据测试答案_大学慕课2020用Python玩转数据章节测试答案
- docker hub push_如何制作Docker镜像(image)?
- Nginx代理介绍、安装及配置详解
- Activiti用户指南之Activiti的API
- 例子---PHP与Form表单终结篇
- 例子---年倒计时/JS日期对象类型
- mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据
- linux的vi命令输入C,Linux中C语言简单实现之vi篇(详细内容)
- js 拉勾网效果_借助JShaman,建立自己的JS代码混淆平台