• 先说重点:
  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 之网络编程

    网络模型 OSI 模型, 把网络通信的工作分为七层. TCP/IP 模型, 把网络通信的工作分为四层 应用层 传输层 网际层 主机至网络层 网络通信要素 (java.net 包) - IP 地址 (I ...

  2. 如何让socket编程非阻塞?

    import socket # 创建socket client = socket.socket() # 将原来阻塞的位置变成非阻塞(报错) client.setblocking(False) # 百度 ...

  3. (4.6)sql2008中的group by grouping sets

    最近遇到一个情况,需要在内网系统中出一个统计报表.需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 200 ...

  4. Hurst指数以及MF-DFA

    转:https://uqer.io/home/ https://uqer.io/community/share/564c3bc2f9f06c4446b48393 写在前面 9月的时候说想把arch包加 ...

  5. HDU2571:命运(简单dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2571 没什么好说的,不过要处理好边界. 代码如下: #include <iostream> # ...

  6. Hadoop的IO操作

    Hadoop的API官网:http://hadoop.apache.org/common/docs/current/api/index.html   相关的包 org.apache.hadoop.io ...

  7. Python 优雅的操作字典

    Python 中的字典是Python中一个键值映射的数据结构,下面介绍一下如何优雅的操作字典. 来源:https://www.linuxzen.com/python-you-ya-de-cao-zuo ...

  8. 笔记-CSS空背景图片会导致页面被加载两次

    如果页面样式的背景图片路径设置为'' 或 '#', 会导致页面被重复加载两次 (Chrome.56.0.2924.87 测试) 因为:空图片路径属性值,默认加载当前页面的URL作为图片路径 Safar ...

  9. Linux服务器内存cache清理

    发现cache中占用大量内存,无free内存可用 使用如下命令清理: syncsysctl -w vm.drop_caches=1 转自:http://blog.csdn.net/sky_qing/a ...

  10. LeetCode: Next Greater Element I

    stack和map用好就行 public class Solution { public int[] nextGreaterElement(int[] findNums, int[] nums) { ...