java接口内存

java服务提供查询接口给外部调用,接口中所用的对象的内存什么时候释放?

emmm,应该是看应用B的代码是怎样写的吧。java的对象内存释放是由java虚拟机中GC管理的,对象什么时候被销毁是看GC的垃圾回收策略。

java接口内存

请问JAVA中抽象类和接口是以什么形式存在于内存中的?

我没看到相关的书,不过我觉得它和普通的实现类应该没有什么差别,这些东西就好像C里面的函数指针一样,当我们要调用时需要先找到对象或类,然后把方法换算成一个指针的偏移量,对于静态方法,这个偏移量就是基于类的固定不变的,在编译时就知道偏移量,而对于非静态的,它是基于这个对象的其实的类型的,因为非静态的方法有被覆盖的可能性(虚函数调用),需要某种规则查找真实对应的方法来得到它在代码区的偏移量,这跟C++动态绑定一样。

当然了,我这猜想都是基于概念层的,具体实现的细节并不清楚。只知道 JVM 也有类似的代码区,常量区之类的概念。

深入探索Java工作原理:JVM,内存回收及其他

Java语言引入了Java虚拟机 具有跨平台运行的功能 能够很好地适应各种Web应用 同时 为了提高Java语言的性能和健壮性 还引入了如垃圾回收机制等新功能 通过这些改进让Java具有其独特的工作原理

.Java虚拟机

Java虚拟机(Java Virtual Machine JVM)是软件模拟的计算机 它可以在任何处理器上(无论是在计算机中还是在其他电子设备中)安全兼容地执行保存在 class文件中的字节码 Java虚拟机的 机器码 保存在 class文件中 有时也可以称之为字节码文件

Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行 Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行 因此在运行时 Java源程序需要通过编译器编译成为 class文件

Java虚拟机的建立需要针对不同的软硬件平台来实现 既要考虑处理器的型号 也要考虑操作系统的种类 由此在SPARC结构 X 结构 MIPS和PPC等嵌入式处理芯片上 在UNIX Linux Windows和部分实时操作系统上都可实现Java虚拟机

.无用内存自动回收机制

在程序的执行过程中 部分内存在使用过后就处于废弃状态 如果不及时进行回收 很有可能会导致内存泄漏 进而引发系统崩溃 在C++语言中是由程序员进行内存回收的 程序员需要在编写程序时把不再使用的对象内存释放掉 这种人为管理内存释放的方法往往由于程序员的疏忽而致使内存无法回收 同时也增加了程序员的工作量 而在Java运行环境中 始终存在着一个系统级的线程 专门跟踪内存的使用情况 定期检测出不再使用的内存 并自动进行回收 避免了内存的泄露 也减轻了程序员的工作量

.代码安全性检查机制

安全和方便总是相对矛盾的 Java编程语言的出现使得客户端计算机可以方便地从网络上上传或下载Java程序到本地计算机上运行 但是如何保证该Java程序不携带病毒或者没有其他危险目的呢?为了确保Java程序执行的安全性 Java语言通过Applet程序来控制非法程序的安全性 也就是有了它才确保Java语言的生存

Java字节码的执行需要经过以下 个步骤

( )由类装载器(class loader)负责把类文件( class文件)加载到Java虚拟机中 在此过程需要检验该类文件是否符合类文件规范

( )字节码校验器(bytecode verifier)检查该类文件的代码中是否存在着某些非法操作 例如Applet程序中写本地计算机文件系统的操作

( )如果字节码校验器检验通过 由Java解释器负责把该类文件解释成为机器码进行执行

注意

Java虚拟机采用 沙箱 运行模式 即把Java程序的代码和数据都限制在一定内存空间里执行 不允许程序访问该内存空间以外的内存 如果是Applet程序 还不允许访问客户端机器的文件系统

Java的运行环境

无论哪种语言都需要有它特定的运行环境 也就是平台 Java语言同样不例外 但是如何理解Java程序与硬件环境无关呢?

几乎所有的语言都需要通过编译或者解释才可以被计算机执行 但是Java有一点不同 它同时需要这两个过程 其实 也正是因为这个原因才使Java这种语言具有了平台无关性 当完成一个Java源程序后 首先 通过Java翻译程序将它编译成一种叫做字节码的中间代码 然后再由Java平台的解释器将它转换成为机器语言来执行 这一平台的核心就是JVM

Java的编译过程与其他的语言不同 像C++这样的语言 在编译时它是与计算机的硬件平台信息密不可分的 编译程序通过查表将所有指令的操作数和操作码等转换成内存的偏移量 即程序运行时的内存分配方式 目的是保证程序正常运行 而Java却是将指令转换成为一种 class的文件 这种文件不包含硬件的信息 需要执行时只要经过安装有JVM的机器进行解释 创建内存分配后再通过查表来确定一条指令所在的地址 这样就有效地保证了Java的可移植性和安全性

Java平台具有这样的特性和它的结构有关 通常一个程序运行的平台是一个硬件或者软件运行的环境 目前比较流行的是Windows XP Linux Solaris和MacOS Java的平台不太一样 它由两个部分组成 即JVM和应用程序设计接口

.JVM

JVM是Java平台的核心 为了让编译产生的字节码能更好地解释与执行 因此把JVM分成了 个部分 JVM解释器 指令系统 寄存器 栈 存储区和碎片回收区

◆JVM解释器 即这个虚拟机处理字段码的CPU

◆JVM指令系统 该系统与计算机很相似 一条指令由操作码和操作数两部分组成 操作码为 位二进制数 主要是为了说明一条指令的功能 操作数可以根据需要而定 JVM有多达 种不同的操作指令

◆寄存器 JVM有自己的虚拟寄存器 这样就可以快速地与JVM的解释器进行数据交换 为了功能的需要 JVM设置了 个常用的 位寄存器 pc(程序计数器) optop(操作数栈顶指针) frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)

◆JVM栈 指令执行时数据和信息存储的场所和控制中心 它提供给JVM解释器运算所需要的信息

◆存储区 JVM存储区用于存储编译过后的字节码等信息

◆碎片回收区 JVM碎片回收是指将使用过的Java类的具体实例从内存进行回收 这就使得开发人员免去了自己编程控制内存的麻烦和危险 随着JVM的不断升级 其碎片回收的技术和算法也更加合理 JVM 版后产生了一种叫分代收集技术 简单来说就是利用对象在程序中生存的时间划分成代 以此为标准进行碎片回收

.Java应用程序设计接口

Java Application Programming Interface简称Java API 其中文名为Java应用程序设计接口 它是一个软件集合 其中有许多开发时所需要的控件 可以用它来辅助开发

lishixinzhi/Article/program/Java/hx/201311/26733

Java中抽象类和接口在内存中存储位置在哪

类的实例方法在内存中是只有一份,不过肯定不会是第一个对象中,如果是第一个对象的话,那么当第一个对象被销毁的时候,那么后面的对象就永远无法调用了… 类的实例方法存在一个专门的区叫方法区,事实上类刚装载的时候就被装载好了,不过它们在”睡眠

java接口开合浪费资源吗

浪费资源。

java时个简单的原始应用程序,应该在其中实现所有最佳实践,在一个广为人知的框架上也浪费了65%的内存,开合后则更加浪费资源。

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为。

怎么获取 Java 程序使用的内存

首先

创建一个Bean用来存贮要得到的信

public class MonitorInfoBean {

/** 可使用内存. */

private long totalMemory;

/** 剩余内存. */

private long freeMemory;

/** 最大可使用内存. */

private long maxMemory;

/** 操作系统. */

private String osName;

/** 总的物理内存. */

private long totalMemorySize;

/** 剩余的物理内存. */

private long freePhysicalMemorySize;

/** 已使用的物理内存. */

private long usedMemory;

/** 线程总数. */

private int totalThread;

/** cpu使用率. */

private double cpuRatio;

public long getFreeMemory() {

return freeMemory;

}

public void setFreeMemory(long freeMemory) {

this.freeMemory = freeMemory;

}

public long getFreePhysicalMemorySize() {

return freePhysicalMemorySize;

}

public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {

this.freePhysicalMemorySize = freePhysicalMemorySize;

}

public long getMaxMemory() {

return maxMemory;

}

public void setMaxMemory(long maxMemory) {

this.maxMemory = maxMemory;

}

public String getOsName() {

return osName;

}

public void setOsName(String osName) {

this.osName = osName;

}

public long getTotalMemory() {

return totalMemory;

}

public void setTotalMemory(long totalMemory) {

this.totalMemory = totalMemory;

}

public long getTotalMemorySize() {

return totalMemorySize;

}

public void setTotalMemorySize(long totalMemorySize) {

this.totalMemorySize = totalMemorySize;

}

public int getTotalThread() {

return totalThread;

}

public void setTotalThread(int totalThread) {

this.totalThread = totalThread;

}

public long getUsedMemory() {

return usedMemory;

}

public void setUsedMemory(long usedMemory) {

this.usedMemory = usedMemory;

}

public double getCpuRatio() {

return cpuRatio;

}

public void setCpuRatio(double cpuRatio) {

this.cpuRatio = cpuRatio;

}

}

之后,建立bean的接口

public interface IMonitorService {

public MonitorInfoBean getMonitorInfoBean() throws Exception;

}

然后,就是最关键的,得到cpu的利用率,已用内存,可用内存,最大内存等信息。

import java.io.InputStreamReader;

import java.io.LineNumberReader;

import sun.management.ManagementFactory;

import com.sun.management.OperatingSystemMXBean;

import java.io.*;

import java.util.StringTokenizer;

/**

* 获取系统信息的业务逻辑实现类.

* @author GuoHuang

*/

public class MonitorServiceImpl implements IMonitorService {

private static final int CPUTIME = 30;

private static final int PERCENT = 100;

private static final int FAULTLENGTH = 10;

private static final File versionFile = new File(“/proc/version”);

private static String linuxVersion = null;

/**

* 获得当前的监控对象.

* @return 返回构造好的监控对象

* @throws Exception

* @author GuoHuang

*/

public MonitorInfoBean getMonitorInfoBean() throws Exception {

int kb = 1024;

// 可使用内存

long totalMemory = Runtime.getRuntime().totalMemory() / kb;

// 剩余内存

long freeMemory = Runtime.getRuntime().freeMemory() / kb;

// 最大可使用内存

long maxMemory = Runtime.getRuntime().maxMemory() / kb;

OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory

.getOperatingSystemMXBean();

// 操作系统

String osName = System.getProperty(“os.name”);

// 总的物理内存

long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;

// 剩余的物理内存

long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;

// 已使用的物理内存

long usedMemory = (osmxb.getTotalPhysicalMemorySize() – osmxb

.getFreePhysicalMemorySize())

/ kb;

// 获得线程总数

ThreadGroup parentThread;

for (parentThread = Thread.currentThread().getThreadGroup(); parentThread

.getParent() != null; parentThread = parentThread.getParent())

;

int totalThread = parentThread.activeCount();

double cpuRatio = 0;

if (osName.toLowerCase().startsWith(“windows”)) {

cpuRatio = this.getCpuRatioForWindows();

}

else {

cpuRatio = this.getCpuRateForLinux();

}

// 构造返回对象

MonitorInfoBean infoBean = new MonitorInfoBean();

infoBean.setFreeMemory(freeMemory);

infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);

infoBean.setMaxMemory(maxMemory);

infoBean.setOsName(osName);

infoBean.setTotalMemory(totalMemory);

infoBean.setTotalMemorySize(totalMemorySize);

infoBean.setTotalThread(totalThread);

infoBean.setUsedMemory(usedMemory);

infoBean.setCpuRatio(cpuRatio);

return infoBean;

}

private static double getCpuRateForLinux(){

InputStream is = null;

InputStreamReader isr = null;

BufferedReader brStat = null;

StringTokenizer tokenStat = null;

try{

System.out.println(“Get usage rate of CUP , linux version: “+linuxVersion);

Process process = Runtime.getRuntime().exec(“top -b -n 1”);

is = process.getInputStream();

isr = new InputStreamReader(is);

brStat = new BufferedReader(isr);

if(linuxVersion.equals(“2.4”)){

brStat.readLine();

brStat.readLine();

brStat.readLine();

brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());

tokenStat.nextToken();

tokenStat.nextToken();

String user = tokenStat.nextToken();

tokenStat.nextToken();

String system = tokenStat.nextToken();

tokenStat.nextToken();

String nice = tokenStat.nextToken();

System.out.println(user+” , “+system+” , “+nice);

user = user.substring(0,user.indexOf(“%”));

system = system.substring(0,system.indexOf(“%”));

nice = nice.substring(0,nice.indexOf(“%”));

float userUsage = new Float(user).floatValue();

float systemUsage = new Float(system).floatValue();

float niceUsage = new Float(nice).floatValue();

return (userUsage+systemUsage+niceUsage)/100;

}else{

brStat.readLine();

brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

tokenStat.nextToken();

String cpuUsage = tokenStat.nextToken();

System.out.println(“CPU idle : “+cpuUsage);

Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf(“%”)));

return (1-usage.floatValue()/100);

}

} catch(IOException ioe){

System.out.println(ioe.getMessage());

freeResource(is, isr, brStat);

return 1;

} finally{

freeResource(is, isr, brStat);

}

}

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月27日 17:07:23
下一篇 2024年3月27日 17:16:02

相关推荐

  • 深入java虚拟机pdf,深入java虚拟机 中村成洋 pdf

    在linux环境下,java怎么实现从word格式转换为pdf格式 //设置当前使用的打印机,我的Adobe Distiller打印机名字为 Adobe PDF wordCom.setProperty( ActivePrinter , new Variant( Adobe PDF ));//设置printout的参数,将word文档打印为postscript…

    2024年5月23日
    4400
  • java截取指定长度字符串,java截取指定字符串之后的

    java中如何截取字符串中的指定一部分 第一个参数是开始截取的字符位置。(从0开始)第二个参数是结束字符的位置+1。(从0开始)indexof函数的作用是查找该字符串中的某个字的位置,并且返回。 int end);截取s中从begin开始至end结束时的字符串,并将其赋值给s;split讲解:java.lang.string.split split 方法 将…

    2024年5月23日
    4200
  • java绑定一个端口,java使用端口

    java如何多个service共用一个端口 你如果有多个项目的话,你可以把多个项目放到一个tomcat里面,这样端口相同使用项目名称来进行区分项目。你如果非要使用同一个,你也可以配置不同的域名导向不同的项目。就是访问的域名不同转接到的项目不同。 如果需要同时启动多个程序,要么修改tomcat的配置文件中的监听端口。要么修改jar包程序的监听端口。不能在一台服…

    2024年5月23日
    3400
  • java多线程并发编程基础,Java多线程并发执行返回

    电脑培训分享Java并发编程:核心理论 电脑培训发现本系列会从线程间协调的方式(wait、notify、notifyAll)、Synchronized及Volatile的本质入手,详细解释JDK为我们提供的每种并发工具和底层实现机制。 人们开始意识到了继承的众多缺点,开始努力用聚合代替继承。软件工程解决扩展性的重要原则就是抽象描述,直接使用的工具就是接口。接…

    2024年5月23日
    4600
  • 自学java找工作,自学java找工作需要包装简历吗

    自学java学多久可以找到工作 1、自学Java至少需要一年以上的时间才能达到找工作的水平。报班培训四到六个月的时间就可以找到一份不错的工作。 2、自学Java至少需要一年以上的时间才能达到找工作的水平。 3、如果要想找到一份Java相关的工作,需要至少学习5-6个月时间才能就业。Java开发需要掌握一些基础的编程语言知识,比如掌握面向对象的编程思想、基本的…

    2024年5月23日
    4300
  • java左移右移,java 左移

    java位移问题 1、思路:直接用Integer类的bit运算操作。 2、移位操作:左移:向左移位,符号后面的数字是移了多少位,移的位用0补齐,例如2进制数01111111左移一位后变为11111110,移位是字节操作。 3、Java 位运算 Java 位运算[转]一,Java 位运算表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的…

    2024年5月23日
    4100
  • java技术规范,java规范性要求

    现在主流的JAVA技术是什么? java最流行开发技术程序员必看 1 、Git Git一直是世界上最受欢迎的Java工具之一,也是Java开发人员最杰出的工具之一。Git是一个开源工具,是-种出色的分布式版本控制解决方案。 (1).Java基础语法、数组、类与对象、继承与多态、异常、范型、集合、流与文件、反射、枚举、自动装箱和注解。(2).Java面向对象编…

    2024年5月23日
    4000
  • javasocket编程,Java socket编程中,禁用nagle算法的参数

    Java进行并发多连接socket编程 1、Java可利用ServerSocket类对外部客户端提供多个socket接口。基本的做法是先创建一个ServerSocket实例,并绑定一个指定的端口,然后在这个实例上调用accept()方法等待客户端的连接请求。 2、Socket socket=server.accept(0;Thread handleThrea…

    2024年5月23日
    4600
  • java死亡,java死代码是什么意思

    我的世界传送回死亡点指令是什么? 1、下面就让我们一起来了解一下吧:我的世界回到死的地方的指令是输入/back,就可以回到死亡地点了,当然也可以看信标,因为死亡后会有一道光集中在死亡点,只要循着光就可以找到目的地了。 2、在服务器中的指令 首先打开指令台,在指令行输入“/back”就可以回到自己的死亡地点了。在单人游戏中的指令 在单人游戏中,您无法直接返回到…

    2024年5月23日
    4800
  • myeclipse能部署java工程么,myeclipse支持jdk18

    myeclipse如何建java文件 1、点击【File】—【New】–【Class】在如下界面,输入Class的名字,如Test,点击【Finish】。Test.java文件创建成功。 2、点击【File】—【New】–【Class】 在如下界面,输入Class的名字,如Test,点击【Finish】。 Te…

    2024年5月23日
    3900

发表回复

登录后才能评论



关注微信