0 引言

   JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点。

1 运行流程

  java代码通过编译之后生成字节码文件(class文件),通过:java HelloWorld执行,此时java根据系统版本找到jvm.cfg,再通过jvm.cfg文件找到对应的jvm.dll,jvm.dll则是java虚拟机的主要实现;初始化jvm,获取java本地接口,然后找到main方法,最后执行。详见下图

2 内存空间

  JVM内存空间包含:方法区、java堆、java栈、本地方法栈。

  方法区:是各个线程共享的区域,存放类信息、常量、静态变量。

  java堆:是线程共享的区域,我们的类的实例就放在这个区域,可以想象你的一个系统会产生很多实例,因此java堆的空间也是最大的。如果java堆空间不足了,程序会抛出OutOfMemoryError异常。内存溢出

  java栈:是每个线程私有的区域,它的生命周期与线程相同,一个线程对应一个java栈,每执行一个方法就会往栈中压入一个元素,这个元素叫“栈帧”,而栈帧中包括了方法中的局部变量、用于存放中间状态值的操作栈。

  本地方法栈:java栈类似,只不过它是用来表示执行本地方法的,本地方法栈存放的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。

  PC寄存器:程序执行的顺序,控制程序指令的执行顺序

  执行引擎:根据PC寄存器调配的指令顺序,依次执行程序指令。

2.1 内存溢出

  1. OutOfMemoryError:PermGen space(源程序中使用大量的jar或class)

    a、增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小;在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行: JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"

    b、清理应用程序中lib下的jar包

  2. OutOfMemoryError:Java heap space(java虚拟机创建的对象太多)

    a、检查程序是否有死循环或创建大量对象。

    b、增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

  3. OutOfMemoryError:unable to create new native thread(JVM已经被系统分配了大量的内存,并且它至少要占用可用内存的一半)

    a、jvm参数中添加-Xss128k将线程栈内存大小设置为128k

3 JVM配置参数

  JVM配置的参数分为三种:跟踪参数、堆分配参数、栈分配参数

3.1 跟踪参数

  1、当发生GC(垃圾回收)时,打印GC简要信息

  使用-XX:+PrintGC或-verbose:gc参数

  2、打印GC的详细信息以及堆使用详细信息

  使用-XX:+PrintGCDetails参数

  3、使用外部文件记录GC的日志

  使用-Xloggc:log/gc.log

  4、监控类的加载

  使用-XX:+TraceClassLoading

3.2 堆配置参数

  指定最大堆,最小堆:Xmx、Xms

  最大堆也就是Xmx参数指定的大小,表示java程序最大能使用多少内存大小,如果超过这个大小,那么java程序会报:out of memory(内存溢出)

  堆分配参数的总结

  永久区分配参数:-XX:PermSize -XX:MaxPermSize

  栈大小分配参数:栈大小参数为-Xss,通常只有几百k,决定了函数调用的深度,每个线程都有自己独立的栈空间。如果函数调用太深,超过了栈的大小,则会抛出java.lang.StackOverflowError,通常我们遇到这种错误,不是去调整-Xss参数,而是应该去调查函数调用太深的原理,是否使用递归,能不能保证递归出口等。

4 垃圾回收算法

  java语言与C语言最大的区别就是内存自动回收

  垃圾回收算法:1、引用计数法;2、标记清除

  垃圾回收器:

    1. 串行收集器:-XX:+UseSerialGC

    2. 并行回收器:

      a、ParNew回收器:-XX:+UseParNewGC

      b、Parallel回收器:-XX:+UseParallelGC

    3. CMS回收器:-XX:+UseConcMarkSweepGC

    4. G1回收器:-XX:+UseG1GC

JVM 原理的更多相关文章

  1. 学习重点:1、金典的设计模式在实际中应用2、JVM原理3、jui源代码

    学习重点:1.金典的设计模式在实际中应用 2.JVM原理 3.jui源代码

  2. JVM原理分析

    1 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收 ...

  3. Java面试之JVM原理总结

    1.什么是JVM? 答:JVM是Java Virual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现 ...

  4. 说说JVM原理?内存泄漏与溢出的区别?何时产生内存泄漏?

    1.JVM原理 JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以 ...

  5. JVM原理及内存溢出

    JVM原理及内存溢出

  6. Java程序员必了解的JVM原理以及虚拟机的运行过程

    JVM概念 虚拟机:指以软件的方式模拟具有完整硬件,VM概念 虚拟机:指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现.常用的虚拟机有VMWare ...

  7. (转)JVM原理讲解和调优

    背景:jvm实际调优在面试时候经常被问到,所以有必要认真总结一番. 转自:JVM原理讲解和调优 四.JVM内存调优 首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存 ...

  8. Java 面试题 三 <JavaWeb应用调优线程池 JVM原理及调优>

    1.Java Web应用调优线程池 不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文由浅入深,介 ...

  9. jvm出现OutOfMemoryError时处理方法/jvm原理和优化参考

    The heap stores all of the objects created by your java program.The heap's contents is monitored by ...

  10. 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高

    https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...

随机推荐

  1. js和java中URI的编码和解码

    js中对文字进行编码主要有三个函数:escape,encodeURI,encodeURIComponent: 对应解码为:unescape,decodeURI,decodeURIComponent 这 ...

  2. [模板]Link-Cut-Tree

    LCT模板. Orz了一下大佬的板子 Orz UPD(10.19):好像理解LCT了... LCT相当与把一个树剖分,分成实边和虚边,对于每一个实链用一个splay维护一下它的深度,然后当你想进行操作 ...

  3. 关于linux三种网络形式

    今天是开始的第一天,额,没什么仪式.舍友偶然间提醒我,应该把学习的东西,做一下规划和整理.我想一想也是对的.所以开通了这个.希望以后回来可以看看自己曾经的幼稚,那证明了我不断在学习在进步.最近在准备C ...

  4. redis各数据类型应用概述

    前言 redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存.亦可持久化的日志型.key-value数据库,并提供多种语言的API. 它是内存存储的数据结构服务器,可用作数据库.高速缓存 ...

  5. Vijos—— T 1359 Superprime

    https://vijos.org/p/1359 描述 农民约翰的母牛总是生产出最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们. 农民约翰确定他卖给买方的是真正的质数肋骨,是因 ...

  6. [SharePoint2010开发入门经典]12、SPS2010安全管理

    本章概要: 1.SPS中的用户授权 2.理解服务器场解决方案和沙箱解决方案的不同 3.理解表单验证和声明验证

  7. rails create方法ActiveModel::ForbiddenAttribute的问题

    rails create方法ActiveModel::ForbiddenAttribute的问题 def create @ad = Ad.new(ad_params) @ad.save end pri ...

  8. intel dpdk在ubuntu12.04中測试testpmd、helloworld程序

    一.測试环境 操作系统:ubuntu12.04   x86_64 dpdk版本号:1.6.0r2 虚拟机:vmware 10 网卡: Intel Corporation 82545EM Gigabit ...

  9. php+mysql 最简单的留言板

    学完了记得动手操作. 測试地址(未过滤) <html> <body> <head><meta http-equiv="Content-Type&qu ...

  10. 通过PowerShell卸载全部的SharePoint 2010 解决方式

    通过PowerShell卸载全部的SharePoint 2010 解决方式         为了演示.我常常须要拆毁再重建SharePoint 2010 环境.         我常常须要用到的操作就 ...