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. github插件

    可能是迄今为止最好的GitHub代码浏览插件,基本实现浏览器变成代码阅读器,支持目录列表,交叉索引等功能: O网页链接 ​​​​ http://weibo.com/1963193953/Fdj2cFQ ...

  2. centos安装wget 及配置

    yum -y install wget #yum -y install setup 本文 #yum install perl Searching for GCC... The path "& ...

  3. 你必须搞清楚的String,StringBuilder,StringBuffer

    String,StringBuilder 以及 StringBuffer 这三个类的关系与区别一直是 Java 的经典问题,这次就来讲一下关于这三个类的一些知识 一. 简单对比 String : 字符 ...

  4. Spring事务管理 与 SpringAOP

    1,Spring事务的核心接口 Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略.  ...

  5. [SharePoint2010开发入门经典]9创建更好的用户体验----silverlight

    本章概要: 1.了解Silverlight 2.理解为什么使用Silverlight 3.介绍如何集成SharePoint和Silverlight

  6. openstack通过Network Namespace和iptables实现租户私有网络互訪和L3路由功能

    安装架构介绍 本文旨在通过自己搭建类似neutron (openvswitch + gre) 实现SDN 的环境,学习了解其工作原理,模拟核心原理.比方:同一租户自己定义网络 instance 互通, ...

  7. POJ 1948

    这道题我记得是携程比赛上的一道. 开始时想直接设面积,但发现不可以,改设能否构成三角形.设dp[i][j][k]为前i根木棍构成边长为j和k的三角形,那么转移可以为dp[i][j][k]=dp[i-1 ...

  8. POJ 2407

    裸 的求欧拉函数 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...

  9. STL之效率比較

    1.vector 变长一维数组,连续存放的内存块,有保留内存.堆中分配内存: 支持[]操作,高效率的随机訪问: 在最后添加元素时,一般不须要分配内存空间,速度快:在中间或開始操作元素时要进行内存拷贝效 ...

  10. Android面试题集

    前几天整理了Java面试题集合,今天再来整理下Android相关的面试题集合.假设你希望能得到最新的消息,能够关注https://github.com/closedevice/interview-ab ...