首页 > 编程知识 正文

JVM内存结构,java虚拟机内存模型

时间:2023-05-04 17:03:34 阅读:166887 作者:1873

笔记大纲1、jvm内存结构图2、jvm线程共享和专用内存分区结构图3、堆和堆栈功能、内存大小、线程共享专用比较4、jvm运行结构图5、线程安全本质时间

3358www.Sina.com/多线程共享内存区域: JVM内存结构图(JDK1.6)每个线程内存:3358 www.Sina.com/http://www.Sina.com/com 3358www.Sina.com/线程专用、生命周期和线程。 每个方法在执行的同时为方法区、堆。创建堆栈帧。 方法的执行对应于堆栈帧被堆栈到虚拟机堆栈中并被堆栈的进程。 堆栈中存储了各种基本数据类型和对对象的引用; 3358www.Sina.com/本地方法堆栈包含native方法的信息,当JVM创建的线程调用native方法时,JVM将不再在虚拟机堆栈中创建堆栈帧。 http://www.Sina.com/http://www.Sina.com/Java堆涉及内存分配(new关键字、反射等)和回收(回收算法、收集器等) 存储加载到虚拟机中的类信息、常量(zdy )、(123 )等)、静态变量)、静态变量)等数据。 3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /用于存储编译时生成的各种字面(zdy )、) 123等)和符号引用java栈、本地方法栈、程序计数器。不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区。 1 )使用NIO时,此空间使用很频繁,可以直接在java堆中通过directByteBuffer对象引用和操作2 )此内存不受java堆大小的限制,但受本机总内存的限制,maxdirect

程序计数器:

3358www.Sina.com/1 )堆和栈的功能差异将方法调用的过程存储为栈框架,将方法调用的过程存储为http://www.Sina.com/http://www.Sina.com 存储当前线程执行的字节码的行号指示器的堆存储器,不管是java 栈:成员变量、局部变量还是类变量,它们指向的对象都存储在堆存储器中; 2 )堆和栈的线程共享和线程专用区别为存储局部变量表,操作数栈,动态链接,方法出口等信息,每个线程都有栈内存,其存储的变量只能在所属的线程上看到。 也就是说,堆栈存储器可以理解为本地方法栈:JVM只是简单地动态链接并直接调用native方法堆中的对象可以由所有线程访问。 3 )空间大小堆栈的内存必须远远小于堆内存,堆栈的深度有限制,如果递归没有立即弹出,很可能会发生StackOverFlowError问题。 可以通过-Xss选项设置堆栈内存的大小堆:。 -Xms选项设置堆开始时的大小,-Xmx选项设置堆的最大值

方法区:各线程独占占有的存储器区域为:程序计数器、java堆栈、本地方法堆栈线程共享区域:堆存储器、方法区域。 JDK1.8删除了方法区域)

(jdk1.8已经将方法区去掉了,将方法区移动到直接内存)线程安全的本质是,当多个线程操作同一个堆存储器中的Count变量时,每个线程在线程内部制作这个堆存储器的Count变量的副本,线程中的所有操作都是这个Count变量此时,如果其他线程操作此堆内存中的Count变量并更改了Count值,则此线程看不到它。 当前线程操作Count变量并将值从复制区域写入主内存(堆内存)时,会复盖其他线程操作Count变量的结果,从而引起线程的安全性问题。

对于33558www.Sina.com/JDK1.6,jDK1.7将运行时间常量池从方法区删除到堆内存中。 对于JDK1.6,JDK1.8直接添加运行时常量池:,并在本地内存中添加运行时常量池是方法区的一部分

>元数据空间。运行时常量池仍然在堆中。元数据区存放类加载信息。
JDK1.8为什么要移除方法区 1)永久代来存储类信息、常量、静态变量等数据不是个好主意, 很容易遇到内存溢出的问题.JDK8的实现中将类的元数据放入 native memory, 将字符串池和类的静态变量放入java堆中. 可以使用MaxMetaspaceSize对元数据区大小进行调整; 2)对永久代进行调优是很困难的,同时将元空间与堆的垃圾回收进行了隔离,避免永久代引发的Full GC和OOM等问题;
JVM内存参数设定 -Xms 初始堆内存大小 -Xmx 最大堆内存大小 -Xss 单个线程栈大小 -XX:NewSize 初始lsdgs代堆大小 -XX:MaxNewSize 生代最大堆大小 -XX:PermSize 方法区初始大小(JDK1.7及以前) -XX:MaxPermSize 方法区最大大小(JDK1.7及以前) -XX:MetaspaceSize 元数据区初始值(JDK1.8) -XX:MaxMetaspaceSize 元数据区最大值(JDK1.8) 参数设置示例 jdk1.7 windows设置tomcat的catalina.bat set JAVA_OPTS=-Xms1024m -Xmx1024m -Xss1m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=256m -XX:MaxNewSize=256m jdk1.8 windows设置tomcat的catalina.bat set JAVA_OPTS=-Xms1024m -Xmx1024m -Xss1m -XX:MetaspaceSize=128m -XX:MAXMetaspaceSize=256m -XX:NewSize=256m -XX:MaxNewSize=256m
jdk1.7 linux设置tomcat的catalina.sh JAVA_OPTS=-Xms1024m -Xmx1024m -Xss1m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=256m -XX:MaxNewSize=256m jdk1.8 linux设置tomcat的catalina.sh JAVA_OPTS=-Xms1024m -Xmx1024m -Xss1m -XX:MetaspaceSize=128m -XX:MAXMetaspaceSize=256m -XX:NewSize=256m -XX:MaxNewSize=256m

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。