关于Jvm的见解

Posted anonymityning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Jvm的见解相关的知识,希望对你有一定的参考价值。

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

  栈呢,也叫作栈内存,主要管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的见解的主要内容,如果未能解决你的问题,请参考以下文章

关于获取浏览器参数的见解

关于XSS绕过的一些见解

关于$.extend的一些见解

关于如何使画布绘图不在另一个之上的任何见解? [复制]

关于php缓存技术一些见解

关于ORM的数据库操作见解