JVM 初始
我们刚学习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 初始的更多相关文章
- 什么?你们公司还没有将JVM初始和最大堆内存大小设置为相同值?
微信公众号:Java大家族 JVM将初始和最大内存大小设置为相同值的好处 启动应用程序时,我们指定初始内存大小和最大内存大小.对于在 JVM(Java 虚拟机)上运行的应用程序,初始和最大内存大小通过 ...
- HotSpot JVM常用参数设置
转自:https://www.zybuluo.com/jewes/note/57352 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也 ...
- JVM内存分配策略
在 JVM内存垃圾回收方法 中,我们已经详细讨论了内存回收,但是,我们程序中生成的对象是如何进行分配的呢?以下所述针对的是HotSpot虚拟机. 1.Java堆结构 以HotSpot为例,如下图: H ...
- jvm内存默认大小,及如何调整大小
jvm大小默认是64m,如果也要增大程序运行的内存,如果要调整JVM的大小,可以在run configuration中配置VM的参数 ,-Xmx100m表示配置其的大小为100M. 以下是一些配置的说 ...
- 有关JVM配置参数含义
1.参数的含义-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M-vmargs 说明后面是VM的参数,所以后面的其实都是JV ...
- JVM垃圾回收(GC)原理
一.基本垃圾回收算法 1.引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用则增加一个引用计数,删除一个引用则较少一个引用计数.垃圾回收时,只回收引用计数为0 ...
- jmap之使用说明与JVM配置
详情可参见:http://blog.csdn.net/fenglibing/article/details/6411953. 1 2. 3.vi 打开查看,具体介绍请看上述链接. 4.查看tomcat ...
- Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)
来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...
- jvm中的年轻代 老年代 持久代 gc
虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...
随机推荐
- Django教程(2)
from Django official document; Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发. from 编写你的第一个 Django 应用, ...
- Oracle的物理结构的三种文件
.dbf数据文件,是用于存储数据库数据的文件,例如表中的记录,索引,数据字典信息等,可以通过系统数据字典DBA_DATA_FILES查看相关信息.与逻辑角度的表空间(并不是真正的文件)对应,一个表空间 ...
- Markdown进阶教程
Markdown是很好用的轻量级标记语言,许多开发人员喜欢使用Markdown来记录学习心得和写博客.本篇博客主要介绍Markdown的高级技巧教程,Markdown的基础教程已经在上篇介绍过了. ...
- 用阿里fastJson解析Json字符串
一下总结来自工作代码: 1.第一种情况: 通过服务器端发送http请求获取的接送字符串. String jsonStr = HttpRequestUtil.sendGet(config.getAddr ...
- 在UTF-8页面中引入编码为GBK的JavaScript文件乱码问题了
原文地址:http://js8.in/2009/12/11/%E5%AF%B9%E5%BC%95%E7%94%A8%E5%A4%96%E9%83%A8javascript%E9%A1%B5%E9%9D ...
- kali linux2019.4安装启动后中文乱码
1.鼠标右键找到黑框框打开终端 2.终端执行后重启,乱码解决. sudo apt-get install ttf-wqy-zenhei
- Adobe 系列下载链接
(注意!:在下方链接前加上 "pan.baidu.com/s/" 才是正确网址,用"百度网盘"下载) Photoshop 专区(图像处理软件) Adobe Ph ...
- 16day 重定向符号:
>/1> 标准输出重定向符号 2> 错误输出重定向符号 >>/1> 标准输出追加重定向符号 2>> 错误输出追加重定向符号 如何将正确信息和错误信息都输 ...
- 514 ,css不同选择器的权重(css层叠的规则)
!important规则最重要,大于其它规则 行内样式规则,加1000 eg,<html> <head> </head> <body> & ...
- 源码安装python 报错,openssl: error while loading shared libraries: libssl.so.1.1
在执行openssl version出现如下错误: openssl: error while loading shared libraries: libssl.so.1.1: cannot open ...