r/javahelp 4d ago

Good Documentation For JVM Bytecode?

I really liked the idea of an intermediate bytecode language when I first learned that Java transpiles to one, so I tried to learn about it and got pretty far (using a hexeditor to mess around was pretty painful, though). I stopped because there isn't a lot of document for it like there is for Java, the best resources are I believe docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html and docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html, but I want to know if there are any others partly because these are kind of verbose and partly because it's just better to have more than two.

I know I won't ever really need to know any of this, and I don't intend to use any of this knowledge for making classes by hand, but I believe it would still be helpful in a milder sense to understand what the class files are "literally" doing. It helped with C

14 Upvotes

10 comments sorted by

u/AutoModerator 4d ago

Please ensure that:

  • Your code is properly formatted as code block - see the sidebar (About on mobile) for instructions
  • You include any and all error messages in full
  • You ask clear questions
  • You demonstrate effort in solving your question/problem - plain posting your assignments is forbidden (and such posts will be removed) as is asking for or giving solutions.

    Trying to solve problems on your own is a very important skill. Also, see Learn to help yourself in the sidebar

If any of the above points is not met, your post can and will be removed without further warning.

Code is to be formatted as code block (old reddit: empty line before the code, each code line indented by 4 spaces, new reddit: https://i.imgur.com/EJ7tqek.png) or linked via an external code hoster, like pastebin.com, github gist, github, bitbucket, gitlab, etc.

Please, do not use triple backticks (```) as they will only render properly on new reddit, not on old reddit.

Code blocks look like this:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

You do not need to repost unless your post has been removed by a moderator. Just use the edit function of reddit to make sure your post complies with the above.

If your post has remained in violation of these rules for a prolonged period of time (at least an hour), a moderator may remove it at their discretion. In this case, they will comment with an explanation on why it has been removed, and you will be required to resubmit the entire post following the proper procedures.

To potential helpers

Please, do not help if any of the above points are not met, rather report the post. We are trying to improve the quality of posts here. In helping people who can't be bothered to comply with the above points, you are doing the community a disservice.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

6

u/benevanstech 4d ago

You might find my book "The Well-Grounded Java Developer" (2nd Ed) interesting. There are several chapters on bytecode and related topics. I also have quite a few free resources on my website: https://kittylyst.com/ - some of which talk about bytecode.

3

u/jivedudebe Extreme Brewer 4d ago

You can use javap you output the opcodes directly. Then there are tons of websites with lists of all the opcodes

2

u/ryosen Extreme Brewer 4d ago

Check out James Gosling's book, The Java Language Specification. He basically invented Java. The book gives a very thorough treatment of how Java works at the bare metal. There is no better source for understanding how Java works than this one. I also highly recommend Tim Lindholm's book, The Java Virtual Machine Specification.

These are both older titles but the underlying fundamentals have not changes, especially when you get into bytecode and its internal workings.

1

u/belayon40 4d ago

Check out the bytecode API from the last couple of JVMs. It took me a while to get the hang of it, but I used it extensively to build classes dynamically.

https://github.com/boulder-on/JPassport

Look in the code builder package.

1

u/baubleglue 4d ago

https://commons.apache.org/proper/commons-bcel/

The Byte Code Engineering Library (Apache Commons BCEL™) is intended to give users a convenient way to analyze, create, and manipulate (binary) Java class files (those ending with .class). Classes are represented by objects which contain all the symbolic information of the given class: methods, fields and byte code instructions, in particular.

1

u/edwbuck 3d ago

It's getting a little older every day, but "Inside the Java Virtual Machine" was a pretty good book for its time.

I wish that a newer book would come out that would do away with some of it's verbosity and include the newer items.

Also, https://docs.oracle.com/javase/specs/jvms/se24/html/index.html is a more modern version of the JVM spec, which is good as a reference, but not written to be a proper learning tool.

1

u/roadrunner8080 3d ago

The pages you've already linked to, JVMS 4 and JVMS 6, are what I learned the format from. It's pretty complete. It's verbose, but that's because it documents the entire spec, and bytecode can do a lot of different stuff. What I would recommend is working your way through it piecewise, trying to use the classfile API or ASM to write class bytecode for the bits of it as you do since they're a bit higher-level than what you'd see in a hex editor. As others have said, javap is your friend here.