为了账号安全,请及时绑定邮箱和手机立即绑定

请问该如何理解Java虚拟机栈?

/ 猿问

请问该如何理解Java虚拟机栈?

动漫人物 2019-09-13 11:10:36

如何理解Java虚拟机栈?


查看完整描述

4 回答

?
UYOU

例如我测试下来,页面后面还有:
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.ArrayIndexOutOfBoundsException: 0
org.apache.jsp.test_jsp._jspService(test_jsp.java:72)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

这后面的root cause才是重要的。

这里for循环5次显示file_name数组的内容,即d:/Tomcat/Jakarta-tomcat-4.0/webapps/root/下的*.jsp的数量,但是如果文件数小于5的话就会报错了。
建议改成 for(int i=0;i<file_name.length;i++) ...




查看完整回答
反对 回复 2019-09-17
?
千万里不及你

堆是堆(heap),栈是栈(stack),堆栈是栈。


栈中分配的是基本类型和自定义对象的引用。

堆中分配的是对象,也就是new出来的东西。                 被所有线程共享。

方法区/静态区 存放的是类信息和static变量、常量。      被所有线程共享。


也可以这么理解:堆是用来存放对象的,栈是用来运行程序的。

堆:java的垃圾回收器会自动的回收这些不用的数据。缺点是由于要动态的分配内存,存储效率会比较的慢。

栈:栈的优势是存取效率比较快,仅次于寄存器,栈数据可以共享。但缺点是栈中的数据大小和生存期的固定的,缺乏灵活性。

一般每个方法的调用都会独立有一个栈来保存对象的引用变量,在方法返回后,栈会清空,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。






JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

  • 栈区: 

  • 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),对象都存放在堆区中

  • 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

  • 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

  • 堆区: 

  • 存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)。

  • jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。

  • 方法区: 

  • 又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。


  • 这个“堆”并不是数据结构意义上的堆(Heap (data structure),一种有序的树),而是动态内存分配意义上的堆——用于管理动态生命周期的内存区域。


    JVM规范让每个Java线程拥有自己的独立的JVM栈,也就是Java方法的调用栈。

    JVM规范为了允许native代码可以调用Java代码,以及允许Java代码调用native方法,还规定每个Java线程拥有自己的独立的native方法栈。

    并不是说具体的JVM实现真的要给每个Java线程开两个独立的栈。以Oracle JDK / OpenJDK的HotSpot VM为例,它使用所谓的“mixed stack”——在同一个调用栈里存放Java方法的栈帧与native方法的栈帧,所以每个Java线程其实只有一个调用栈,融合了JVM规范的JVM栈与native方法栈这俩概念。


    JVM的堆被同一个JVM实例中的所有Java线程共享。它通常由某种自动内存管理机制所管理,这种机制通常叫做“垃圾回收”(garbage collection,GC)。JVM规范并不强制要求JVM实现采用哪种GC算法。


    linux 中一个进程的虚拟内存分布:



    以32位地址操作系统为例,一个进程可拥有的虚拟内存地址范围为0-2^32。分为两部分,一部分留给kernel使用(kernel virtual memory),剩下的是进程本身使用, 即图中的process virtual memory。



    一个程序本质上都是由 bss段、data段、text段三个组成的

    bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。

    在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。

    text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。




查看完整回答
反对 回复 2019-09-17
?
慕仙森

<% File dir=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root/");
FileJSP file_jsp=new FileJSP("jsp");
String file_name[]=dir.list(file_jsp);
for(int i=0;i<5;i++) out.println(file_name[i]);
%>
将以上的 dir 换一个名字,和
public boolean accept(File dir,String name)
{ return name.endsWith(str);
}中的dir冲突了





查看完整回答
反对 回复 2019-09-17
?
翻翻过去那场雪

Pageflie.sys问题,可以使用以下方法进行解决:

C盘有个Pageflie.sys隐藏系统文件,到底能不能删除?占用了很多的系统空间呢。

如果您的电脑在运行时内存不充足,并且这时候又需要有更多的内存来保证系统运行的效率,那么Windows就会用硬盘空间来模拟系统的内存。这就叫做虚拟内存,通常称为页面文件。也就是由于虚拟内存的设定在对应的系统目录下产生了pagefile.sys文件。综上所述,虚拟内存的设定对于您的电脑性能是有益无害的。所以这里建议大家还是保留虚拟内存。甚至可以扩大虚拟内存的容量。

当然,对于网民的疑惑我们的得到的结论是:“pagefile.sys”是页面交换文件,这个文件不能删除。网民之所以能看到也是由于将文件夹选项中的“隐藏受保护的操作系统文件”选项取消了。如果网民不想看到自行勾选即可轻松解决。

那么这个Pagefile.sys占用那么多系统空间是否真的必要呢?如何进行设置?

我们可以通过设置改变pageflie文件的大小和存放位置:

1、右键点击“我的电脑 - 属性”

2、然后在对话框的“高级”标签下单击“性能”下的“设置”按钮

3、在“性能选项”对话框中切换到“高级”标签下

4、再单击“虚拟内存”下的“更改”按钮,即可根据需要更改页面文件的大小

先选中c盘,然后选“无分页文件”,再点“设置”按钮;之后选中要 生成该文件的盘符,在下面点选“自定义大小”并输入合适的数值,此数值通常为物理内存的1.5倍,再单击“设置”,最后确定,重新启动电脑,该文件就在其他分区上了。

由于每个人实际操作与对电脑应用的需求不同,比如有些人要运行一些大型程序来完成工作,而有些人可能只是玩些小游戏,上网聊聊天,所以对虚拟内存的大小要求并不相同,于是我们就要因地制宜地精确设置虚拟内存空间的数值。

可牛杀毒软件免费下载后可以使用的的病毒查杀方式分为了“快速查杀/全盘扫描/自定义扫描”三种类型。在右侧则有“实时保护状态/安全状况/文件隔离区/专杀工具推荐”这四类信息。

可牛免费杀毒采用了双引擎同时查杀的形式。快速查杀的目标包括了“内存/服务与驱动/其他启动项/系统目录/临时目录”这几个病毒常驻之地。快速扫描速不错,在电脑中只需花费了51秒就能够扫描完毕。当用户进行二次扫描时,更会进行加速扫描,自动跳过已经认证为安全的文件,二次扫描用时2秒。“全盘扫描”目标则包含了“内存/服务与驱动/其他启动项/系统目录/临时目录/所有分区”, 扫描同样采取双引擎同时查杀。 更进一步的加强了对木马病毒的检出与清除能力!





查看完整回答
反对 回复 2019-09-17

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信