• 先说重点:
  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. Java IO异常处理方式

    public class IOException{ // 获取系统默认的行分隔符 private static final String LINE_SEPARATOR = System.getProp ...

  2. Python 爬虫 学习一

    # coding: utf8 import requests from bs4 import BeautifulSoup PhotoName = 1 DATA = [] def save_img(ur ...

  3. 前端基础-css(3)

    一.文本属性和字体属性(常用的) 1.文本属性 text-align:left|right|center|justify(两端对齐,只适用于英文);   /*对齐方式*/ color:色值;   /* ...

  4. Pycharm在创建py文件时,自动添加文件头注释

    依次File -> Settings -> Editor -> File and Code Templates -> Python Script   添加以下代码: # -*- ...

  5. STL sort “invalid operator <”

    跟踪了下,是比较函数(下面的_Pred)的问题: template<class _Pr, class _Ty1, class _Ty2> inline bool _Debug_lt_pre ...

  6. ES6的十个新特性

    这里只讲 ES6比较突出的特性,因为只能挑出十个,所以其他特性请参考官方文档: /** * Created by zhangsong on 16/5/20. *///    ***********Nu ...

  7. shell文件安全与权限 笔记

    主要学习: 文件盒目录的权限 Setuid Chown和chgrp Umask 连接符号 一个文件已经创建,就具有三种访问方式 读,可以显示该文件的内容 写,可以编辑或删除它 执行,如果该文件时一个s ...

  8. Spring 之定义切面尝试(基于 XML)

    有些场景下只能基于 XML 来定义切面. [Spring 之定义切面尝试] 1.XML 下定义切面(首先是要有一个对应的类...显然要比基于注解的麻烦) <?xml version=" ...

  9. MySQL行级锁和表级锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  10. cordova 5.0版本说明

    2015/04/21发布Cordova 5.0.0! 1)插件从Cordova plugins registry(CPR)全部移到npm,并且重新命名 ***org.apache.cordova.* ...