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类的类信 ...
随机推荐
- css div布局示例1(head-main-footer)
很简单的文档流布局 <!doctype html> <html lang="en"> <head> <meta charset=" ...
- IntelliJ IDEA 2017.3尚硅谷-----插件的使用
在 IntelliJ IDEA 的安装讲解中我们其实已经知道,IntelliJ IDEA 本身很多功能也都 是通过插件的方式来实现的.官网插件库:https://plugins.jetbrains.c ...
- 线性混合+ROI
相关代码: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namesp ...
- ❀❀ 名词解释(PM、PD、UE、UI、RD....)
PM:产品经理,项目负责人.一个产品,首先由PM来分析细分市场.目标客户的诉求,规划产品的卖点.杀手级应用,这个过程通常PD已经介入了,这个层面上,商业问题.业务逻辑的流畅是思考的焦点. 举凡产品从创 ...
- HTML学习(2)编辑器
HTML编辑常用的编辑器:Notepad++.Sublime Text.VS Code 可以使用Emmet插件来提高编码速度. 注:emmet只支持32位的Notepad++. 注意这里要把这两个dl ...
- Linux gd库安装步骤说明
gd 库是 PHP 处理图形的扩展库,它提供了一系列用来处理图片的 API(应用程序编程接口),使用 gd 库可以处理图片或者生成图片.在网站上,gd 库通常用来生成缩略图,或者对图片加水印,或者生成 ...
- jenkins发布.war包到本地tomcat
前提:保证jenkins构建打包成功 1.配置tomcat的用户名密码(此处tomcat为本地任意tomcat包,jenkins会通过Deploy war/ear to container配置的url ...
- python2.7 字符处理小节
unicode是字符集 utf-8,gbk是编码方式,将字符集编码为机器识别的字节码 #encoding: utf-8 s = "中文" #unicode的utf-8编码,\xE4 ...
- codeforces E. The Contest(最长上升子序列)
题目链接:https://codeforces.com/contest/1257/problem/E 题意:给三个序列k1,k2,k3,每个序列有一堆数,k1是前缀,k3是后缀,k2是中间,现可以从任 ...
- JS字符串的不可变性
js中的字符串特性->不可变性,字符串的值是不可变的 1.改变字符串中的字符 var str = "hello"; str[1] = "W"; conso ...