zoukankan      html  css  js  c++  java
  • JVM学习(二)

      Java中的内存的划分可以用下图来表示:

      

      程序计数器:每一个线程都有一个程序计数器,记录需要执行的下一条指令。

      HootSpot虚拟机中,不区分虚拟机栈和本地方法栈,统一称为栈。虚拟机栈和本地方法栈也是线程私有的,多个线程之间不会互相影响。

      虚拟机栈记录了线程的局部变量、部分结果,参与方法的调用与返回。本地方法栈用于管理本地方法,Java中的本地方法指的使用C语言实现的部分。

      堆是新对象在内存中的存储区域,也是JVM垃圾回收的主要区域。JVM的垃圾回收主要就是堆和方法区(持久代)。

      方法区主要存储的是类的元数据和一些常量数据。需要注意的是,方法区不包含在我们通常所说的堆中。方法区也成为持久代,但其中存储的数据并不是永久的,也是会被回收的。

      JVM的垃圾回收主要就是堆和方法区,需要判断对象是否还存在有效地引用,没有有效引用时,对象将被回收。程序计数器和栈所占的内存,当线程结束时,所对应的内存也就变为了无用内存。

      我们可以用-Xss指定栈的大小,栈的大小决定了方法可以调用的深度。对于方法而言,参数越多、局部变量越多,所占用内存越大,方法可以调用的深度就越小。

      应当将-Xms和-Xmx的大小设置为相等的大小,这样可以减少GC的次数和耗时。

      -Xmn可以设置新生代的大小,新生代的大小一般设置为整个堆内存的1/4-1/3。

      持久代的大小一般设置为64M或者128M就已经足够,如过发生了持久代溢出,需要使持久代支持GC。

        -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC XX:+CMSClassUnloadingEnabled的设置将使得持久代支持GC。

      如过系统确实需要支持大量线程的并发,可以设置一个较小的堆和较小的栈,这样可以支持生成更多的线程。

      新生代垃圾回收器和老年代垃圾回收器配合使用的规则如下,不是所有的都可以配合使用的。

      

       -XX:+UseParallelGC 指定在 New Generation 使用 parallel collector 并行收集, 暂停 app threads,同时启动多个垃圾回收 thread, 不能和 CMS gc 一起使用。 系统吐量优先 , 但是会有较长长时间的 app pause, 后台系统任务可以使用此 gc。

            -XX:+UseParNewGC 指定在 New Generation 使用 parallel collector,是 UseParallelGC 的 gc 的升级版本有更好的性能或者优点, 可以和 CMS gc 一起使用。

       -XX:+UseParallelOldGC:新生代和老年代都使用并行回收收集器,和-XX:+UseParallelGC一样关注的是吞吐量,交互性应用不适用。  -XX:MaxGCPauseMillis:设置停顿时间不超过多少。 -XX:GCTimeRatio:设置吞吐量大小。关注吞吐量的gc可以设置以控制吞吐量。

       -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用cms。

       -XX:ParallelGCThreads指定,一般最好与cpu数量相当。cpu小于8个时和cpu数量一样,cpu大于8个时 3+[(5*cpu/8)]。

      CMS不是独占式垃圾回收器,垃圾回收的同时,可能还会不断地产生新的垃圾。因此CMS不应等到老年代内存不足时才进行垃圾回收,而是应该通过-XX:CMSInitiatingOccupancyFracation制定回收的阈值,默认是68,即老年代的68%被占满时,CMS就开始了垃圾回收的工作。

      CMS基于的是标记-清除,没有压缩的步骤,时间久了会产生大量的碎片,因此可以设置-XX:CMSFullGCsBeforeCompaction进行多少次CMS回收之后进行一次老年代的压缩操作。

      

      -XX:PretenureSizeThreshold:设置对象大于这个大小时将不在新生代上分配,而是直接在老年代上分配。

      -XX:MaxTenuringThreshold:设置新生代需要经过多少次垃圾回收才能进入到老年代,默认值是8.

      

      当系统出现长时间的莫名其妙的停顿,就需要考虑是否是垃圾回收器的选择出现了问题。

     

      还可以设置一些参数,指定当jvm crash之后的一些动作。 

      1. 生成error 文件的路径:你可以通过参数设置-XX:ErrorFile=/path/hs_error%p.log, 默认是在java运行的当前目录 [default: ./hs_err_pid%p.log]

      2. 参数-XX:OnError  可以在crash退出的时候执行命令,格式是-XX:OnError=“string”,  <string> 可以是命令的集合,用分号做分隔符, 可以用"%p"来取到当前进程的ID. 例如:

         -XX:OnError="pmap %p"                // show memory map

         -XX:OnError="gcore %p; dbx - %p"     // dump core and launch debugger

     

     
  • 相关阅读:
    tar命令,vi编辑器
    Linux命令、权限
    Color Transfer between Images code实现
    利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
    Matrix Factorization SVD 矩阵分解
    ZOJ Problem Set
    Machine Learning
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4575470.html
Copyright © 2011-2022 走看看