• 先说重点:
  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 之单例设计模式

    设计模式: 对问题行之有效的解决方式, 其实它是一种思想. 单例设计模式 解决的问题:就是可以保证一个类在内存中的对象唯一性. 即单个实例. 比如对于A 和 B 两个程序使用同一个配置信息对象时, A ...

  2. elastic search使用

    elastic使用 使用python时注意保持一个好习惯:不要使用类似str.type这样的变量名,很容易引发错误: https://blog.csdn.net/lifelegendc/article ...

  3. boost noncopyable类

    1. 当声明一个类时,编译器会自动为该类生成默认构造函数,复制构造函数,赋值操作符以及析构函数: 2.自动生成的各个函数和操作符都是public的: 3.当声明一个类不允许复制时,可以将一个类的复制构 ...

  4. Ecstore 会员中心 菜单添加一项

    1.会员中心 添加菜单 ecstore_合并支付总结_会员中心添加菜单_20160113 class : b2c_ctl_site_member (图 1)     第一步: (图1)         ...

  5. Visual Studio 正则表达式替换

    查找空行:^(?([^\r\n])\s)*\r?$\r?\n 查找多余的空行:^(?([^\r\n])\s)*\r?$\r?\n^(?([^\r\n])\s)*\r?$\r?\n

  6. (转载)Hibernate与Jpa的关系

    我知道Jpa是一种规范,而Hibernate是它的一种实现.除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实 ...

  7. Canvas:技术小结

    Canvas:技术小结 资料 [教程:MDN官方中文教程] https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial [ ...

  8. Kattis - wheretolive 【数学--求质心】

    Kattis - wheretolive [数学] Description Moving to a new town can be difficult. Finding a good place to ...

  9. nodejs入门-做一个代理服务器

    看到node.js的httpServer和http.request,第一个想法居然是可以用它做一个代理服务器下面代码,实现了代理的基本功能,通过网络的代理设置将你的浏览器的请求转到这个httpServ ...

  10. launch 文件解析

    roslaunch工具是ros中python实现的程序启动工具,通过读取launch文件中的参数配置.属性配置等来启动一系列节点: 很多ROS包或源码包中都有launch文件,一般为该程序包能够运行起 ...