• 先说重点:
  1. 对象在堆区
  2. 方法在栈区
  3. 变量在方法区,常量池在方法区
  • 为什么要了解Java 虚拟机 ?

  这个问题一直困惑了我很长一段时间,其实在我们开发的过程中,即使我们不了解JVM也能正常的开发,但是当遇到如何优化代码,如何调优程序性能,当我们碰到内存泄漏的时候如何去解决,如何正确使用GC即垃圾回收等问题时,我们想有更好的解决办法,我们就必须去了解Java虚拟机,工欲善其事,必先利其器。Java虚拟机是程序运行最基础的存在。

  • 了解Java JVM

  想了解Java虚拟机必须要先了解Java内存分布,下面盗一下《深入理解Java虚拟机》书中的图:

我们从图中可以看到程序在运行时在内存中分布有五块区域,下面分别简单说明一下各个区域的作用:

  1. 程序计数器:程序计数器又叫线程计数器,每一个线程都有一个线程计数器,为什么要设置这个线程计数器,这里很重要,JVM在运行多线程的时候是通过线程轮流切换分配执行时间来实现的,无论在任何时刻,每个处理器都只会执行一个线程中的指令,在线程之间切换的时候,JVM要记录线程执行到了哪一行,而这个线程计数器就起到记录哪一行的作用。
  2. 虚拟机栈:平时我们说的栈也就是指的是Java虚拟机栈,和程序计数器一样,虚拟机栈也是线程私有的,在项目中,每个方法在执行的同时都会创建一个栈帧(栈帧是编译器在调用函数时涉及到的调用信息的记录单元),用于存储局部变量表,操作栈数,动态链接,方法出入口等信息。每个方法从调用到执行完成的过程就是一个栈帧从进栈到出栈的过程。
  3. 本地方法栈:与虚拟机栈基本相同,唯一的区别是虚拟机栈执行Java方法,而本地方法栈执行native方法。
  4. 方法区:方法区是线程共享的区域,存储虚拟机加载的类信息、静态变量、常量、即时编译的代码等。
  5. 堆:Java堆也是线程共享的一块区域,并且是JVM管理的内存中最大的一块,主要存储对象的实例。
  • 在什么情况下JVM会出现内存溢出

  原则:其实Java虚拟机也遵循万物规律--满则溢

  1. 如果当Java虚拟机允许动态扩展Java虚拟机栈内存的时候,当扩展到没有分配到内存的时候,就会报OutOfMemoryError异常,也就是内存溢出。扩展:当Java虚拟机在分配内存时,无法分配程序申请的内存时,会出现内存泄漏,一次内存泄漏影响不大,但随着内存泄漏的累积就会出现内存溢出;
  2. 当堆中没有内存完成对象实例分配,或者堆内存无法扩展的时候,将会抛出OutOfMemoryError异常;当前虚拟机都是可以扩展的;
  3. 当Java虚拟机无法满足方法区的内存分布的时候,也会抛出OutOfMemoryError异常;

到此为止我所理解的JVM相关知识就这些了,希望各位大大指正和补充。谢谢!

  

java JVM 随笔的更多相关文章

  1. Java (JVM) Memory Model – Memory Management in Java

    原文地址:http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java Understanding JV ...

  2. JAVA JVM虚拟机选项:Xms Xmx PermSize MaxPermSize 区别

    Xms : 是指设定程序启动时占用内存大小.一般该值设置大的会使程序启动快,但是可能会使本机暂时变慢. Xmx : 是指设定程序运行期间最大可占用的内存大小,如果程序运行需要占用更多的内存,超出这个 ...

  3. Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis

    目录 . JAVA JVM . Java JNI: Java Native Interface . Java Create New Process Native Function API Analys ...

  4. Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解

       我们知道在多线程编程中,我们很大的一部分内容是为了解决线程间的资源同步问题和线程间共同协作解决问题.线程间的同步,通俗我们理解为僧多粥少,在粥有限情况下,我们怎么去防止大家有秩序的喝到粥,不至于 ...

  5. Java JVM 多态(动态绑定)

    Java JVM 多态(动态绑定) @author ixenos 摘要:绑定.动态绑定实现多态.多态的缺陷.纯继承与扩展接口.向下转型与RTTI 绑定 将一个方法的调用和一个方法的主体关联起来,称作( ...

  6. Java JVM 内存泄漏--全解析和处理办法 [ 转载 ]

    Java JVM 内存泄露——全解析和处理办法 [转载]   @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a         JA ...

  7. Java JVM使用哪种编码格式

    Java JVM使用哪种编码格式 A ASCII characters  B Unicode characters C Cp1252 D UTF-8 E GBK F GBK2312 答案:B   在J ...

  8. Apache Curator is a Java/JVM client library for Apache ZooKeeper

    http://curator.apache.org/index.html Welcome to Apache Curator What is Curator? Curator n ˈkyoor͝ˌāt ...

  9. Java JVM监控工具JConsole简介

    Java JVM监控工具JConsole简介 jconsole命令 功能:打开java监视管理控制台 方法: jconsole [选项1] [选项2] …… [选项n] 常用选项: -help     ...

随机推荐

  1. SpringMVC 之数据转换和国际化

    1. 数据绑定流程 SpringMVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象; ...

  2. JS和CSS的初步入门(JS可以取得所有p的内容并显示)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  3. 我的Android进阶之旅------>解决Android Studio报错:DefaultAndroidProject : Unsupported major.minor version 52.0

    问题描述 今天使用Android Studio 2.0打开我之前的项目时,编译报了如下错误: Error:Cause: com/android/build/gradle/internal/model/ ...

  4. 我的Android进阶之旅------>关于使用CSDN-markdown编辑器来编写博客

    关于使用MarkDown编辑器的原因 什么是 Markdown 制作一份待办事宜 Todo 列表 书写一个质能守恒公式LaTeX 高亮一段代码code 高效绘制 流程图 高效绘制序列图 绘制表格 更详 ...

  5. python数据类型三(字典)

    一.字典的介绍 字典(dict)是python中唯一的一个映射类型,它是以{}括起来的键值对组成,在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存 ...

  6. idea导入项目出现Unable to import maven project: See logs for details提示(转载)

    摘要: 从git上面check多工程项目后,maven不能正常下载相应的依赖,最后查询国外网站,找出错误原因.按照此步骤,可以自动配置好每个工程的module. 删除项目根目录下.idea文件夹 关闭 ...

  7. java 多线程 day01 创建线程

    线程,即代码的执行路径java 面向对象编程.所以线程在java中也是用对象来表示的,创建线程对象的类就是 Thread如下代码即开启一个新的线程,通过线程对象的start方法,即可启动线程 Thre ...

  8. BCrypt 加密实现

    Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...

  9. MySQL 数据类型(Day41)

    一.介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的高度,但宽度是可选的. mysql数据类型概览 #1.数字:(默认都是有符号,宽度指的是显示宽度,与存储无关) ...

  10. 在python中有多少种运算符?解释一下算术运算符

    在python中,我们有7种运算符:算术运算符.关系运算符.赋值运算符.逻辑运算符.位运算符.成员运算符.身份运算符 我们有7个算术运算符,能让我们对数值进行算术计算 1.加号(+),将两个值相加 2 ...