栈管运行,堆管存储!!!

  栈呢,也叫作栈内存,主要管java程序的运行,在线程创建时创建,生命周期和线程一致,只要线程一结束,该栈就被GC,是线程私有的。基本类型的变量和对象的引用数据类型的变量都在栈内存中调用。

栈存储什么?

  大体可以分为3类:

    1.本地变量:输入参数和输出参数以及方法付内的变量

    2.栈操作:记录入栈、出栈的操作

    3.栈帧数据:包括类文件、方法等等

栈运行原理

  栈中的数据都是以栈帧的格式存在,当存储一个数据时,产生一个栈帧F1,并且被压入了栈中;其实再存入数据时,会再产生一个栈帧F2,也被压入了栈中。。。。。执行完毕时,后被压入栈中的数据会先被弹出,符合“先进后出,后进先出”原则。

静态方法存储在方法区,跑到栈区,只是在运行时,临时跑过去,类似于你请人来家里帮忙,但是这个人并不是你家里的人。

jvm优化主要是共享的数据区即方法区和堆中。

JVM分类

  Sun公司的Hotpot(平时最常用)

  BEA公司的JRockit

  IBM公司的J9 VM

BEA公司最有名的产品是WebLogic, Web服务器,比tomcat性能高很多倍!

 

伊甸区(占内存的约80%):

      程序运行时,所有的数据,当达到70%时,程序会运行GC垃圾回收机制,其实没有被调用的数据就会被回收,若是被调用则会存储到幸存者0区。

幸存者0区(占内存的约10%):

      在伊甸区中,没有被GC回收的数据会被保存在这里。

幸存者1区(占内存的约10%):

      经过伊甸区和幸存者0区再次回收时,未被回收时,如果0区满了,则存放在这里。

养老区:

      如果数据在幸存者1区也满了的话,则会放到养老区。如果养老区也存放满了,则会报程序溢出异常。一般池对象在这个区域活跃。养老区的对象一般是活过15次以上的(jdk1.6之前),现在可以随意修改参数,最多不可以超过31次

一般来说,虚拟机的内存只能达到内存的1/4

  可是使用: Runtime.getRuntime().maxMemory()/1024/1024 得到最大的内存

  养老区的对象 调优:过大的jvm 内存的开销,而且对象的大量存活,不一定就会进入老年区;因为我们可以设置survivor和Eden的大小;以及可以设置threshold的值。threshold设置高一点(比如30),然后Eden设置8G,survivor设置500M.

永久存储区:

  是一个常驻内存区域,存放的都是运行时,所需要的jar包,例如:Tomcat运行时,必须要jre中的jar包。用于存放元数据,并不会被垃圾回收机制回收,当程序结束运行时,关闭虚拟机才会释放。

常量池:

   存放的是一些常量,不可改变的数据。例如 String a = "hello" hello就放在常量池中。

      

关于Jvm的见解(二)的更多相关文章

  1. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  2. JVM 系列(二)内存模型

    02 JVM 系列(二)内存模型 一.JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域.这些区域有各自的用途.创建/销毁时间: 一. 线程私有区域 线程私有数据区域生 ...

  3. JVM学习总结二——垃圾回收算法

    昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...

  4. JVM高级特性-二、JVM在堆中对象的分配、布局、访问过程

    前面介绍了jvm运行时数据区域后,下面讲解下对内存中数据的其他细节,看他们是如何创建.布局及访问的 一.对象的创建 1.对象的分配 对象的创建分配方式主要有两种:指针碰撞和空闲列表 指针碰撞: 假设堆 ...

  5. jvm学习笔记二(减少GC开销的建议)

    一:触发主GC(Garbage Collector)的条件 JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大.更值得关注的是主GC的触发条件,因为它对系统影响很明显.总 ...

  6. JVM深入理解<二>

    以下内容来自: http://www.jianshu.com/p/ac7760655d9d JVM相关知识详解 一.Java虚拟机指令集 Java虚拟机指令由一个字节长度的.代表某种特定含义的操作码( ...

  7. JVM笔记(二)JVM基本结构

    JVM基本结构 一.运行时内存区域 java虚拟机所管理的内存将会包括以下几个运行时内存区域. 1.程序计数器 Program Counter Register:可以看作当前线程(线程私有)所执行的字 ...

  8. 深入JVM系列(二)之GC机制、收集器与GC调优

    一.回想JVM内存分配 须要了解很多其它内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配 1.1.内存分配: 1.对象优先在EDEN分配 2.大对象直接进入老年代  3.长期存活的 ...

  9. JVM学习笔记(二):垃圾收集

    程序计数器. 虚拟机栈. 本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作. 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这 ...

随机推荐

  1. HikariCP重要参数配置

    概述 HikariCP是Spring Framework 5.0的默认数据库连接池,这得益于他的高性能.但是如果配置不当,数据库连接池也可能因影响到系统性能. 重要参数 maximum-pool-si ...

  2. 数据结构中数组反转与STL库Algorithm中的reverse

    数组是个基本的线性数据结构,其实是内存中的一个块,我们可以通过c++的new来分配一个数组 int* a= new int[5]; 然后填数组的每个元素 a[0]=1; a[1]=2; a[2]=6; ...

  3. vue中百度地图API的调用

    1.使用百度地图api需要使用jsonp,来获取百度api的返回,因为vue不自带jsonp所以需要下载 安装jsonp npm i vue-jsonp -S 引入jsop import Vue fr ...

  4. phpstorm安装步骤是什么?

    phpstorm的安装及其激活教程 1.phpstorm安装步骤: (1)下载地址:http://www.jetbrains.com/phpstorm/ 根据自己电脑的32or64位下载,下载完后就是 ...

  5. Spring Boot提供RESTful接口时的错误处理实践

    使用Spring Boot开发微服务的过程中,我们会使用别人提供的接口,也会设计接口给别人使用,这时候微服务应用之间的协作就需要有一定的规范. 基于rpc协议,我们一般有两种思路:(1)提供服务的应用 ...

  6. ios 11 系统CPU过高,xib中textfield使用导致出过高

    ios11 发布之后,作为开发肯定是第一时间进行了升级测试,全新的系统不免会带来这样那样的问题.项目中使用xib的小伙伴们会发现,项目的cpu使用率非常高,尤其是初始化的时候,并没有线程的操作,CPU ...

  7. 把图片在word中显示

    如下: //放入word中 #region word ThreadPool.QueueUserWorkItem(//使用线程池 (P_temp) =>//使用lambda表达式 { G_wa = ...

  8. javascript获取坐标/滚动/宽高/距离

    坐标(鼠标/触摸) event.screenX 鼠标/触摸,相对于显示屏的X坐标 event.screenY 鼠标/触摸,相对于显示屏的Y坐标 event.clientX 鼠标/触摸,相对于浏览器视口 ...

  9. 函数基础(一)(day10整理)

    目录 昨日内容 文件的基本应用 什么是文件 操作文件的流程 打开文件的三种模式 文件打开的两种方式 绝对路径和相对路径 绝对路径 相对路径 with管理文件上下文 文件的高级应用 新的打开文件的模式 ...

  10. 周总结 + for 循环 + 内置方法(day06整理)

    目录 周总结 一 计算机基础之编程 (一) 什么是编程语言 (二) 什么是编程 (三) 为什么编程 二 计算机五大组成 (一) CPU (1) 运算器 (2) 控制器 (二) 存储器 (1) 主存 ( ...