JVM的组成部分和基础运行参数

一 JVM的内部结构

1.JVM内部分为九大结构,如图:

  1)类加载子系统:负责从文件系统或是网络中加载Class信息,加载的信息存放在一块称之为方法去的内存空间。

  2)方法区(永久区):用于存放类的信息、常量信息、常量池信息、包括字符串字面量和数字常量等。(反射就是从这里读取类的信息)

  3)Java堆:在JVM启动的时间建立Java堆,它是Java程序最主要的内存上的工作区域。几乎所有的对象实例都存放在Java堆中(GC主要的负责对象),堆空间是所有线程共享的。

  4)直接内存:Java的NIO库允许Java程序使用直接内存,从而提高性能,通常直接内存速度会优于Java堆,读写频繁可能会使用到。

  5)Java栈:每个线程都有一个私有的栈,一个线程的Java栈在线程创建的时候被创建。Java栈中保存着局部变量、方法参数、Java的方法调用、返回值等。

  6)本地方法栈:本地方法栈和Java栈非常相似,最大不同为本地方法栈用于本地方法调用。JVM允许Java直接调用本地方法(JDK中用native修饰的方法就是调用的本地方法)。(通常用C编写)。

  7)垃圾收集系统(GC):垃圾收集系统是Java的核心,也是必不可少的,Java有一套自己进行垃圾清理的机制,使开发人员无需手工清理。

  8)PC寄存器:它是每个线程私有的空间,JVM会为每个线程创建单独的PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC寄存器会执行当前正在被执行的指令,如果是本地方法,则PC寄存器值为undefined,寄存器存放如当前环境指针、程序计数器、操作栈指针、计算的变量指针等信息。

  9)执行引擎:JVM最核心的组件,它负责执行虚拟机字节码。一般会先进行编译成机器码后执行。

二 辨清Java堆:

Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都存放在其中,并且Java堆完全是自动化管理的,通过垃圾回收机制,垃圾对象会自动清理,不需要显示地释放。

根据垃圾回收机制不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代,其中新生代存放新生的对象或者年龄不大的对象,老年代则存放老年对象。

新生代分为Eden(伊甸)区、s0区、s1区,s0和s1也被称为from和to区,他们是两块大小相等并且可以互换角色的空间。

绝大多数情况下,对象首先分配在Eden区,在一次新生代回收后,如果对象还活着,则会进入s0或是s1区,之后每次经过一次新生代回收,如果对象存活则它的年龄就加1,当对象达到一定年龄后,则进入老年代。

三 JVM运行参数:

1)堆分配参数:

  -XX:+PrintGC   //使用这个参数,虚拟机启动后,只要遇到GC就会自动打印日志。

  -XX:+UseSerialGC  //配置串行回收器

  -XX:+PrintGCDetails  //可以查看详细信息,包括各个区的情况。

  -Xms    //设置Java程序启动时初始堆大小,如-Xms20m,代表初始堆大小为20m。

  -Xmx    //设置Java程序能获得的最大堆大小

  -Xmn    //设置新生代大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大影响,新生代大小一般会设置为整个堆空间大小的1/3到1/4左右

  -XX:servivorRatio  //用来设置新生代中Eden空间和from/to空间的比例。含义: -XX:ServivorRatio=eden/from=eden/to

  -XX:NewRatio  //设置新生代和老年代的比例。含义:-XX:NewRatio=老年代/新生代

原文地址:https://www.cnblogs.com/programmlover/p/10352810.html

时间: 2024-11-01 17:06:11

JVM的组成部分和基础运行参数的相关文章

java基础---JVM内存管理以及内存运行机制学习总结

自己从网上搜资料拼接了一张JVM内存图:如下图所示: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的 方式去实 现),字节码解释器工作时就是通过改

JVM 运行参数 & 代码监控

1.Java代码监控 JDK提供java.lang.management包, 其实就是基于JMX技术规范,提供一套完整的MBean,动态获取JVM的运行时数据,达到监控JVM性能的目的. package com.agan.jvm; import java.lang.management.*; import java.util.Arrays; import java.util.List; public class JVMDemo { public static void main(String[]

JVM相关之JVM运行参数和内存模型

Jvm优化 了解下我们为什么要学习 JVM优化 掌握 jvm的运行参数以及参数的设置 掌握 jvm的内存模型(堆内存) 掌握 jamp命令的使用以及通过MAT工具进行分析 掌握定位分析内存溢出的方法 为什么要学习JVM优化 JVM被称为Java虚拟机,所有Java程序的运行都依赖于JVM 1.应用运行一段时间后突然停止,程序没有响应 2.服务器的CPU突然升高 3.在多线程应用下,如何去分配线程数量 ....................... 优化JVM目的是为了让程序运行的更快 JVM运行

java学习-----jvm的内存分配及运行机制

VM运行时数据区域: 根据<Java虚拟机规范(第二版)>的规定,JVM包括下列几个运行时区域: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的

JVM学习笔记:Java运行时数据区域

JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私有的,即每个线程各自都有自己的一份.绿色部分是各个线程共享的. 1.PC寄存器(The pc Register) (1)每一个Java线程都有一个PC寄存器. (2)PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息. (3)此内存区域是唯一一个在JV

Java运行参数详解

JRE版本 admindeMacBook-Pro:~ admin$ java -version java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) TIPS:JDK版本不一定等于JRE版本,这里查询的JRE版本. 标准选项运行参数 在命令行中输入java

“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数(转)

JVM的堆的内存, 是通过下面面两个参数控制的 -Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 -Xmx 是最大堆的大小 当最小堆占满后,会尝试进行GC,如果GC之后还不能得到足够的内存(GC未必会收集到所有当前可用内存),分配新的对象,那么就会扩展堆,如果-Xmx设置的太小,扩展堆就会失败,导致OutOfMemoryError错误提示. 实际上,细节不止于此, 堆还会被分成几个不同的区域,分别应用不同的GC算法 ------------------------

【JAVA学习】“-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数(转)

年轻代 年老代概念 http://jefferent.iteye.com/blog/1123677 JVM的堆的内存, 是通过下面面两个参数控制的 -Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 -Xmx 是最大堆的大小 当最小堆占满后,会尝试进行GC,如果GC之后还不能得到足够的内存(GC未必会收集到所有当前可用内存),分配新的对象,那么就会扩展堆,如果-Xmx设置的太小,扩展堆就会失败,导致OutOfMemoryError错误提示. 实际上,细节不止于此, 

WEKA运行参数修改(RunWeka.ini文件)

一般使用weka进行数据挖掘的时候会碰到两个问题,一是内存不够,二是libsvm使用不了,这时就需要重新配置RunWeka.ini文件,解决上述问题.查看RunWeka.ini原文如下: 1 # Contains the commands for running Weka either with a command prompt 2 # ("cmd_console") or without the command prompt ("cmd_default"). 3