我们刚学习java的时候,从来没有想过new一个对象后,需要我们手动去管理过他的内存空间释放,因为我们知道java有GC垃圾回收器这哥们的存在,他会帮我们处理好一切,这就好比我是皇帝,我想在哪建个行宫就在哪建,至于打扫战场的事儿,跟我没有关系,有总管专门去处理这件事情,似乎我们也极少碰见过内存溢出或者内存泄露这种事,看上去似乎是那么的洒脱,可问题就出在这里,因为这就相当于我们把内存管理的权限下放了,下放给了jvm虚拟机,而一旦出现内存泄露或者内存溢出时,如果你不对你这个总管的工作原理以及内部运作机制不了解,解决这个问题将会比较困难。

  我们写的java程序运行在jvm中,而jvm虚拟机会根据不同的需求,把它自己管理的内存区划分为几个重要的区,每个区域的作用也更不相同。

一,JVM运行时内存

  1,方法区

  程序里面写的变量,静态变量,已被jvm加载的类信息等都会存在这个片区,该片区被所有线程共享。

  2,本地方法栈

  为本地方法提供相关的一系列服务,需要注意的是该区也会抛出内存溢出和泄露的异常(什么是本地方法?有时java应用需要与java外面的环境交互,比如用java写的程序需要与一些底层系统或某系硬件交互时,本地方法正是这样的一种交流机制,它为我们提供了一个非常简洁的接口封装,直接调用即可,不需要关注底层的实现细节。)

  3,程序计数器

  该区占用内存空间较小,用途就是用来计数的,可以看成是线程执行的字节码的行号指示器,字节码解释器工作时是通过改变该计数器的值来选取下一条要执行的字节码指令,如分支、循环、跳转、线程恢复等功能,依赖于该计数器。

  在这里多说一点,一个cpu同一时间片段,只能执行一条线程中的指令,当线程切换恢复至自身执行时,也是由该计数器找到正确的执行位置,为了达到这么目的,所以每个线程都有自己的独立程序计数器,线程之间互不影响,独立数据,这就是真正的”私有内存“

  4,堆

  该区是jvm管理的内存中分配最大的一块空间,原因是这里面将会存放所有你通过new出来的对象实例分配,并且该区域是被所有线程共享的一块内存区域、该区域是GC垃圾收集器管理收集的主要区域。

  5,栈

  该区为线程私有,声明周期与线程保存一致,描述的是java方法执行的内存模型,每个方法执行时会创建一个栈帧,用于存储局部变量,操作数据,方法出口等。可以这样理解:当你调用一个方法时,调用开始理解为入栈,内部执行完毕结束为出栈。

二,直接内存

  该区域不属于jvm运行时管理数据去的一部分,也并非jvm定义的内存区域,那这块区域是啥呢? 是分配给jvm内存之外的你剩余的直接内存区域部分,这里得提到一个类,NIO,它可以通过调用本地方法函数库直接分配jvm堆外的内存,并通过java对重的对象作为这块内存的引用进行操作,很显然,这块内存的分配不会受制于jvm堆大小的限制,但是受制于本机总的物理内存的限制。当做虚拟机调优时,不能忽略这块内存的参数设置,一旦设定的内存区域综合大于物理内存时,一样会出现内存溢出等错误。

JVM 初始的更多相关文章

  1. 什么?你们公司还没有将JVM初始和最大堆内存大小设置为相同值?

    微信公众号:Java大家族 JVM将初始和最大内存大小设置为相同值的好处 启动应用程序时,我们指定初始内存大小和最大内存大小.对于在 JVM(Java 虚拟机)上运行的应用程序,初始和最大内存大小通过 ...

  2. HotSpot JVM常用参数设置

    转自:https://www.zybuluo.com/jewes/note/57352 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也 ...

  3. JVM内存分配策略

    在 JVM内存垃圾回收方法 中,我们已经详细讨论了内存回收,但是,我们程序中生成的对象是如何进行分配的呢?以下所述针对的是HotSpot虚拟机. 1.Java堆结构 以HotSpot为例,如下图: H ...

  4. jvm内存默认大小,及如何调整大小

    jvm大小默认是64m,如果也要增大程序运行的内存,如果要调整JVM的大小,可以在run configuration中配置VM的参数 ,-Xmx100m表示配置其的大小为100M. 以下是一些配置的说 ...

  5. 有关JVM配置参数含义

    1.参数的含义-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M-vmargs 说明后面是VM的参数,所以后面的其实都是JV ...

  6. JVM垃圾回收(GC)原理

    一.基本垃圾回收算法 1.引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用则增加一个引用计数,删除一个引用则较少一个引用计数.垃圾回收时,只回收引用计数为0 ...

  7. jmap之使用说明与JVM配置

    详情可参见:http://blog.csdn.net/fenglibing/article/details/6411953. 1 2. 3.vi 打开查看,具体介绍请看上述链接. 4.查看tomcat ...

  8. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  9. jvm中的年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

随机推荐

  1. Tomcat/conf/server.xml文件中docBase和path的说明

    Tomcat的项目部署方式有以下三种: 1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法.2.在tomcat安装目录中有一个conf文件夹,打 ...

  2. linux命令 mv

    后缀--backup=<备份模式>:若需覆盖文件,则覆盖前先行备份: -b:当文件存在时,覆盖前,为其创建一个备份: -f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目 ...

  3. please execute the cleanup command

    解决方法: (1)用dos命令进入项目文件夹,运行svn cleanup:不要直接右键点击找cleanup选项 (2)到上一层目录去cleanup试下,或者到.svn文件夹下(隐藏的)找到所有的loc ...

  4. LitElement(二)模板编写基本语法

    原文:https://lit-element.polymer-project.org/guide/templates 1.定义一个渲染模板 1.1 基本规则 要用LitElement 组件定义一个模板 ...

  5. FLAG-回归C++,JAVA什么的等学校教吧

    以后刷OJ还是写C++,昂啊! 除非我觉得JAVA更好用

  6. 快速排序 QuickSort (C++迭代,递归)

    /* * QuickSort.h * 快速排序(将每一个元素转换为轴点元素) * Created on: 2020年2月12日 * Author: LuYonglei */ #ifndef SRC_Q ...

  7. centos安装虚拟机,桥接网络连接失败

    centos安装虚拟机,桥接网络连接失败 待办 即使是虚拟机也要在网络选择网桥连接方式之后,点击连接网线才可以,虚拟机都是按照有线进行连接的.

  8. IE的css hack

    #element { color:orange; } #element { *color: white; } /* IE6+7, doesn’t work in IE8/9 as IE7 */ #el ...

  9. docker启动容器报错:iptables failed

    问题描述: 启动Docker容器的时候 Error response / --dport -j DNAT --to-destination ! -i docker0: iptables: No cha ...

  10. linux虚拟机安装jenkins及maven/jdk配置

    一.jenkins安装 (1)tomcat下载,下载地址:https://tomcat.apache.org 选择对应的版本,以下以新版的tomcat 9.0版本为例 下载zip包 (2)jenkin ...