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

  栈呢,也叫作栈内存,主要管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. Java对象是怎么创建的(通过对象的创建,了解JVM内存结构)

    在代码层面,我们通过new关键字创建一个对象: Object obj=new Object(); 而虚拟机中,创建一个对象,则经过了许多环节,JVM的内存结构可以通过另一篇文章了解:一个“Hello ...

  2. 素数与Miller-Rabin测试

    素数及其性质 素数又称质数.指整数在一个大于 111 的自然数中,除了 111 和此整数自身外,没法被其他自然数整除的数. 性质1 有无穷多个素数. 证明: 用反证法.设已知的最大素数为 PPP,考虑 ...

  3. [Luogu3069][USACO13JAN]牛的阵容Cow Lineup

    题目描述 Farmer John's N cows (1 <= N <= 100,000) are lined up in a row. Each cow is identified by ...

  4. .Net Core 3.0 IdentityServer4 快速入门

    .Net Core 3.0 IdentityServer4 快速入门 一.简介 IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架. 将 ...

  5. opencv::处理边缘

    卷积边界问题 图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理. 处理边缘 ...

  6. PowerShell渗透--Empire(二)

    权限提升 Bypass UAC usemodule powershell/privesc/bypassuac 设置listener execute list查看 usemodule powershel ...

  7. pytest7-多个fixtures执行顺序

    举例: import pytest order = [] @pytest.fixture(scope='session') def s1(): order.append("s1") ...

  8. 【Autofac打标签模式】PropertySource和Value

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki *:first-child { margin-to ...

  9. 【原创】(九)Linux内存管理 - zoned page frame allocator - 4

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  10. 使用css把placeholder值渐渐消失

    复制过去就行了,不要问我为什么,就两个字爽快input:focus {outline: none; } input:focus::-webkit-input-placeholder {text-ind ...